Étiquetage morphosyntaxique avec SudachiPy

J’ai présenté dans de précédents articles deux librairies Python permettant de réaliser un étiquetage morphosyntaxique (ou POS-tagging) sur des textes écrits en chinois : PyNLPIR et Jieba.

Voici maintenant quelques mots sur un étiqueteur permettant de traiter des textes en japonais : SudachiPy, la version librairie Python de l’étiqueteur et analyseur morphologique Sudachi.

Installation

Pour utiliser SudachiPy, installer la librairie seule ne suffira pas : comme expliqué dans la documentation, un dictionnaire est aussi nécessaire. Le dictionnaire par défaut, SudachiDict, est disponible en trois versions, de la plus compacte à la plus complète : small, core et full.

Je ne détaille habituellement pas l’installation des packages Python que je présente ici, mais dans le cas présent il y a un détail important concernant l’installation du dictionnaire qui mérite d’être signalé.

Selon la façon dont vous avez téléchargé et installé les fichiers, il est possible d’avoir téléchargé SudachiPy ainsi que sudachidict_core1, et d’obtenir une erreur de ce type en essayant d’importer dans un script les modules correspondants :

ModuleNotFoundError: No module named 'sudachidict'

Le dictionnaire est pourtant bien présent dans le répertoire site-packages, c’est le chemin d’accès qui pose problème. Le module recherché s’appelle sudachidict, ce qui ne coïncide pas forcément avec le nom du répertoire du dictionnaire : je n’ai pas fait un très grand nombre de tests, mais par exemple si vous passez par un IDE tel que Pycharm pour installer les packages, il ne s’appellera pas sudachidict mais sudachidict_core. La documentation de SudachiPy propose des opérations en ligne de commande pour spécifier le dictionnaire à utiliser en créant un lien symbolique, qui sont normalement prévues pour charger une autre version du dictionnaire mais qui devraient permettre de s’en sortir.

Les méthodes proposées dans la documentation sont à privilégier ; si toutefois vous ne pouvez ou ne voulez pas utiliser la ligne de commande, il y a d’autres solutions. L’une serait de renommer sudachidict_core2 en sudachidict. Ce n’est pas optimal, parce que si par la suite vous souhaitez utiliser les autres versions de sudachidict, garder une trace de la version dans le nommage est assez important. Sans toucher au nom du répertoire contenant le dictionnaire, apporter une (très) petite modification au fichier config.py de SudachiPy suffira à régler le problème. Celui-ci se trouve à la racine du répertoire de sudachipy. En partant de votre répertoire site-packages le chemin d’accès du fichier sera le suivant :

sudachipy/config.py

Ce fichier config.py contient notamment une fonction appelée create_default_link_for_sudachidict_core, définie à partir de la ligne 54. C’est une ligne de cette fonction qui est à modifier, la ligne 56 qui se présente comme suit :

dict_path = Path(import_module('sudachidict').__file__).parent

Il faut simplement remplacer sudachidict par le nom du répertoire tel qu’enregistré dans votre système. Par exemple, s’il s’appelle sudachidict_core :

dict_path = Path(import_module('sudachidict_core').__file__).parent

Le dictionnaire sera alors chargé correctement et utilisable sans problème.

Utilisation

Le script complet, son fichier d’entrée et son fichier de sortie sont disponibles sur Github.

Le but ici sera d’obtenir un fichier de sortie similaire à ceux produits avec PyNLPIR et Jieba, c’est-à-dire un fichier texte annoté suivant un format token/tag, en séparant chacun de ces groupes token/tag par un espace.

Objet Dictionary()

Quelques lignes de code suffisent pour y parvenir (en Python 3.8 pour cet exemple). L’étiquetage avec SudachiPy repose sur la création d’une instance d’objet Dictionary() :

from sudachipy import tokenizer
from sudachipy import dictionary

my_tokenizer = dictionary.Dictionary().create()

Notez qu’il est important de ne pas appeler tokenizer cet objet Dictionary(), pour ne pas créer d’interférence avec tokenizer importé précédemment. J’ai arbitrairement choisi my_tokenizer3.

Mode de segmentation

SudachiPy propose trois modes de segmentation différents, et il est donc nécessaire de spécifier le mode choisi. Ces trois modes se distinguent par leur niveau de granularité, et dans certains cas la différence n’est pas forcément flagrante. La spécificité de chaque mode peut cependant être mise en évidence en comparant la segmentation d’entités nommées. Voici quelques exemples :

航空自衛隊4

Mode A[‘航空’, ‘自衛’, ‘隊’]
Mode B[‘航空’, ‘自衛隊’]
Mode C[‘航空自衛隊’]

文部科学省5

Mode A[‘文部’, ‘科学’, ‘省’]
Mode B[‘文部’, ‘科学省’]
Mode C[‘文部科学省’]

国際連合教育科学文化機関6

Mode A[‘国際’, ‘連合’, ‘教育’, ‘科学’, ‘文化’, ‘機関’]
Mode B[‘国際連合’, ‘教育’, ‘科学’, ‘文化’, ‘機関’]
Mode C[‘国際連合教育科学文化機関’]

奈良先端科学技術大学院大学7

