Skip to content

lemmatisation du français avec hunspell et spacy

License

Notifications You must be signed in to change notification settings

thjbdvlt/viceverser

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

54 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

lemmatisation du français avec hunspell1 pour spacy.

ce module propose une manière alternative de lemmatiser des mots en tirant parti de la facilité avec laquelle on peut, grâce à hunspell, remanier des lexiques, par exemple en ajoutant des mots ou en définissant de nouvelles règles de flexions (par exemple pour l'écriture inclusive). au passage, les tokens se voient attribués des informations supplémentaires issus de l'analyse morphologique: Token._.vv_pos (part-of-speech définit pour le mot dans le lexique hunspell) et Token._.vv_morph (les caractéristiques morphologiques: la flexion du mot par rapport au lemme).

usage

pour l'ajouter comme composant d'une pipeline:

import spacy
import viceverser

nlp = spacy.load("fr_core_news_lg")
nlp.add_pipe("viceverser_lemmatizer", after="morphologizer")
# fonctionne mieux si des part-of-speech sont attribués avant,
# (en français, c'est le morphologizer qui les attribue).

installation

# le module dépend d'un autre mini-module: informifier,
# pour l'analyse des néo-verbes (qui permet ici de récupérer 
# l'analyse morphologique de verbes hors lexique).
git clone https://github.com/thjbdvlt/informifier informifier
cd informifier
pip install .

git clone https://github.com/thjbdvlt/viceverser viceverser
cd viceverser
pip install .

part-of-speech

ce module est fait pour être utilisé dans une pipeline spacy, et je l'ai écrit parce les modèles actuellement (avril 2024) proposés par spacy ne correspondaient pas à mes besoins. outre la difficulté qu'ils ont à lemmatiser des textes utilisant l'écriture inclusive et les mots composés, l'un des défauts de ces modèles est qu'ils sont parfois assez imprécis dans l'assignation des part-of-speech tags (les verbes à l'impératifs présents sont par exemple systématiquement taggés comme étant des noms). or, la lemmatisation dépend des part-of-speech tags: le lemme de sommes (noun) est somme tandis que le lemme de sommes (verb) est être. la pseudo-solution que je propose est la suivante:

tags = {"verb": [
    # tout en haut de chaque liste: le tag lui-même.
    "verb", 
    # les verbes sont souvent confondus avec les auxiliaires.
    # je place donc "aux" tout en haut de la liste.
    "aux",
    # quelques fois, les verbes sont confondus avec des nouns.
    "noun",  
    # ...
    # les verbes ne sont jamais confondus avec de la ponctuation.
    # je peux donc mettre ponctuation tout en bas de la liste.
    "punct",
    ],
    # ..
}

un exemple: admettons que dans la phrase Parle vite!, le modèle considère que Parle est un nom. la fonction de lemmatisation va utiliser hunspell pour regarder si parle est une forme connue. comme c'est le cas, la fonction prends la liste de priorité pour le tag nom. elle commence ainsi:

["noun", "verb", "adj", "..."]

la fonction prend, dans l'ordre, chacun de ces tags et regarde si un lemme dans le lexique hunspell lui correspond. comme aucun lemme ne correspond à parle (nom), la fonction essaie avec parle (verbe) et il y a un résultat (parler) qui devient donc le lemme du mot. pour que cela puisse fonctionner, il faut donc que le lexique (dans hunspell) attribue aux mots un (ou plusieurs) part-of-speech via l'attribut po:.

mots composés

les lemmes des mots composés (artistes-peintres, autrice-compositrice-interprète) sont obtenus par la concaténation des lemmes de leurs composants: artistes-peintres deviendra artiste-peintres, les deux mots artistes et peintres ayant été mis au singulier. si le lexique considère que auteurice est le lemme de autrice, alors autrice-compositrice deviendra auteurice-compositeurice.

mot lemme
autrices-compositrices auteurices-compositeurices

l'avantage de cette méthode est qu'elle ne nécessite pas de connaître à l'avance tous les mots composés possibles (virtuellement infinis). elle peut toutefois produire des résultats déconcertants (et intéressants):

mot lemme
peut-être pouvoir-être
soi-disant soi-dire
gratte-ciel gratter-ciel
compte-rendu compter-rendre
vis-à-vis voir-à-voir
c'est-à-dire ce être-à-dire
vice-versa vice-verser

rule lemmatizer

dans certains cas, le mot ne correspond à aucune forme répertoriée dans le lexique hunspell. pour ces cas, une fonction est définie qui construit le lemme par application de règles (rule-based lemmatization). celle proposée par défaut est relative au part-of-speech tag: s'il s'agit d'un adjectif ou d'un nom, j'enlève simplement les pluriels en s ou x, s'il s'agit d'un verbe, je considère d'un verbe du premier groupe car la quasi-totalité des néo-verbes sont des verbes du premier groupe, et j'essaie de reconstruire l'infinitif du verbe à partir de sa forme (ce que je fais en utilisant un autre mini-module que j'ai écrit pour ça: informifier), dans tous les autres cas, le lemme est le mot inchangé.

dependancies

Footnotes

  1. hunspell est un programme qui effectue des corrections orthographiques (utilisé notamment par libreoffice, openoffice, firefox). mais il réalise en même temps une analyse grammaticale des mots.

Releases

No releases published

Packages

No packages published