Rendre pyknp (JUMAN, KNP) disponible dans Windows

table des matières

  1. Environnement de développement
  2. Téléchargez divers logiciels
  3. Confirmez à l'invite de commande
  4. installation pyknp
  5. Test d'utilisation
  6. Réécriture du programme
  7. Référence / Outre

J'espère que vous le trouverez utile, veuillez faire de votre mieux pour le configurer!

1. Environnement de développement

environnement *Windows10 *Python-3.7.5 64bit **Terminal? ** ** *Command prompt

2. Téléchargez divers logiciels

Téléchargez d'abord JUMAN et KNP 1.JUMAN

Environ le troisième à partir du haut de la colonne de téléchargement, ** JUMAN Ver.7.0 (version Windows 64 bits) (avec programme d'installation; 8 330 604 octets) ** Il y a. Téléchargez-le, ouvrez-le et passez à l'installation image.png Les réglages devraient être corrects ...

1.KNP

Recherchez également celui ci-dessous dans la colonne de téléchargement et téléchargez-le KNP Ver.4.11 (version Windows 64 bits) (avec programme d'installation; 979 363 446 octets) D'une manière ou d'une autre, la taille est ! / Cela prend donc un certain temps Si vous le téléchargez et l'ouvrez, l'installation commencera, alors suivez-la.

Définir le CHEMIN

le chemin doit être défini par vous-même J'ai fait référence à ** ici **. Il suffit de jouer avec le côté système

  1. Ouvrez les propriétés du système en recherchant ou quelque chose
  2. Paramètres avancés
  3. [Préférences] en bas
  4. [chemin] dans les préférences système
  5. [Modifier]
  6. Ajoutez [C: \ Program Files \ juman]
  7. Ajoutez [C: \ Program Files \ knp] 8.[OK] Certaines personnes voudront peut-être redémarrer. Je ne l'ai pas vu avant de redémarrer

A part: pyknp utilise JUMAN ++ et KNP, mais comme il était gênant d'utiliser JUMAN sous Windows, j'utiliserai l'ancienne version de JUMAN. La correspondance de ceci est écrite en bas

3. Confirmez à l'invite de commande

Ouvrez d'abord une invite de commande (tout peut être fermé avec ctrl + C) ** Méthode de confirmation 1: saisissez juman **

C:~\> juman
Entrez du texte
(Succès)
Quelque chose que quelque chose préconise en quelque sorte 8* 0 * 0 * 0 "Notation représentative:Quelque chose/Quelque chose 標準:quoi/Quoi+Ou/Ou"
Phrase Bunsho Phrase Nez 6 Nez ordinaire 1* 0 * 0 "Notation représentative:Phrase/Catégorie Bunsho:Abstrait"
Vers deux auxiliaires 9 boîtier auxiliaire 1* 0 * 0 NIL
Entrée Nyuryoku Entrée Nominal 6 Sahen Nom 2* 0 * 0 "Notation représentative:contribution/Catégorie Nyuryoku:Domaine abstrait:Rébellion scientifique / technologique:nom-サ変nom:production/Shutsuryoku"
EOS

** Méthode de confirmation 2: echo Some text | Enter juman **

C:~\>echo Entrez du texte| juman
Quelque chose que quelque chose préconise en quelque sorte 8* 0 * 0 * 0 "Notation représentative:Quelque chose/Quelque chose 標準:quoi/Quoi+Ou/Ou"
Phrase Bunsho Phrase Nez 6 Nez ordinaire 1* 0 * 0 "Notation représentative:Phrase/Catégorie Bunsho:Abstrait"
Vers deux auxiliaires 9 boîtier auxiliaire 1* 0 * 0 NIL
Entrée Nyuryoku Entrée Nominal 6 Sahen Nom 2* 0 * 0 "Notation représentative:contribution/Catégorie Nyuryoku:Domaine abstrait:Rébellion scientifique / technologique:nom-サ変nom:production/Shutsuryoku"
  \  \Spécial 1 blanc 6* 0 * 0 NIL
EOS

** Méthode de confirmation 3: entrez juman | knp **

C:\~> juman | knp
Entrez du texte
# S-ID:1 KNP:4.11-CF1.1 DATE:2020/11/23 SCORE:-27.41598
Quelque chose ──┐
Phrase ──┤
contribution
EOS

** (exemple d'échec) **

'juman'Est une commande interne ou externe,
Non reconnu comme programme opérationnel ou fichier de commandes.

4. installation pyknp

Travailler dans le terminal VisualStudioCode installer avec pip installer pyknp

Terminal


C:~\>pip install pyknp

Si vous ne pouvez pas, (dans mon cas, il semble que ce soit une erreur de code de caractère) https://qiita.com/Nidhog-tm/items/c7e9d759ce1a0f5c85c6 Utilisez UTF-8 selon ** Après cela, des caractères déformés se produiront probablement quelque part, alors décochez> Anglais> Japonais et corrigez-le **

5. Test d'utilisation

Peut-être que je vais lancer une erreur absolue. De là, nous utiliserons ce script pour vérifier les erreurs. (Référence: https://pyknp.readthedocs.io/en/latest/)

test.py


# coding: utf-8
from __future__ import unicode_literals # It is not necessary when you use python3.
from pyknp import Juman
jumanpp = Juman()   # default is JUMAN++: Juman(jumanpp=True). if you use JUMAN, use Juman(jumanpp=False)
result = jumanpp.analysis("L'approche du sanctuaire Shimogamo était sombre.")
for mrph in result.mrph_list(): #Accéder à chaque morphologie
    print("Titre:%s,en train de lire:%s,Prototype:%s,Partie:%s,Partie細分類:%s,Type d'utilisation:%s,Type d'utilisation:%s,Information sémantique:%s,Notation représentative:%s" \
            % (mrph.midasi, mrph.yomi, mrph.genkei, mrph.hinsi, mrph.bunrui, mrph.katuyou1, mrph.katuyou2, mrph.imis, mrph.repname))

### (Succès) ###
Titre:Shimogamo,en train de lire:Shimogamo,Prototype:Shimogamo,Partie:nom,Partie細分類:Nom du lieu,Type d'utilisation:*,Type d'utilisation:*,Information sémantique:Acquisition automatique:Wikipedia WikipediaNom du lieu,Notation représentative:
Titre:Tombeau,en train de lire:Jinja,Prototype:Tombeau,Partie:nom,Partie細分類:普通nom,Type d'utilisation:*,Type d'utilisation:*,Information sémantique:Notation représentative:Tombeau/Jinja ドメイン:Catégorie Culture / Arts:endroit-Fin du nom de lieu de l'établissement, Notation représentative:Tombeau/Jinja
Titre:de,en train de lire:de,Prototype:de,Partie:Particule,Partie細分類:接続Particule,Type d'utilisation:*,Type d'utilisation:*,Information sémantique:NIL,Notation représentative:
Titre:Approche,en train de lire:Sando,Prototype:Approche,Partie:nom,Partie細分類:普通nom,Type d'utilisation:*,Type d'utilisation:*,Information sémantique:Notation représentative:Approche/Sando ドメイン:Catégorie Culture / Arts:endroit-Établissement, Notation représentative:Approche/Sando
Titre:Est,en train de lire:Est,Prototype:Est,Partie:Particule,Partie細分類:副Particule,Type d'utilisation:*,Type d'utilisation:*,Information sémantique:NIL,Notation représentative:
Titre:Il faisait sombre,en train de lire:C'était facile,Prototype:sombre,Partie:adjectif,Partie細分類:*,Type d'utilisation:イadjectifアウオ段,Type d'utilisation:Forme en T,Information sémantique:Notation représentative:sombre/À propos, Notation représentative:sombre/À propos
Titre:。,en train de lire:。,Prototype:。,Partie:Spécial,Partie細分類:Phrase,Type d'utilisation:*,Type d'utilisation:*,Information sémantique:NIL,Notation représentative:

6. Réécriture du programme

Cela m'a vraiment pris une journée ici. Mais si tu connais la cause, tu peux y aller dans quelques minutes ... (Rendre l'heure) L'endroit à réécrire est le fichier .py dans le fichier pyknp.

1.knp.py

knp.py


# (Ligne 29)
#Réécrire le contenu
jumancommand='jumanpp'À'juman'À
jumanpp     =Définir True sur False

#Avant de réécrire
def __init__(self, command='knp', server=None, port=31000, timeout=60,
                 option='-tab', rcfile='', pattern=r'EOS',
                 jumancommand='jumanpp', jumanrcfile='',
                 jumanoption='', jumanpp=True):
#Après réécriture
def __init__(self, command='knp', server=None, port=31000, timeout=60,
                 option='-tab', rcfile='', pattern=r'EOS',
                 jumancommand='juman', jumanrcfile='',
                 jumanoption='', jumanpp=False):

2.juman.py

knp.py


# (27e ligne)
#Réécrire le contenu
command = 'jumanpp'À'juman'À
jumanpp =Définir True sur False

#Avant de réécrire
    def __init__(self, command='jumanpp', server=None, port=32000, timeout=30,
                 option='', rcfile='', ignorepattern='',
                 pattern=r'^EOS$', jumanpp=True):
#Après réécriture
    def __init__(self, command='juman', server=None, port=32000, timeout=30,
                 option='', rcfile='', ignorepattern='',
                 pattern=r'^EOS$', jumanpp=False):

3.process.py

process.py


# (Ligne 72)
#Réécrire le contenu 1
signal.signal(signal.SIGALRM, alarm_handler)
signal.alarm(self.process_timeout)
# ↓
alarm = threading.Timer(self.process_timeout, alarm_handler)
alarm.start()

#Réécrire le contenu 2
self.process.stdin.write(sentence.encode('utf-8') + six.b('\n'))
# ↓ (utf-8 à cp932)
self.process.stdin.write(sentence.encode('cp932') + six.b('\n'))

#Réécrire le contenu 3
line = self.process.stdout.readline().rstrip().decode('utf-8')
# ↓ (utf-8 à cp932)
line = self.process.stdout.readline().rstrip().decode('cp932')

#Réécrire le contenu 4
signal.alarm(0)
# ↓
alarm.cancel()


#Après réécriture
    def query(self, sentence, pattern):
        assert(isinstance(sentence, six.text_type))

        def alarm_handler(signum, frame):
            raise subprocess.TimeoutExpired(self.process_command, self.process_timeout)
#Réécrire le point 1
        # signal.signal(signal.SIGALRM, alarm_handler)
        # signal.alarm(self.process_timeout)
        alarm = threading.Timer(self.process_timeout, alarm_handler)
        alarm.start()
        result = ""
        try:
#Réécrire le point 2
            # self.process.stdin.write(sentence.encode('utf-8') + six.b('\n'))
            self.process.stdin.write(sentence.encode('cp932') + six.b('\n'))
            self.process.stdin.flush()
            while True:
#Réécrire le point 3
                # line = self.process.stdout.readline().rstrip().decode('utf-8')
                line = self.process.stdout.readline().rstrip().decode('cp932')
                if re.search(pattern, line):
                    break
                result = "%s%s\n" % (result, line)
        finally:
#Réécrire le point 4
            # signal.alarm(0)
            alarm.cancel()
        return result

Au fait, si vous expliquez le mécanisme de référence, ** Voir juman pour knp ** (Si le nom de commande utilisé à ce moment n'est pas jumanpp (JUMAN ++) mais juman, une erreur se produira) ** juman voir processus ** (La commande utilisée à ce moment doit également être juman) ** Pour le processus, reportez-vous au sous-processus (celui qui exécute les commandes du terminal) ** (Lorsque vous vous référez ici, la plupart des fenêtres utilisent le code de caractère "cp932", donc utiliser "utf-8" pose un problème, donc corrigez-le. De plus, l'alarme est réécrite pour Windows. Il semble que le système de sous-processus n'est pas conçu pour utiliser le PowerShell, qui est le terminal de Windows. C'est gênant.) C'est devenu une relation

7. Référence / Outre

référence: JUMAN >>> http://nlp.ist.i.kyoto-u.ac.jp/index.php?JUMAN KNP >>> http://nlp.ist.i.kyoto-u.ac.jp/?KNP pyKNP >>> http://nlp.ist.i.kyoto-u.ac.jp/?PyKNP Site de référence: ** À propos de pyKNP >>> https://pyknp.readthedocs.io/en/latest/** [** À propos du sous-processus >>> https://docs.python.org/ja/3.5/library/asyncio-subprocess.html ](https://docs.python.org/ja/3.5/library/asyncio -subprocess.html) [ Un bon site que j'ai trouvé en écrivant un article >>> http://chuckischarles.hatenablog.com/entry/2019/09/12/150505 **](http://chuckischarles.hatenablog.com/ entrée / 2019/09/12/150505)

Ce que j'ai essayé jusqu'à présent

Enfin, je voulais faire une analyse de dépendance, j'ai donc travaillé sur celle-ci

  1. Il existe une analyse des dépendances appelée ** CaboCha **, mais apparemment elle ne prend pas en charge ** 64 bits **, donc c'est 32 bits. J'ai abandonné parce que c'était difficile à faire. J'utilise donc ce KNP. (Une autre analyse morphologique obligatoire MeCab est probablement facile à installer avec pip)

  2. pyknp prend en charge à l'origine ** juman ++ **, mais il n'y a pas de ** installateur **, Ce sera gênant si vous ne le faites pas sous Linux (pour Windows, le réglage du chemin, le réglage de l'environnement, utf-8 et d'autres paramètres sont extrêmement difficiles. Je ne pouvais pas le faire.)

  3. Il existe un module appelé ** subprocess ** qui est initialement installé en python, mais c'est l'un des points difficiles qu'il a été fait pour Linux. Par exemple, il semble que le shell Windows ne peut pas être utilisé à moins que ** Shell = 'True' **, mais j'ai abandonné car ce paramètre est dangereux et ressemble à ** non recommandé **.

  4. La conversion avec utf-8 semble réduire le nombre de caractères lors de la conversion d'une chaîne en octets (?) En raison des spécifications ci-dessus. Par conséquent, cette fois, la méthode de conversion n'était pas celle utilisant utf-8, mais celle utilisant cp932.

Puisqu'il s'agit de mon premier message, j'aimerais corriger toute erreur, je vous serais donc reconnaissant si vous pouviez me contacter. J'espère que cet article est pour quelqu'un !!!

Merci beaucoup aux personnes du laboratoire qui ont développé juman, knp, pyknp. Nous aimerions profiter de cette occasion pour vous remercier.

Recommended Posts

Rendre pyknp (JUMAN, KNP) disponible dans Windows
Rendre iPython disponible sur OSGeo4W
Rendre l'environnement anaconda disponible dans Windows à partir de l'invite de commande
[Python] Rendre pip disponible sur macOS
Rendre pip disponible sur Mac (easy_install est obsolète)
Rendre DHT11 disponible avec Raspeye + python (Remarque)
Pylint sur Windows Atom
Linux (WSL) sous Windows
Utilisez pyvenv sous Windows
Anaconda sur le terminal Windows
Installez Anaconda sur Windows 10
python basic ② sous windows
Installez python sur Windows
Installez pycuda sur Windows10
Construire TensorFlow sous Windows
Essayez FEniCS sur Windows!
Construisez XGBoost sur Windows
Installez pygraphviz sur Windows 10
Utilisez Ansible sur Windows
Essayez Poerty sur Windows
Installez Chainer 1.5.0 sur Windows
Utilisez QuTiP sur Windows
Utiliser pip sur Windows