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.
** 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"))