Mon travail sur le traitement d’un corpus écrit m’a amené à étiqueter le texte avec deux étiqueteurs morphosyntaxiques différents, PyNLPIR et Jieba. Un article a déjà été consacré à la marche à suivre pour réaliser l’étiquetage avec PyNLPIR, voyons maintenant comment faire avec Jieba.
Choisir un étiqueteur
Pour rappel, le choix de l’étiqueteur à utiliser n’est pas anodin dans la constitution d’un corpus textuel et aura un impact sur les analyses établies sur la base de ce corpus. En effet, les différents logiciels d’étiquetage n’appliquent pas les mêmes stratégies d’attribution des étiquettes mais aussi de segmentation du texte : ceci est visible même sur un (très) court extrait.
L’étiquetage avec Jieba
Le script ne sera pas intégralement reproduit ici. Vous pouvez retrouver le script complet, son fichier d’entrée et son fichier de sortie sur Github.
Jieba propose un certain nombre de fonctions (détaillées dans sa documentation), donc il n’est pas nécessaire d’importer toute la librairie mais seulement jieba.posseg
pour l’étiquetage.
import jieba.posseg as pseg
Réaliser l’étiquetage est alors extrêmement simple, il suffit d’appeler la fonction cut()
avec pour argument la chaîne de caractères à traiter. Comme pour PyNLPIR, j’ai choisi de parcourir le fichier ligne par ligne en gardant la ligne courante dans une variable appelée line
:
words = pseg.cut(line)
Le résultat renvoyé ici est une liste d’éléments de type item/étiquette, ce qui est déjà proche de la sortie souhaitée. La liste est simplement parcourue pour pouvoir ajouter un espace de séparation et réinsérer un saut de ligne en fin de chaîne.
tagged_segment = ""
for w in words:
tagged_segment += f"{w} "
tagged_segment = f"{tagged_segment}\n"
Ceci permet d’obtenir une sortie semblable à l’extrait montré en fin d’article (et au fichier de sortie complet). Les autres fonctions de Jieba permettent de contrôler assez finement les résultats obtenus, mais en l’état il est déjà possible d’ajuster la structure de la sortie. J’ai ici nommé w
1 la variable contenant l’ensemble item/étiquette : on peut alors récupérer l’item étiqueté (le “mot”) avec w.word
, et son étiquette avec w.flag
.
Ce n’est pas ce qui a été fait ici, mais on pourrait tout à fait produire quelque chose comme ceci :
message = f"Le mot {w.word} a été étiqueté {w.flag} par Jieba."
Qui aurait par exemple pour sortie :
Le mot 企鹅 a été étiqueté n par Jieba.
Cette solution n’est toutefois pas la meilleure si on souhaite obtenir un texte segmenté mais non étiqueté, puisque la segmentation sans étiquetage est l’une des utilisations prévues de la fonction cut
de Jieba. Ceci est détaillé et illustré par des exemples dans la documentation des fonctions de Jieba.
Comparatif PyNLPIR vs Jieba
Pour le détail de l’étiquetage avec PyNLPIR, voir cet article.
Les deux étiqueteurs utilisent le même jeu d’étiquettes, dont la liste est disponible sur cette page. Vous pouvez consulter le fichier dont est issu cet extrait sur Github : version PyNLPIR et version Jieba.
PyNLPIR
本/rz 條/n 目/ng 存在/v 以下/f 問/n 題/n ,/wd 請/n 協/n 助/v 改善/v 本/rz 條/n 目/ng 或/c 在/p 討/n 論/n 頁/n 針/n 對/n 議/n 題/n 發/n 表/vg 看法/n 。/wj
Jieba
本/r 條目/n 存在/v 以下/f 問題/n ,/x 請/v 協助/v 改善/v 本/r 條目/n 或/c 在/p 討論/v 頁/m 針對/p 議題/n 發表/v 看法/v 。/x
- J’ai simplement conservé le nommage des variables de l’exemple présenté dans la documentation de Jieba. [↩]