Lemmatisiere es schneller (PyMorphy2, PyMystem3 und etwas Magie)

Ich arbeite als Programmierer, einschließlich maschinellem Lernen in Bezug auf Textanalyse. Bei der Verarbeitung einer natürlichen Sprache ist eine vorbereitende Vorbereitung der Dokumente erforderlich. Eine der Methoden ist die Lemmatisierung, bei der alle Wörter des Textes unter Berücksichtigung des Kontexts in ihre normale Form gebracht werden.

Vor kurzem standen wir vor dem Problem der hohen Zeitkosten für diesen Prozess. In einer bestimmten Aufgabe gab es mehr als 100.000 Dokumente, deren durchschnittliche Länge etwa 1000 Zeichen betrug, und es war erforderlich, die Verarbeitung auf einem normalen lokalen Computer und nicht auf unserem Server für Berechnungen zu implementieren. Wir konnten im Internet keine Lösung finden, aber wir haben sie selbst gefunden, und ich möchte sie teilen - um eine vergleichende Analyse der beiden beliebtesten Lemmatisierungsbibliotheken in diesem Artikel zu demonstrieren.



Pymorphy2


Eines der beliebtesten ist PyMorphy2 - es ist in fast jeder Lösung enthalten, die im Netzwerk zu finden ist. Wir haben diese Bibliothek auch verwendet und sie hat sich perfekt gezeigt, bis eine Lemmatisierung für die gesamte Datenbank erforderlich war (wie ich oben schrieb, handelt es sich um mehr als 100.000 kleine Dokumente). Um ein solches Dokumentenvolumen zu analysieren, würde PyMorphy2 fast 10 Stunden dauern, während die Prozessorlast während dieser ganzen Zeit durchschnittlich etwa 30% betragen würde (Intel Core i7 7740X).

Pymystem3


Auf der Suche nach einer anderen Lösung haben wir die Bibliothek von Yandex PyMystem3 analysiert, aber das Ergebnis war (zeitlich) fast doppelt so schlecht wie bei PyMorphy2: Die Verarbeitung von 100.000 Dokumenten würde 16 Stunden dauern.

Etwas Magie


Es kam uns seltsam vor, dass die Belastung des Prozessors fast Null war. Es war auch seltsam, dass PyMystem3 ungefähr 1 Sekunde brauchte, um das Ergebnis aus einem Text zu erhalten, selbst einem großen (3-4 Tausend Zeichen). Aus diesem Grund haben wir beschlossen, die Texte zu kombinieren, indem wir eine Art Trennzeichen zwischen ihnen einfügen, mit dem wir die Struktur unserer Dokumentenliste wieder zurückgeben und zur Lemmatisierung freigeben können.

Python-Lösungscode:

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)

Wir haben jeweils 1000 Dokumente für die Gewerkschaft genommen, das Trennzeichen zwischen ihnen war "br" (es sollte beachtet werden, dass die Texte in russischer Sprache und das lateinische Alphabet und Sonderzeichen, die wir zuvor entfernt haben). Diese Lösung beschleunigte die Lemmatisierung erheblich: Im Durchschnitt waren es für alle 100.000 Dokumente etwa 25 Minuten, die Prozessorlast betrug 20-40%. Diese Lösung lädt zwar mehr RAM: Im Durchschnitt sind es etwa 3-7 GB, aber das ist ein gutes Ergebnis. Wenn nicht genügend Speicher vorhanden ist, können Sie die Anzahl der zu kombinierenden Dokumente ändern. Dies verlangsamt zwar die Verarbeitung, ist jedoch immer noch viel schneller als jeweils ein Text. Wenn die Speicherkapazität dies zulässt, können Sie diesen Wert erhöhen und das Ergebnis noch schneller erhalten.

Die Tabelle zeigt einen Vergleich der Bibliotheken während der Verarbeitung auf einem lokalen Computer (Intel Core i7 7740X, 32 GB RAM):
MethodeZeitRAM (Mb)Prozent
Pymorphy2~ 9,5 Stunden500 - 60025 - 30%
PyMystem3 um 1 Satz~ 16 Stunden500 - 7000 - 1%
PyMystem3 mit 1000 Angeboten26 Minuten2000 - 700025 - 40%

Es ist interessant, die Meinungen anderer Spezialisten zu kennen. Vielleicht hat jemand einen zeiteffizienteren Weg gefunden, kurze Texte zu lemmatisieren?

Mikhail Kabakov, Senior Software Engineer,
Anna Mikhailova, Leiterin Data
Mining, Codex Consortium

All Articles