Lorsque vous utilisez Mecab / Cabocha / KNP sous Windows + python, si vous essayez d'utiliser "import mecab" ou "import Cabocha", la recompilation, la spécification UTF-8, etc. seront gênantes. Par conséquent, utilisez l'appel externe Sjift-Jis + pour activer l'installation par défaut.
** Définissez homefldr n'importe où ** (PostScript 2017/12/17: prend également en charge KNP)
import os
import subprocess
from tempfile import NamedTemporaryFile
class JapaneseDependencyRelation:
def __init__(self, encoding=None):
if encoding is None:
encoding = 'utf-8'
# Mecab,Encodage Cabocha(Suivez pendant l'installation)
self.text_encoding = encoding
#Emplacement de création du fichier TMP
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
'''
#argument cabocha
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):
"""
Spécifier l'affichage des résultats d'analyse(fmt)
-onglet Affichage tabulaire(tab)
-Affichage au format tabulaire avec une sortie moins simple(simple)
-td Affichage correspondant à "Outil d'affichage général des résultats d'analyse" 1(td)
-tree (default)Affichage par arborescence(tree)
-Affichage tabulaire des clauses bnsttab(tab1)
-Affichage de l'arborescence des clauses bnsttree(tree1)
-affichage au format de liste sexp(sexp)
Spécifier le niveau d'analyse(level)
-bnst Convertit une chaîne morphologique en chaîne de clauses(1)
-dpnd De plus, effectuez une analyse des dépendances entre les clauses(2)
-case (default)De plus, analysez la relation de cas(3)
-anaphora En outre, analysez la relation de correspondance(4)
-ne De plus, l'expression unique est analysée.(5)
Spécification des informations de sortie du résultat de l'analyse(output)
-normal (default)Afficher uniquement le résultat final de l'analyse(1)
-detail Possibilité de dépendance Exemple de ligne, matrice de similarité entre clauses, etc. sont également affichées.(2)
-debug Affichage d'informations plus détaillées au milieu de l'analyse(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()
#Supprimer le fichier TMP
os.unlink(temp.name)
return output.decode(self.text_encoding)
if __name__ == "__main__":
operation_japanese = JapaneseDependencyRelation('shift-jis')
text = 'Le client d'à côté est un client qui mange souvent des kakis'
# 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