TL; DR
Présentation de konoha, une bibliothèque pour la création de jetons d'instructions. (Ancien tiny_tokenizer) Vous pouvez l'utiliser comme ↓. Qu'est-ce que c'est ~
from konoha import WordTokenizer
sentence = 'Étudier le traitement du langage naturel'
tokenizer = WordTokenizer('MeCab')
print(tokenizer.tokenize(sentence)) # -> [La nature,Langue,En traitement,À,étude,Shi,main,je,Masu]
tokenizer = WordTokenizer('Kytea')
print(tokenizer.tokenize(sentence)) # -> [La nature,Langue,En traitement,À,étude,Shi,main,je,bien,Su]
tokenizer = WordTokenizer('Sentencepiece', model_path="data/model.spm")
print(tokenizer.tokenize(sentence)) # -> [▁,La nature,Langue,En traitement,À,étude,Shi,Est]
Contrairement à des langues comme l'anglais, le japonais n'a pas de délimiteurs clairs aux limites des mots. Pour cette raison, lors de l'analyse du japonais, il est d'abord nécessaire de diviser la phrase en quelques unités (par exemple, des mots). Ce processus de division est divisé en unités de mots, les mots sont ensuite divisés en unités de sous-mots, et ainsi de suite. Et il y a des choses qui divisent la chaîne de caractères de la phrase en chaque caractère. Dans cet article, les sous-chaînes divisées par les unités ci-dessus sont appelées jetons. Il existe différentes méthodes de tokenisation. Les analyseurs morphologiques, largement utilisés dans l'analyse des textes japonais, effectuent également une segmentation de mots. (En plus de la division des mots, l'analyse morphologique effectue une estimation des en-têtes de mots et des étiquettes de mots partiels.)
Pour la division mot par mot, utilisez un dictionnaire pour créer un treillis, puis utilisez MeCab pour déterminer la séquence de mots optimale. Il existe des algorithmes tels que Kytea qui déterminent les limites des mots au niveau des caractères. Ces algorithmes peuvent renvoyer le même résultat fractionné ou des résultats fractionnés différents. Même si l'algorithme de division est le même, l'unité de mot changera si le système partiel est différent.
Les sous-mots sont des mots plus subdivisés. Son efficacité a été confirmée par la traduction automatique neuronale. En tant que tokenizer d'unité de sous-mot typique utilisé dans l'analyse de texte japonais Sentencepiece est célèbre.
Pour ceux qui font du text mining japonais Utilisez-vous habituellement MeCab + NEologd? Il peut y avoir des cas où la recherche utilise souvent Kytea. Aussi, dans la bibliothèque d'analyse des dépendances récemment évoquée Ginza Utilisation d'un analyseur morphologique appelé SudachiPy (une implémentation Python de Sudachi), etc. Divers analyseurs sont utilisés pour l'analyse au niveau des mots. Il est difficile de déterminer quel analyseur vous convient le mieux.
De plus, ces dernières années principalement dans le cadre de la traduction automatique "Les performances de la tâche sont meilleures si les jetons sont divisés en sous-mots plutôt que d'utiliser les résultats de l'analyseur morphologique." Il a également été signalé que la division par sous-mots est souvent adoptée.
La tokenisation au niveau des caractères est caractérisée par un petit nombre de types de caractères par rapport au nombre de types de mots. Le nombre de types de mots est généralement beaucoup plus grand que le nombre de types de caractères, et la tokenisation au niveau des caractères a pour effet de réduire la taille du vocabulaire. Par exemple, dans l'étude de l'extraction d'expressions propres, il existe une approche consistant à ajouter des fonctionnalités au niveau des caractères aux fonctionnalités LSTM. De nombreuses études récentes ont adopté cette approche. (Le papier répertorié dans le lien est ancien, mais c'est mon papier préféré)
Dans cette situation, dans quelle unité devons-nous symboliser la déclaration? En général, je comprends que la réponse à cette question est «** dépendante de la tâche **» et qu'il n'y a pas de réponse unique. Pour cette raison, "J'utilise MeCab + NEologd parce que beaucoup de gens l'utilisent." "Puisque le journal adopte des sous-mots, j'irai avec des sous-mots pour le moment." De telles options ont tendance à être prises.
Pour les tâches récentes de traitement du langage naturel (en particulier lors de l'utilisation de réseaux de neurones) Il y a beaucoup de choses qui doivent être payées autant que la tokenisation. (Exemple: architecture, dimensions des couches cachées, optimiseur, taux d'apprentissage ... etc), Dans ce contexte, la méthode de tokenisation est au début de la résolution du problème. Je pense que la situation actuelle est qu'il est souvent décidé d'être «non». Mais d'autres méthodes de tokenisation valent-elles vraiment la peine d'être essayées? Je trouve utile d'essayer différentes méthodes de tokenisation, donc Nous avons développé une bibliothèque pour changer facilement la méthode de tokenisation. C'est la raison du développement du konoha.
Changer de tokenizer coûte souvent un peu. Tous les analyseurs morphologiques et tokenizers illustrés ci-dessus ont des wrappers Python. Les utilisateurs peuvent utiliser ces outils à partir de Python en installant la bibliothèque de wrapper.
Cependant, les bibliothèques de wrapper fournissent des API avec des idiomes différents. (Je pense que c'est naturel car chaque analyseur et sa bibliothèque de wrapper sont écrits par des auteurs différents.) Par conséquent, si vous souhaitez changer la sortie de plusieurs analyseurs en fonction de la situation, Vous devez implémenter la couche qui absorbe les différences dans les idiomes de ces API.
Il existe une bibliothèque appelée JapaneseTokenizer. (Dépôt GitHub: Kensuke-Mitsuzawa / JapaneseTokenizers) Comme konoha, JapaneseTokenizer fournit également des wrappers pour plusieurs tokenizers. JapaneseTokenizer fournit une interface qui gère plusieurs analyseurs morphologiques. JapaneseTokenizer peut être utilisé pour filtrer les résultats de l'analyse de phrases par des balises de mot partiel spécifiques, etc. Il possède de nombreuses fonctions pratiques utiles pour l'analyse de texte. C'est un outil très pratique pour effectuer le traitement du langage naturel qui utilise les résultats de plusieurs analyseurs morphologiques.
konoha
D'un autre côté, le minuscule tokenizer ne fournit aucune fonction telle que le filtrage de mot partiel pour le moment. tiny tokenizer est une bibliothèque qui résume le processus de tokenisation de chaque analyseur. Il fournit des fonctions de division d'unité de sous-mot et de division de niveau de caractère que JapaneseTokenizer ne cible pas.
La position de cette bibliothèque est un wrapper pour le wrapper Python. Merci à tous ceux qui ont fourni le wrapper Python pour l'analyseur. Le but de cette bibliothèque est d'absorber les différences dans les interfaces de ces bibliothèques. En utilisant konoha, les utilisateurs pourront utiliser plusieurs analyseurs avec une API unifiée.
Tout d'abord, je vais vous montrer un exemple utilisant MeCab.
Dans cet exemple, le dictionnaire utilise mecab-ipadic.
Si vous utilisez macOS, mecab
, mecab-ipadic
,
Si vous utilisez Ubuntu, veuillez installer libmecab-dev
en plus de ce qui précède.
Le fonctionnement n'a pas été vérifié pour les autres distributions.
(Si mecab
, mecab-config
peuvent être exécutés et que le dictionnaire est installé, cela fonctionnera sans aucun problème.)
Si vous créez le Dockerfile dans le référentiel GitHub et créez l'environnement, toutes les préparations seront terminées.
--Code
from konoha import WordTokenizer
sentence = 'Étudier le traitement du langage naturel'
tokenizer = WordTokenizer('MeCab')
print(tokenizer.tokenize(sentence))
--Production
[La nature,Langue,En traitement,À,étude,Shi,main,je,Masu]
Ensuite, utilisons Kytea. Encore une fois, vous devez construire Kytea. (Veuillez également vous référer au Dockerfile dans le référentiel.)
--Code
from konoha import WordTokenizer
sentence = 'Étudier le traitement du langage naturel'
tokenizer = WordTokenizer('Kytea')
print(tokenizer.tokenize(sentence))
--Production
[La nature,Langue,En traitement,À,étude,Shi,main,je,bien,Su]
De plus, si vous souhaitez diviser une phrase en sous-mots, vous pouvez utiliser Sentencepiece.
Lors de l'utilisation de Sentencepiece, il est nécessaire de spécifier le fichier modèle.
Passez le chemin du fichier de modèle à model_path
.
--Code
from konoha import WordTokenizer
sentence = 'Étudier le traitement du langage naturel'
tokenizer = WordTokenizer('Sentencepiece', model_path="data/model.spm")
print(tokenizer.tokenize(sentence))
--Production
[▁,La nature,Langue,En traitement,À,étude,Shi,Est]
De cette façon, plusieurs analyseurs peuvent être utilisés de manière unifiée simplement en changeant la valeur de l'argument passé à WordTokenizer
.
Cela facilite l'expérimentation avec différents tokenizers pendant la phase expérimentale.
Un analyseur morphologique est également inclus dans le tokenizer. Des tokenizers actuellement pris en charge par konoha Les analyseurs morphologiques sont "MeCab", "Kytea" et "Sudachi (SudachiPy)". En ce qui concerne ceux-ci, s'il faut obtenir les informations données par l'analyseur morphologique telles que l'étiquette de partie de parole lors de la création de jetons. Il peut être contrôlé en option.
Un exemple d'utilisation de «SudachiPy» est illustré ci-dessous.
--Code
from konoha import WordTokenizer
sentence = 'Étudier le traitement du langage naturel'
tokenizer = WordTokenizer('Sudachi', mode='A', with_postag=True)
print(tokenizer.tokenize(sentence))
--Production
[La nature(nom),Langue(nom),En traitement(nom),À(Particule),étude(nom),Shi(verbe),main(
Particule),je(verbe),Masu(助verbe)]
La sortie de tokenizer.tokenize
est une instance de la classe Token
.
Les variables d'instance suivantes sont définies dans la classe Token
.
(Extrait de docstring de la classe Token
)
Les informations que l'analyseur ne renvoie pas sont «Aucune».
Par exemple, token.normalized_form
utilise SudachiPy
et
Et seulement lorsque «with_postag» est «True», la valeur n'est pas «None».
(Token
est un élément du tableau de chaînes de jetons produit par tokenizer.tokenize
)
"""
surface (str)
surface (original form) of a word
postag (str, default: None)
part-of-speech tag of a word (optional)
postag2 (str, default: None)
detailed part-of-speech tag of a word (optional)
postag3 (str, default: None)
detailed part-of-speech tag of a word (optional)
postag4 (str, default: None)
detailed part-of-speech tag of a word (optional)
inflection (str, default: None)
conjugate type of word (optional)
conjugation (str, default: None)
conjugate type of word (optional)
base_form (str, default: None)
base form of a word
yomi (str, default: None)
yomi of a word (optional)
pron (str, default: None)
pronounciation of a word (optional)
normalized_form (str, default: None)
normalized form of a word (optional)
Note that normalized_form is only
available on SudachiPy
"""
Si vous souhaitez utiliser le dictionnaire utilisateur, ʻuser_dictionary_path of
WordTokenizer`
Passez le chemin d'accès au dictionnaire utilisateur dans l'argument nommé.
from konoha import WordTokenizer
sentence = 'Étudier le traitement du langage naturel'
tokenizer = WordTokenizer('MeCab', user_dictionary_path="path/to/user_dict")
print(tokenizer.tokenize())
Je veux utiliser mecab-ipadic-NEologd
,
Ou si vous souhaitez utiliser le dictionnaire système que vous avez réappris en utilisant le corpus vous-même
Il est possible de générer un tokenizer en spécifiant un dictionnaire système.
Puisque l'argument system_dictionary_path
est généré dans WordTokenizer
,
Donnez-lui le chemin du dictionnaire système que vous souhaitez utiliser.
from konoha import WordTokenizer
sentence = 'Étudier le traitement du langage naturel'
tokenizer = WordTokenizer('MeCab', system_dictionary_path="path/to/system_dict")
print(tokenizer.tokenize())
Dans cet article, il s'agit d'une bibliothèque permettant d'utiliser plusieurs tokenizers avec la même interface. Nous avons présenté konoha. En utilisant cette bibliothèque lorsque vous vous demandez quel analyseur utiliser au début de l'analyse de texte Il est possible de changer facilement l'analyseur. De plus, je prévois d'expérimenter avec MeCab, mais mes recherches précédentes utilisent d'autres analyseurs. Même dans le cas où vous devez écrire du code pour utiliser un autre analyseur à des fins de comparaison En insérant konoha, vous pouvez expérimenter le même code sans tracas. J'espère que cela aidera les gens qui traitent le langage naturel sur le terrain et ceux qui traitent le langage naturel dans la recherche. Veuillez l'utiliser si vous le souhaitez, merci.
Pour compiler Kytea sur Ubuntu 18.04, cette pull request Besoin d'être importé. Veuillez vous référer au Dockerfile dans le référentiel konoha.