Juman ++ est un analyseur morphologique développé au laboratoire Kurohashi de l'Université de Kyoto. Le fait est: "Quelle est la différence avec Mecab?", Mais la différence est que Human ++ "utilise le modèle de langage RNN (système d'apprentissage en profondeur)".
Les articles d'introduction se multiplient progressivement dans Qiita, et j'attends avec impatience son utilisation généralisée à l'avenir.
Il est à craindre que le problème de la bibliothèque de dépendances puisse mettre à jour gcc et que d'autres groupes de code puissent rester bloqués ... Dans ce cas, utilisez la solution sympa Préparer l'environnement Docker.
Maintenant, le problème est l'aspect vitesse de 2. Cet article
Mecab a pris environ 10 secondes, tandis que JUMAN ++ a pris plus de 10 heures
Donc, il est certain qu'il y a des inquiétudes concernant la vitesse.
J'ai également fait une comparaison de mesures dans mon environnement.
time echo "Le gouvernement des étrangers a été approuvé. Je suis aussi le dernier jour du dimanche." | mecab
echo 0.00s user 0.00s system 26% cpu 0.005 total
mecab 0.00s user 0.00s system 49% cpu 0.007 total
time echo "Le gouvernement des étrangers a été approuvé. Je suis aussi le dernier jour du dimanche." | jumanpp
echo 0.00s user 0.00s system 31% cpu 0.004 total
jumanpp 0.14s user 0.35s system 53% cpu 0.931 total
Comparé à Mecab, le nombre est de 3 chiffres différents.
Ce facteur n'est pas dû à la conception, mais parce qu'il faut du temps pour charger le modèle (il semble que ce soit une histoire d'un certain endroit) En d'autres termes, il n'y a pas d'autre choix que d'utiliser le modèle de langage RNN.
Alors que dois-je faire?
La solution est simple, plus que "utiliser un script serveur"! est.
En fait, ceci est correctement écrit dans le manuel ver.1.0.1. Voir page 5.
Utilisez le script __Ruby inclus dans le tar de Juman ++ et laissez-le fonctionner en mode serveur.
Selon le manuel
$ ruby script/server.rb --cmd "jumanpp -B 5" --host host.name --port 1234
Démarrez le serveur avec. Pour appeler en tant que client
echo "Mange du gatêau" | ruby script/client.rb --host host.name --port 1234
est.
Alors, combien de temps pouvez-vous gagner en utilisant le mode serveur?
time echo "Le gouvernement des étrangers a été approuvé. Je suis aussi le dernier jour du dimanche." | ruby client.rb --host localhost
echo 0.00s user 0.00s system 21% cpu 0.006 total
ruby client.rb --host localhost 0.04s user 0.01s system 47% cpu 0.092 total
C'est environ un dixième du temps! C'est incroyable! Au fait, que se passe-t-il avec Human ++ sur le réseau? J'ai démarré le serveur Human ++ sur une machine serveur qui existe dans le réseau local et l'ai mesuré.
time echo "Le gouvernement des étrangers a été approuvé. Je suis aussi le dernier jour du dimanche." | ruby client.rb --host sever.hogehoge
echo 0.00s user 0.00s system 22% cpu 0.005 total
ruby client.rb --host sever.hogehoge 0.03s user 0.01s system 26% cpu 0.167 total
.. .. .. .. Eh bien, compte tenu de la réponse du réseau, est-ce quelque chose comme ça? Quoi qu'il en soit, nous avons constaté que l'utilisation du mode serveur pouvait résoudre le goulot d'étranglement.
__ Tout le monde, utilisons Human ++ en mode serveur __
Le script client ci-dessus est écrit en Ruby. Donc, je pense que les gens de Ruby devraient juste l'utiliser tel quel (merde de nez)
Cependant, je suis un utilisateur régulier de Python, donc je veux l'appeler depuis Python.
(Si vous souhaitez utiliser client.rb
comme Python, veuillez consulter le code ci-joint en bas.)
Officiellement, un package Python appelé pyknp a été publié, mais en fait, seuls les appels de sous-processus sont préparés pour juman ++. N'est pas ... (Histoire en pyknp-0.3)
Cela ne vous permet pas de bénéficier du mode serveur.
J'ai publié un package Python appelé Japanese Tokenizers. Je l'ai incorporé dans ce package Python.
Disponible pour Python 2x et Python 3x.
server.rb
inclus avec Juman ++.pip install JapaneseTokenizer
C'est tout.
Il suffit d'une seule ligne pour appeler Juman ++ en mode serveur.
>>> from JapaneseTokenizer import JumanppWrapper
>>> sentence = 'Téhéran (persan): تهران ; Tehrān Tehran.Prononciation de ogg[Aidez-moi/Fichier]/teɦˈrɔːn/,Anglais:Téhéran) est la capitale de l'Asie occidentale, de l'Iran et la capitale de Téhéran. Population 12,223,598 personnes. La population urbaine est de 13 ans,413,Atteignez 348 personnes.'
>>> list_result = JumanppWrapper(server='localhost', port=12000).tokenize(sentence, return_list=True)
>>> print(list_result)
['Téhéran', 'Perse', 'mot', 'prononciation', 'Aidez-moi', 'Fichier', '英mot', 'Tehran', 'Ouest', 'Asie', 'Iran', 'Capitale', 'Téhéran', 'Capitale de l'Etat', 'population', '12,223,598', 'ville', 'Zone', 'population', '13,413,348']
Pour sélectionner une morphologie par partie, passez la partie que vous voulez sélectionner avec List [Tuple [str]]
.
Voir cette page pour le système participatif de Juman ++.
>>> from JapaneseTokenizer import JumanppWrapper
>>> sentence = 'Téhéran (persan): تهران ; Tehrān Tehran.Prononciation de ogg[Aidez-moi/Fichier]/teɦˈrɔːn/,Anglais:Téhéran) est la capitale de l'Asie occidentale, de l'Iran et la capitale de Téhéran. Population 12,223,598 personnes. La population urbaine est de 13 ans,413,Atteignez 348 personnes.'
>>> pos_condition = [('nom', 'Nom du lieu')]
>>> JumanppWrapper(server='localhost', port=12000).tokenize(sentence, return_list=False).filter(pos_condition=pos_condition).convert_list_object()
['Téhéran', 'Asie', 'Iran', 'Téhéran']
En outre, vous pouvez également acquérir des informations sur les paroles des parties, le système de surface et d'autres informations produites par Human ++.
Voir examples.py pour plus d'informations.
Recommended Posts