[PYTHON] Utilisons Juman ++ en mode serveur

Contenu de cet article

Qu'est-ce que Juman ++?

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.

Un petit point inquiétant de Juman ++

  1. Vous devez mettre à jour les bibliothèques dépendantes. Surtout autour de gcc
  2. Lent

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?

Utilisons le mode serveur!

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 __

Utiliser le mode serveur Human ++ depuis Python

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.

Ce que tu peux faire

Comment installer

  1. Installez Mecab, Juman, Juman ++. Voir This README.
  2. Démarrez Juman ++ en mode serveur. Utilisez le server.rb inclus avec Juman ++.
  3. pip install JapaneseTokenizer

C'est tout.

Comment utiliser

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.

Améliorations de Article précédent

Recommended Posts

Utilisons Juman ++ en mode serveur
exécuter le serveur uwsgi en mode uwsgi-gevent
Utilisez config.ini avec Python
Utiliser DataFrame en Java
Utiliser des dates en Python
Utiliser Mean avec DataFrame
Utiliser Valgrind avec Python
Utiliser ujson dans les requêtes
Utiliser le profileur en Python
Serveur DNS en Python ....
Voyons comment utiliser def en python
Utiliser l'expression let en Python
Utiliser Anaconda dans un environnement pyenv
Utiliser le protocole de mesure avec Python
Utiliser la fonction de rappel en Python
Utiliser le magasin de paramètres en Python
Utiliser le cache HTTP en Python
Utiliser des expressions régulières en C
Utilisez l'ODM de MongoDB avec Python
Utiliser un dict clé de liste en Python
Utiliser Random Forest avec Python
-Solution pour l'adresse déjà utilisée
Utilisation du mode Python dans le traitement
Utilisez <input type = "date"> avec Flask
Utilisez le modèle jinja2 dans un fichier Excel
Utilisez le tissu tel quel en python (fabric3)
Comment utiliser les classes dans Theano
Mock in python - Comment utiliser mox
Utiliser watchdog (watchmedo) dans le développement piloté par les tests
Ecrire un serveur HTTP / 2 en Python
Comment utiliser SQLite en Python
[Numpy] Appeler savetxt () en mode ajout
Utiliser rospy avec virtualenv dans Python3
Utiliser des API non implémentées dans twython
Comment utiliser Mysql avec python
Utiliser Python mis en pyenv avec NeoVim
Comment utiliser ChemSpider en Python
Comment utiliser PubChem avec Python
Utilisez django-debug-toolbar dans l'environnement VirtualBox / Vagrant
Utiliser OpenCV avec Python 3 dans Window
Déployer et utiliser le modèle de prédiction créé en Python sur SQL Server
Comment utiliser VS Code (serveur de code) avec Google Colab en seulement 3 lignes