Mecab / Cabocha / KNP unter Python + Windows

Was du machen willst

Wenn Sie Mecab / Cabocha / KNP mit Windows + Python verwenden und versuchen, "Mecab importieren" oder "Cabocha importieren" zu verwenden, ist das Neukompilieren, die UTF-8-Spezifikation usw. problematisch. Verwenden Sie daher den externen Aufruf Sjift-Jis +, um die Standardinstallation zu aktivieren.

Umgebung

Quelle

** Homefldr überall einstellen ** (Nachtrag vom 17.12.2016: Unterstützt auch KNP)

import os
import subprocess
from tempfile import NamedTemporaryFile

class JapaneseDependencyRelation:
    def __init__(self, encoding=None):
        if encoding is None:
            encoding = 'utf-8'
        # Mecab,Cabocha-Codierung(Befolgen Sie während der Installation)
        self.text_encoding = encoding
        #Speicherort für die Erstellung von TMP-Dateien
        self.homefldr = 'C:\\tmp'

    def get_encode_original(self, j_txt):
        hoge = []
        for ch in j_txt:
            try:
                hoge.append(ch.encode(self.text_encoding))
            except:
                raise UnicodeEncodeError

        return ''.join(hoge)

    def do_mecab(self, j_txt):
        if os.path.exists(self.homefldr) == False:
            raise FileNotFoundError

        try:
            with NamedTemporaryFile(delete=False, dir=self.homefldr) as temp:
                try:
                    j_txt = j_txt.encode(self.text_encoding)
                except:
                    j_txt = self.get_encode_original(j_txt)
                temp.write(j_txt)
        except Exception as e:
            print(e)
            raise UnicodeTranslateError
        else:
            command = ['mecab']
            process = subprocess.Popen(command, stdin=open(temp.name, 'r'), stdout=subprocess.PIPE)
            output = process.communicate()[0]
        finally:
            temp.close()
            os.unlink(temp.name)
        return output.decode(self.text_encoding)

    def do_cabocha(self, j_txt, fmt=None):
        if fmt is None:
            fmt = "xml"

        if os.path.exists(self.homefldr) == False:
            raise FileNotFoundError

        try:
            with NamedTemporaryFile(delete=False, dir=self.homefldr) as temp:
                try:
                    j_txt = j_txt.encode(self.text_encoding)
                except:
                    j_txt = self.get_encode_original(j_txt)
                temp.write(j_txt)
        except Exception as e:
            print(e)
            raise UnicodeTranslateError
        else:
            '''
            -f, --output-format=TYPE  set output format style
                                        0 - tree(default)
                                        1 - lattice
                                        2 - tree + lattice
                                        3 - XML
            '''
            #Cabocha-Argument
            if (fmt == "xml"):
                command = ['cabocha', '-f', '3']
            elif (fmt == "tree"):
                command = ['cabocha', '-f', '2']
            else:
                command = ['cabocha', '-f', '1']

            process = subprocess.Popen(command, stdin=open(temp.name, 'r'), stdout=subprocess.PIPE)
            output = process.communicate()[0]
        finally:
            temp.close()
            os.unlink(temp.name)

        return output.decode(self.text_encoding)

    def do_knp(self, j_txt, fmt=None, level=None, output=None):
        """
Festlegen der Anzeige der Analyseergebnisse(fmt)
            -Registerkarte Tabellarische Anzeige(tab)
            -Anzeige in Tabellenform mit weniger einfacher Ausgabe(simple)
            -td Anzeige entsprechend "Allzweckanzeigewerkzeug für Analyseergebnisse" 1(td)
            -tree (default)Anzeige nach Baumstruktur(tree)
            -Tabellarische Darstellung der bnsttab-Klauseln(tab1)
            -bnsttree Klauselbaumstrukturanzeige(tree1)
            -Anzeige im Sexp-Listenformat(sexp)
Festlegen der Analyseebene(level)
            -bnst Konvertiert morphologische Zeichenfolge in Klauselzeichenfolge(1)
            -dpnd Führen Sie außerdem eine Abhängigkeitsanalyse zwischen Klauseln durch(2)
            -case (default)Analysieren Sie außerdem die Fallbeziehung(3)
            -Anaphora Analysieren Sie zusätzlich die Korrespondenzbeziehung(4)
            -ne Außerdem wird der eindeutige Ausdruck analysiert.(5)
Angabe der Ausgabeinformationen des Analyseergebnisses(output)
            -normal (default)Zeigen Sie nur das endgültige Analyseergebnis an(1)
            -Detail Möglichkeit der Abhängigkeit Linienbeispiel, Ähnlichkeitsmatrix zwischen Klauseln usw. werden ebenfalls angezeigt.(2)
            -Debuggen Detailliertere Informationen während der Analyse anzeigen(3)
        """

        def set_argument(f, l, o):
            arg = ['juman|knp']
            if f == "tab":
                arg.append("-tab")
            elif f == "td":
                arg.append("-td")
            elif f == "tree":
                arg.append("-tree")
            elif f == "tab1":
                arg.append("-bnsttab")
            elif f == "tree1":
                arg.append("-bnsttree")
            elif f == "sexp":
                arg.append("-sexp")
            else:
                arg.append("-simple")

            if l == 1:
                arg.append("-bnst")
            elif l == 2:
                arg.append("-dpnd")
            elif l == 3:
                arg.append("-case")
            elif l == 5:
                arg.append("-ne")
            else:
                arg.append("-anaphora")

            if o == 2:
                arg.append("-detail")
            elif o == 3:
                arg.append("-debug")
            else:
                arg.append("-normal")
            return arg

        if fmt is None:
            fmt = "tab"
        if level is None:
            level = 4
        if output is None:
            output = 1

        if os.path.exists(self.homefldr) == False:
            raise FileNotFoundError

        try:
            with NamedTemporaryFile(delete=False, dir=self.homefldr) as temp:
                try:
                    j_txt = j_txt.encode(self.text_encoding)
                except:
                    j_txt = self.get_encode_original(j_txt)
                temp.write(j_txt)
        except Exception as e:
            print(e)
            raise UnicodeTranslateError
        else:
            command = set_argument(fmt, level, output)
            process = subprocess.Popen(command, shell=True, stdin=open(temp.name, 'r'), stdout=subprocess.PIPE)
            output = process.communicate()[0]
        finally:
            temp.close()
            #TMP-Datei löschen
            os.unlink(temp.name)

        return output.decode(self.text_encoding)