Mode A[‘奈良’, ‘先端’, ‘科学’, ‘技術’, ‘大学’, ‘院’, ‘大学’]
Mode B[‘奈良’, ‘先端’, ‘科学’, ‘技術’, ‘大学院’, ‘大学’]
Mode C[‘奈良先端科学技術大学院大学’]

Une fois le mode de segmentation choisi, il ne faut pas oublier de le déclarer. Il est possible de le faire directement au moment de la segmentation, mais il me paraît plus confortable de l’associer préalablement à une variable8 :

mode = tokenizer.Tokenizer.SplitMode.A

Segmenter et étiqueter le texte

Maintenant que l’objet Dictionary() (appelé ici my_tokenizer) et le mode (associé à la variable mode) ont tous deux été déclarés, il ne reste plus qu’à préciser le texte à étiqueter. Dans cet exemple, il s’agit d’une extraction du contenu textuel de cette page Wikipedia (よさこい)9, sous forme d’un fichier texte associé à la variable txt.

Le texte segmenté et étiqueté sera alors accessible via my_tokenizer.tokenize(txt, mode). Diverses informations sont disponibles : forme de surface, forme de citation (forme “dictionnaire”), lecture, catégorie morphosyntaxique. Pour obtenir un fichier de sortie annoté token/tag, il suffit alors d’ajouter les trois lignes de code suivantes :

with open('よさこい_text_PosTaggedSudachiPy.txt', 'w', encoding='utf-8') as pos_tagged:
    for m in my_tokenizer.tokenize(txt, mode):
        pos_tagged.write(f"{m.surface()}/{m.part_of_speech()[0]} ")

Le token correspond à la forme de surface (m.surface()), le tag à la catégorie (m.part_of_speech()[0]). L’étiquette catégorielle conservée ici ne reprend que l’étiquette la plus générale, car m.part_of_speech() n’est en fait pas une chaîne de caractères mais une liste (d’où la présence de l’index [0]). En fonction du type d’entité linguistique (et du dictionnaire utilisé), cette liste contient une série d’étiquettes pouvant qualifier le token de façon plus ou moins précise.

山内    ['名詞', '固有名詞', '人名', '姓', '', '']

Par exemple, la liste présentée ci-dessus nous indique que Yamauchi (山内) est un nom (名詞), un nom propre (固有名詞), un nom de personne (人名) et enfin un nom de famille (姓). Pour donner un aperçu de la diversité des étiquettes disponibles, le fichier よさこい_SudachiPy_PosTagging_data.tsv présent dans le répertoire Github contient un tableau présentant la liste complète des étiquettes pour chaque token du fichier d’entrée.

Pour terminer, un extrait du fichier de sortie :

/空白 「/補助記号 夜さり/名詞 」/補助記号 は/助詞 夜分/名詞 や/助詞 今夜/名詞 と/助詞 いう/動詞 意味/名詞 で/助詞 、/補助記号 9/名詞 世紀/名詞 末/接尾辞 から/助詞 使わ/動詞 れ/助動詞 て/助詞 い/動詞 た/助動詞 言葉/名詞 で/助動詞 ある/動詞 。/補助記号 「/補助記号 さらに/副詞 夜さり/名詞 この/連体詞 寮/名詞 (/補助記号 つかさ/名詞 )/補助記号 に/助詞 ま/感動詞 うで/名詞 来/接尾辞 (/補助記号 こ/名詞 )/補助記号 と/助詞 のたまい/動詞 て/助詞 //補助記号 竹取/名詞 物語/名詞 」/補助記号 。/補助記号 また/接続詞 「/補助記号 り/助動詞 」/補助記号 が/助詞 とれ/動詞 た/助動詞 「/補助記号 夜/名詞 さ/助詞 」/補助記号 と/助詞 いう/動詞 形/名詞 で/助詞 は/助詞 1707/名詞 年/名詞 ごろ/名詞 から/助詞 人形/名詞 浄瑠璃/名詞 に/助詞 登場/名詞 する/動詞 。
Citer ce billet : “Étiquetage morphosyntaxique avec SudachiPy”, par Alexander Delaporte. Publié sur Tekipaki le 26/08/2020. Lien : https://tekipaki.hypotheses.org/721.
  1. Il s’agit de la version normalement utilisée par défaut, pour laquelle il ne devrait pas y avoir de paramétrage supplémentaire à effectuer. []
  2. Ou tout autre nom d’origine du répertoire contenant les fichiers du dictionnaire, en fonction de votre installation. []
  3. Les exemples présents dans la documentation de SudachiPy utilisent tokenizer_obj. []
  4. 航空自衛隊 sur jisho.org []
  5. 文部科学省 sur jisho.org []
  6. 国際連合教育科学文化機関 sur jisho.org []
  7. 奈良先端科学技術大学院大学 sur jisho.org []
  8. C’est aussi ce qui est proposé dans la documentation. []
  9. Le texte des pages Wikipedia est disponible sous licence CC BY-SA 3.0. Pour plus d’informations en français sur le yosakoi (よさこい), voir notamment le site de l’association Yosakoi Paris Hinodemai, qui comporte une page explicative. []

Auteur/autrice : Alexander Delaporte

Ingénieur d'études au Centre de recherches linguistiques sur l'Asie Orientale et chercheur associé BnF 2019-2021

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.