Lemmatisez-le plus rapidement (PyMorphy2, PyMystem3 et un peu de magie)

Je travaille en tant que programmeur, y compris l'apprentissage automatique en relation avec l'analyse de texte. Lors du traitement d'une langue naturelle, une préparation préliminaire des documents est requise, et l'une des méthodes est la lemmatisation - ramener tous les mots du texte à leurs formes normales, en tenant compte du contexte.

Récemment, nous avons été confrontés au problème des coûts de temps importants pour ce processus. Dans une tâche spécifique, il y avait plus de 100 000 documents, dont la longueur moyenne était d'environ 1 000 caractères, et il était nécessaire d'implémenter le traitement sur un ordinateur local ordinaire, et non sur notre serveur pour les calculs. Nous n'avons pas pu trouver de solution sur Internet, mais nous l'avons trouvée nous-mêmes, et je voudrais la partager - pour démontrer une analyse comparative des deux bibliothèques de lemmatisation les plus populaires dans cet article.



Pymorphy2


PyMorphy2 est l'un des plus populaires - il se trouve dans presque toutes les solutions disponibles sur le réseau. Nous avons également utilisé cette bibliothèque, et elle s'est montrée parfaitement, jusqu'à ce qu'il soit nécessaire de faire une lemmatisation pour la base de données entière (comme je l'ai écrit ci-dessus, ce sont plus de 100 000 petits documents). Afin d'analyser un tel volume de documents, PyMorphy2 prendrait près de 10 heures, tandis que la charge du processeur pendant tout ce temps serait en moyenne d'environ 30% (Intel Core i7 7740X).

Pymystem3


À la recherche d'une autre solution, nous avons analysé la bibliothèque de Yandex PyMystem3, mais le résultat était presque deux fois pire (dans le temps) que PyMorphy2: il faudrait 16 heures pour traiter 100 000 documents.

Un peu de magie


Il nous a semblé étrange que la charge sur le processeur était presque nulle. Il était également étrange que pour obtenir le résultat d'un texte, même grand (3-4 mille caractères), PyMystem3 prenait environ 1 seconde. Par conséquent, nous avons décidé de combiner les textes en ajoutant un séparateur entre eux, selon lequel nous pourrions restituer la structure de notre liste de documents et les remettre pour lemmatisation.

Code de solution 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)

Nous avons pris 1000 documents chacun pour l'union, le séparateur entre eux était "br" (il faut noter que les textes en russe, et l'alphabet latin et les caractères spéciaux, nous les avons supprimés précédemment). Cette décision a considérablement accéléré la lemmatisation: en moyenne, il s'est avéré environ 25 minutes pour tous les 100 000 documents, la charge du processeur était de 20 à 40%. Certes, cette solution charge plus de RAM: en moyenne, c'est environ 3-7 Go, mais c'est un bon résultat. S'il n'y a pas assez de mémoire, vous pouvez modifier le nombre de documents à combiner, bien que cela ralentisse le traitement, il sera toujours beaucoup plus rapide qu'un texte à la fois. De plus, si la quantité de mémoire le permet, vous pouvez augmenter cette valeur et obtenir le résultat encore plus rapidement.

Le tableau présente une comparaison des bibliothèques lors du traitement sur un ordinateur local (Intel Core i7 7740X, 32 Go de RAM):
MéthodeTempsRAM (Mo)Pour cent
Pymorphy2~ 9,5 heures500 - 60025 - 30%
PyMystem3 par 1 phrase~ 16 heures500 - 7000 - 1%
PyMystem3 avec 1000 offres26 minutes2000 - 700025 - 40%

Il est intéressant de connaître les opinions d'autres spécialistes. Peut-être que quelqu'un a trouvé un moyen plus efficace de lemmatiser les textes courts?

Mikhail Kabakov, ingénieur logiciel principal,
Anna Mikhailova, chef de l'exploration de données
, Codex Consortium

All Articles