if __name__ == "__main__":
    operation_japanese = JapaneseDependencyRelation('shift-jis')
    text = 'Der Kunde nebenan ist ein Kunde, der oft Kakis isst'
    # Mecab
    print(operation_japanese.do_mecab(text))
    # Cabocha
    print(operation_japanese.do_cabocha(text, "xml"))
    print(operation_japanese.do_cabocha(text, "tree"))
    print(operation_japanese.do_cabocha(text, "word"))
    # KNP
    print(operation_japanese.do_knp(text, "tab"))
    print(operation_japanese.do_knp(text, "td"))
    print(operation_japanese.do_knp(text, "simple"))
    print(operation_japanese.do_knp(text, "tree"))
    print(operation_japanese.do_knp(text, "tab1"))
    print(operation_japanese.do_knp(text, "tree1"))
    print(operation_japanese.do_knp(text, "sexp"))

Recommended Posts

Mecab / Cabocha / KNP unter Python + Windows
Python Basic ② in Windows
Installieren Sie Python unter Windows
Aktivieren Sie Python virtualenv unter Windows
Führen Sie Openpose unter Python (Windows) aus.
Python + Kivy-Entwicklung unter Windows
Sphinx-Autobuild (0.5.2) unter Windows7, Python 3.5.1, Sphinx 1.3.5
Erstellen Sie eine Python-Umgebung unter Windows
Erstellen Sie eine Python-Umgebung mit Windows
Ich habe Python unter Windows ausgeführt
[Python] [Chainer] [Windows] Chainer unter Windows installieren
Verwenden Sie Python unter Windows (PyCharm)
Python-Umgebungskonstruktionsnotiz unter Windows 10
Python 3.6 unter Windows ... und zu Xamarin.
Installieren von Kivy unter Windows 10 64bit Python3.5
Aufbau einer Anaconda-Python-Umgebung unter Windows 10
Setzen Sie MeCab in "Windows 10; Python3.5 (64bit)"
Python2.7-Installation in einer Windows 32-Bit-Umgebung
Hinweise zur Verwendung von MeCab aus Python
Installieren Sie xgboost (Python-Version) unter Windows
Installieren Sie Python unter Windows + pip + virtualenv
Installieren Sie Pytorch unter Blender 2.90 Python unter Windows
Verknüpfen Sie Modelica und Python unter Windows
Python + Django + Scikit-Learn + Mecab (1) mit Heroku
Windows 10: Installieren der MeCab-Bibliothek für Python
Installieren von Kivy-Designer unter Windows 10 64-Bit Python3.5
Python + Django + Scikit-Learn + Mecab (2) mit Heroku
Installieren Sie die Python-Entwicklungsumgebung unter Windows 10
Unter Windows erstellte Python-CGI-Datei
Erste Schritte mit Python 3.8 unter Windows
Reproduzieren Sie die One-Touch-Suche mit Python 3.7.3. (Windows 10)
Hinweise zur Verwendung von OpenCV mit Windows 10 Python 3.8.3.
Von Python bis zur Verwendung von MeCab (und CaboCha)
Führen Sie das Servo mit Python unter ESP32 (Windows) aus.
Build-Umgebung für Python 2.7, 3.4, 3.5-Erweiterungsmodule unter Windows
[Kivy] So installieren Sie Kivy unter Windows [Python]
Virtualenv funktioniert nicht unter Python 3.5 (Windows)
Verwenden Sie es, ohne Python 2.x unter Windows zu installieren
Tweet-Analyse mit Python, Mecab und CaboCha
Stellen Sie pyknp (JUMAN, KNP) in Windows zur Verfügung
Setzen Sie Cabocha 0.68 in Windows ein und versuchen Sie, die Abhängigkeit mit Python zu analysieren
Twitter mit Python3
Python Windows-Umgebung
Python-Installation (Windows)
Python auf Mac
MeCab von Python
Setzen Sie die MeCab-Bindung für Python unter Windows, Mac und Linux mit pip ein
Python auf Windbg
Installieren Sie Python3.5 + NumPy + SciPy und führen Sie es unter Windows 10 aus
Setzen Sie MicroPython unter Windows ein, um ESP32 unter Python auszuführen
Installieren Sie Python3, Numpy, Pandas, Matplotlib usw. unter Windows
(Windows) Ursachen und Problemumgehungen für UnicodeEncodeError in Python 3
Erstellen Sie einfach eine Python 3-Ausführungsumgebung unter Windows
Hinweise zur Installation von Python3 und zur Verwendung von pip unter Windows7
Installieren Sie OpenCV 4.0 und Python 3.7 unter Windows 10 mit Anaconda
So führen Sie MeCab unter Ubuntu 18.04 LTS Python aus
[Python] So installieren Sie OpenCV unter Anaconda [Windows]
[Hinweis] Installieren von Python 3.6 + α unter Windows und RHEL
Installieren von TensorFlow unter Windows Easy für Python-Anfänger