Lemmatize lebih cepat (PyMorphy2, PyMystem3 dan beberapa sihir)

Saya bekerja sebagai programmer, termasuk pembelajaran mesin dalam kaitannya dengan analisis teks. Saat memproses bahasa alami, persiapan awal dokumen diperlukan, dan salah satu metodenya adalah lemasiisasi - membawa semua kata teks ke bentuk normal, dengan mempertimbangkan konteksnya.

Baru-baru ini, kami dihadapkan dengan masalah biaya waktu yang besar untuk proses ini. Dalam tugas khusus ada lebih dari 100.000 dokumen, panjang rata-rata sekitar 1000 karakter, dan itu perlu untuk menerapkan pemrosesan pada komputer lokal biasa, dan bukan pada server kami untuk perhitungan. Kami tidak dapat menemukan solusi di Internet, tetapi kami menemukannya sendiri, dan saya ingin membagikannya - untuk menunjukkan analisis komparatif dari dua perpustakaan lemmatization paling populer di artikel ini.



Pymorphy2


Salah satu yang paling populer adalah PyMorphy2 - ditemukan di hampir setiap solusi yang dapat ditemukan di jaringan. Kami juga menggunakan perpustakaan ini, dan itu menunjukkan dirinya dengan sempurna, sampai diperlukan untuk melakukan lemmatization untuk seluruh database (seperti yang saya tulis di atas, ini lebih dari 100 ribu dokumen kecil). Untuk menganalisis volume dokumen seperti itu, PyMorphy2 akan memakan waktu hampir 10 jam, sementara prosesor memuat selama ini rata-rata sekitar 30% (Intel Core i7 7740X).

Pymystem3


Dalam mencari solusi lain, kami menganalisis perpustakaan dari Yandex PyMystem3, tetapi hasilnya hampir dua kali lebih buruk (dalam waktu) daripada PyMorphy2: butuh 16 jam untuk memproses 100 ribu dokumen.

Beberapa keajaiban


Tampaknya aneh bagi kami bahwa beban prosesor hampir nol. Aneh juga bahwa untuk mendapatkan hasil dari satu teks, bahkan yang besar (3-4 ribu karakter), PyMystem3 membutuhkan waktu sekitar 1 detik. Oleh karena itu, kami memutuskan untuk menggabungkan teks-teks dengan menambahkan beberapa pemisah di antara mereka, yang menurutnya kami dapat mengembalikan struktur daftar dokumen kami dan memberikannya untuk lemmatization.

Kode solusi Python:

def checkExecTimeMystemOneText(texts):
    lol = lambda lst, sz: [lst[i:i+sz] for i in range(0, len(lst), sz)]
    txtpart = lol(texts, 1000)
    res = []
    for txtp in txtpart:
        alltexts = ' '.join([txt + ' br ' for txt in txtp])

        words = mystem.lemmatize(alltexts)
        doc = []
        for txt in words:
            if txt != '\n' and txt.strip() != '':
                if txt == 'br':
                    res.append(doc)
                    doc = []
                else:
                    doc.append(txt)

Kami mengambil masing-masing 1000 dokumen untuk serikat pekerja, pemisah di antara mereka adalah "br" (harus dicatat bahwa teks-teks dalam bahasa Rusia, dan alfabet Latin dan karakter khusus, kami sebelumnya dihapus). Solusi ini secara signifikan mempercepat lemmatisasi: rata-rata, ternyata sekitar 25 menit untuk semua 100 ribu dokumen, beban prosesor adalah 20-40%. Benar, solusi ini memuat lebih banyak RAM: rata-rata, sekitar 3-7GB, tetapi ini adalah hasil yang baik. Jika tidak ada memori yang cukup, maka Anda dapat mengubah jumlah dokumen yang akan digabungkan, meskipun ini akan memperlambat pemrosesan, itu masih akan jauh lebih cepat daripada satu teks pada suatu waktu. Juga, jika jumlah memori memungkinkan, maka Anda dapat meningkatkan nilai ini dan mendapatkan hasilnya lebih cepat.

Tabel menunjukkan perbandingan perpustakaan selama pemrosesan di komputer lokal (Intel Core i7 7740X, RAM 32 GB):
metodeWaktuRAM (Mb)Persen
Pymorphy2~ 9,5 jam500 - 60025 - 30%
PyMystem3 dengan 1 kalimat~ 16 jam500 - 7000 - 1%
PyMystem3 dengan 1000 penawaran26 menit2000 - 700025 - 40%

Sangat menarik untuk mengetahui pendapat spesialis lain. Mungkin seseorang menemukan cara yang lebih efisien waktu untuk meng-lemmatizing teks pendek?

Mikhail Kabakov, Insinyur Perangkat Lunak Senior,
Anna Mikhailova, Kepala
Penambangan Data , Konsorsium Codex

All Articles