SudachiPy VS spaCy

L’article consacré aux nouveaux modèles spaCy pour le chinois et le japonais montrait un exemple d’utilisation pour le chinois. Ceci avait permis de comparer la sortie produite par spaCy à celle de Jieba, étiqueteur morphosyntaxique qui avait également fait l’objet d’un article sur ce carnet.

Tout comme la segmentation du chinois avec spaCy est (par défaut) issue de Jieba, la segmentation du japonais s’appuie sur SudachiPy. Puisque j’ai depuis présenté l’installation et le fonctionnement de SudachiPy, voici maintenant un aperçu de l’étiquetage du japonais avec spaCy.

Le modèle pour l’étiquetage du japonais avec spaCy a été introduit avec la version 2.3 (version la plus récente actuellement). La documentation précise que SudachiPy (et plus précisément sa version 0.4.5) est utilisé pour la segmentation et l’étiquetage.

Importation du modèle

Selon la page de la documentation que vous consultez, vous trouverez deux façons différentes d’importer le modèle japonais en tant que module Python.

Sur la page Models, la section Quickstart, qui présente comment installer les différents modèles, propose ceci :

import spacy
nlp = spacy.load("ja_core_news_sm")

Alors que la section Japanese language support, consacrée plus particulièrement à l’installation du modèle pour le japonais, comporte l’exemple d’importation suivant :

from spacy.lang.ja import Japanese
nlp = Japanese()

Ma connaissance de spaCy est superficielle et je n’ai pas encore eu l’occasion de manipuler le modèle japonais en dehors de la rédaction de cet article. Je fais donc peut-être erreur, mais il me semble qu’il n’y a pas vraiment de différence, à part éventuellement que la seconde méthode permet une déclaration plus “compacte” du choix de segmentation. Celle-ci étant effectuée par SudachiPy, instancier directement un objet de la classe Japanese() permet alors de configurer le mode de segmentation souhaité parmi les trois modes proposés par SudachiPy (le mode A étant choisi par défaut) dès la création de l’objet.

Voici comment segmenter suivant le mode B, encore une fois avec un exemple tiré directement de la documentation du modèle :

from spacy.lang.ja import Japanese
cfg = {"split_mode": "B"}
nlp = Japanese(meta={"tokenizer": {"config": cfg}})

La première méthode d’importation du module aboutit elle aussi à une instance d’objet Japanese(). Si vous importez le modèle avec import ja_core_news_sm avant de le charger avec nlp = ja_core_news_sm.load(), print(nlp) vous renverra quelque chose de cet ordre :

<spacy.lang.ja.Japanese object at 0x000001E8BD117B50>

Il sera toujours possible de sélectionner un mode de segmentation différent du mode par défaut, mais ce sera à faire en deux étapes :

import ja_core_news_sm

# étape 1 = instanciation de l'objet
nlp = ja_core_news_sm.load()

# étape 2 = choix du mode de segmentation
cfg = {"split_mode": "B"}
nlp.meta = {"tokenizer": {"config": cfg}}

Utilisation

Une fois le modèle importé, l’utilisation est la même que pour tout autre modèle de spaCy. Comme pour le chinois avec Jieba, j’ai utilisé un script issu de la documentation de spaCy pour étiqueter à nouveau le texte qui avait servi d’exemple pour SudachiPy1.

from spacy.lang.ja import Japanese

cfg = {"split_mode": "A"}
nlp = Japanese(meta={"tokenizer": {"config": cfg}})

yosakoi = open('よさこい_text.txt', 'r', encoding='utf-8').read()
doc = nlp(yosakoi)
print([(token.text, token.pos_) for token in doc])

J’ai produit un fichier dans lequel une chaîne f"{token.text}/{token.pos_} " a été écrite pour chaque token. Comparaison des sorties :

SudachiPy

