{"word_count": 1145, "character_count": 8140}
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.InstallationPour 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_core ((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.)), 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_core ((Ou tout autre nom d'origine du répertoire contenant les fichiers du dictionnaire, en fonction de votre installation.)) 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.pyCe 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__).parentIl 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__).parentLe dictionnaire sera alors chargé correctement et utilisable sans problème.UtilisationLe 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 tokenizerfrom sudachipy import dictionarymy_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_tokenizer ((Les exemples présents dans la documentation de SudachiPy utilisent tokenizer_obj.)).Mode de segmentationSudachiPy 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 :航空自衛隊 ((航空自衛隊 sur jisho.org))Mode A['航空', '自衛', '隊']Mode B['航空', '自衛隊']Mode C['航空自衛隊']文部科学省 ((文部科学省 sur jisho.org))Mode A['文部', '科学', '省']Mode B['文部', '科学省']Mode C['文部科学省']国際連合教育科学文化機関 ((国際連合教育科学文化機関 sur jisho.org))Mode A['国際', '連合', '教育', '科学', '文化', '機関']Mode B['国際連合', '教育', '科学', '文化', '機関']Mode C['国際連合教育科学文化機関']奈良先端科学技術大学院大学 ((奈良先端科学技術大学院大学 sur jisho.org))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 variable ((C'est aussi ce qui est proposé dans la documentation.)) :mode = tokenizer.Tokenizer.SplitMode.ASegmenter et étiqueter le texteMaintenant 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 (よさこい) ((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.)), 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()&#091;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/名詞 年/名詞 ごろ/名詞 から/助詞 人形/名詞 浄瑠璃/名詞 に/助詞 登場/名詞 する/動詞 。[cite]