[PYTHON] J'ai créé un konoha de bibliothèque qui fait passer le tokenizer à une belle sensation

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]

Introduction: qu'est-ce qu'un tokenizer?

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.

Que faire avec le tokenizer

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.

Divers tokenizers et diverses API

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.

Cas précédent

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.

Tokenisation

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.

Estimation des paroles des parties

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
"""

Utilisez votre propre dictionnaire utilisateur (MeCab)

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())

Utilisez votre propre dictionnaire système (MeCab)

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())

Résumé

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.

Recommended Posts

J'ai créé un konoha de bibliothèque qui fait passer le tokenizer à une belle sensation
J'ai fait une bibliothèque pour bien séparer les phrases japonaises
J'ai fait une commande pour marquer le clip de la table
J'ai créé une bibliothèque python qui fait rouler le rang
J'ai fait une fonction pour vérifier le modèle de DCGAN
J'ai essayé de faire un programme pour résoudre (indice) la recherche d'erreur de Saiseriya
J'ai créé une bibliothèque qui lit facilement les fichiers de configuration avec Python
J'ai créé un programme qui résout la recherche d'erreur en quelques secondes
J'ai créé une bibliothèque Python pour appeler l'API de LINE WORKS
J'ai fait un bot mou qui m'informe de la température
J'ai fait une commande pour afficher un calendrier coloré dans le terminal
J'ai fait un programme qui calcule automatiquement le zodiaque avec tkinter
J'ai fait un script pour afficher des pictogrammes
J'ai fait une bibliothèque pour l'assurance actuarielle
J'ai fait un calendrier qui met à jour automatiquement le calendrier de distribution de Vtuber
[Python] J'ai fait un décorateur qui ne semble pas avoir d'utilité.
[Django] a créé un champ pour saisir des dates avec des nombres à 4 chiffres
J'ai fait une minuterie de cuisine à afficher sur la barre d'état!
J'ai créé un programme pour vous avertir par LINE lorsque les commutateurs arrivent
J'ai fait une simple minuterie qui peut être démarrée depuis le terminal
Qu'est-ce qu'une bibliothèque en langage C? Quelles informations sont ouvertes au public?
J'ai fait un programme pour vérifier la taille d'un fichier avec Python
J'ai créé une fonction pour voir le mouvement d'un tableau à deux dimensions (Python)
Depuis que j'ai commencé à travailler à des moments différents, j'ai créé un Bot qui me dit l'heure de quitter le travail
J'ai fait un outil pour estimer le temps d'exécution de cron (+ débuts de PyPI)
J'ai créé un LINE BOT qui renvoie une image de riz terroriste en utilisant l'API Flickr
L'histoire de l'adresse IPv6 que je souhaite conserver au minimum
J'ai créé un Line Bot qui utilise Python pour récupérer les e-mails non lus de Gmail!
J'ai créé une bibliothèque pour faire fonctionner la pile AWS CloudFormation à partir de CUI (Python Fabric)
J'ai essayé d'utiliser la bibliothèque Python "pykakasi" qui peut convertir des kanji en romaji.
J'ai créé une commande appdo pour exécuter des commandes dans le contexte de l'application
J'ai créé un outil pour compiler nativement Hy
J'ai écrit un script pour relancer la montre gulp qui mourra bientôt
J'ai créé un outil pour obtenir de nouveaux articles
J'ai créé un programme pour rechercher des mots sur la fenêtre (développement précédent)
J'ai fait un script pour enregistrer la fenêtre active en utilisant win32gui de Python
Une histoire à laquelle j'étais accro après la communication SFTP avec python
[LPIC 101] J'ai essayé de résumer les options de commande qui sont faciles à faire une erreur
[Python] J'ai créé un système pour introduire "la recette que je veux vraiment" depuis le site de recettes!
J'ai créé un système qui vous permet de tweeter simplement en passant un appel téléphonique
J'ai fait une commande pour attendre que Django démarre jusqu'à ce que la base de données soit prête
[Python / C] J'ai créé un appareil qui fait défiler sans fil l'écran d'un PC à distance.
J'ai fait un calendrier qui met à jour automatiquement le calendrier de distribution de Vtuber (édition Google Calendar)
Une introduction approximative à la bibliothèque de traduction automatique neuronale
J'ai créé une VM qui exécute OpenCV pour Python
J'ai fait un script pour mettre un extrait dans README.md
J'ai créé un module Python pour traduire les commentaires
J'ai créé un code pour convertir illustration2vec en modèle Keras
Je voulais utiliser la bibliothèque Python de MATLAB
Une histoire à laquelle j'étais accro chez np.where
[Python] Une bibliothèque pratique qui convertit les kanji en hiragana
Un mémo que j'ai touché au magasin de données avec python
J'ai senti que j'avais porté le code Python en C ++ 98.
〇✕ J'ai fait un jeu
Lors de l'écriture dans un fichier csv avec python, une histoire que j'ai fait une légère erreur et n'a pas respecté la date de livraison