/空白 よさこい/名詞 は/助詞 、/補助記号 夜さり/名詞 来い/動詞 (/補助記号 夜/名詞 に/助詞 いらっしゃい/動詞 )/補助記号 と/助詞 いう/動詞 古語/名詞 が/助詞 変化/名詞 し/動詞 た/助動詞 言葉/名詞 。/補助記号 また/接続詞 は/助詞 、/補助記号 高知/名詞 県/名詞 の/助詞 民謡/名詞 で/助動詞 ある/動詞 よさこい節/名詞 、/補助記号 同県/名詞 の/助詞 よさこい祭り/名詞 の/助詞 略/名詞 。

spaCy

/SPACE よさこい/NOUN は/ADP 、/PUNCT 夜さり/NOUN 来い/AUX (/PUNCT 夜/NOUN に/ADP いらっしゃい/VERB )/PUNCT と/ADP いう/VERB 古語/NOUN が/ADP 変化/VERB し/AUX た/AUX 言葉/NOUN 。/PUNCT また/CCONJ は/ADP 、/PUNCT 高知/PROPN 県/NOUN の/ADP 民謡/NOUN で/AUX ある/AUX よさこい節/NOUN 、/PUNCT 同県/NOUN の/ADP よさこい祭り/NOUN の/ADP 略/NOUN 。

La représentation des dépendances est bien entendu possible également, et s’effectue de la même façon que pour les autres modèles. L’article consacré à l’étiquetage du chinois montrait un extrait de code exploitant displacy.serve() pour afficher la représentation, servie sur localhost:5000 (documentation de displacy). Voici ici comment l’enregistrer dans un fichier SVG2 :

import ja_core_news_sm
from spacy import displacy

nlp = ja_core_news_sm.load()
cfg = {"split_mode": "A"}
nlp.meta = {"tokenizer": {"config": cfg}}

txt = "コツメカワウソは、哺乳綱食肉目イタチ科ツメナシカワウソ属に分類される食肉類。"

depdc = displacy.render(doc, style='dep')
output_path = 'depdc_modeA.svg'
with open(output_path, 'w', encoding="utf-8") as output_path:
    output_path.write(depdc)
(voir en taille réelle)

Les carnets Hypotheses ne permettant pas d’intégrer directement les images au format SVG, les images sont affichées dans l’article au format PNG. Les fichiers de sortie SVG sont disponibles sur Gitlab.

Il ne faut pas oublier que displacy.render() accepte des options (sous forme de dictionnaire), notamment "compact": True qui peut faciliter la lecture de la sortie.

import ja_core_news_sm
from spacy import displacy

nlp = ja_core_news_sm.load()
cfg = {"split_mode": "A"}
nlp.meta = {"tokenizer": {"config": cfg}}

txt = "本種のみで、コツメカワウソ属Amblonyxを構成する説もある。"

options = {"compact": True}
depdc = displacy.render(doc, style='dep', options=options)
output_path = 'depdc_modeA_compact.svg'
with open(output_path, 'w', encoding="utf-8") as output_path:
    output_path.write(depdc)
(voir en taille réelle)

Il est aussi possible de paramétrer la police et les couleurs, entre autres.

Citer ce billet : “SudachiPy VS spaCy”, par Alexander Delaporte. Publié sur Tekipaki le 07/10/2020. Lien : https://tekipaki.hypotheses.org/755.
  1. Le texte est extrait de cette page Wikipedia (le texte des pages Wikipedia est disponible sous licence CC BY-SA 3.0.). Pour rappel, si vous souhaitez vous informer, en français, sur le yosakoi (よさこい) : site de l’association Yosakoi Paris Hinodemai, page de la Fédération de Yosakoi de France (FYF). []
  2. Les extraits de texte associés à la variable txt dans les exemples sont issus de cette page Wikipedia, portant sur la loutre cendrée. []

Auteur/autrice : Alexander Delaporte

Ingénieur d'études au Centre de recherches linguistiques sur l'Asie Orientale

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.

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

Rechercher dans OpenEdition Search

Vous allez être redirigé vers OpenEdition Search