ans40.py
"""
40.Lecture du résultat de l'analyse des dépendances (morphologie)
Implémentez la classe Morph qui représente la morphologie. Cette classe a surface et findall (pos1) comme variables membres.
De plus, le résultat de l'analyse de CaboCha (neko.txt.Lisez cabocha), exprimez chaque phrase sous forme de liste d'objets Morph et affichez la chaîne d'éléments morphologiques de la troisième phrase.
ans40_cabocha.py avec neko.txt.Générez du cabocha.
ans40.L'exemple généré par sh est neko.txt.cabocha2. Si vous comparez, neko.txt.le cabocha est plus beau.
ans40.La mise en œuvre de py est directe neko.txt.La vitesse est rapide car le cabocha est chargé.
ans40_2.La mise en œuvre de py prend du temps d'analyse. Non recommandé.
"""
from typing import List
class Morph:
def __init__(self, data):
self.surface = data["surface"]
self.base = data["base"]
self.pos = data["pos"]
self.pos1 = data["pos1"]
def __repr__(self):
return "surface[{}]\tbase[{}]\tpos[{}]\tpos1[{}]".format(
self.surface, self.base, self.pos, self.pos1
)
def read_file(fpath: str) -> List[List[str]]:
"""Get clear format of parsed sentences.
Args:
fpath (str): File path.
Returns:
List[List[str]]: List of sentences, and each sentence contains a word list.
e.g. result[1]:
['* 0 1D 0/1 0.000000',
'je\t substantif,Synonyme,Général,*,*,*,je,Wagahai,Wagahai',
'Est\t assistant,Assistance,*,*,*,*,Est,C,sensationnel',
'* 1 -1D 0/2 0.000000',
'Chat\t substantif,Général,*,*,*,*,Chat,chat,chat',
'alors\t verbe auxiliaire,*,*,*,Spécial,Type continu,Est,De,De',
'y a-t-il\t verbe auxiliaire,*,*,*,Cinq étapes, La ligne Al,Forme basique,y a-t-il,Al,Al',
'。\symbole t,Phrase,*,*,*,*,。,。,。']
"""
with open(fpath, mode="rt", encoding="utf-8") as f:
sentences = f.read().split("EOS\n")
return [sent.strip().split("\n") for sent in sentences if sent.strip() != ""]
# ans40
def convert_sent_to_morph(sent: List[str]) -> List[Morph]:
"""Extract word and convert to morph.
Args:
sent (List[str]): A sentence contains a word list.
e.g. sent:
['* 0 2D 0/0 -0.764522',
'\u3000\symbole t,Vide,*,*,*,*,\u3000,\u3000,\u3000',
'* 1 2D 0/1 -0.764522',
'je\t substantif,Synonyme,Général,*,*,*,je,Wagahai,Wagahai',
'Est\t assistant,Assistance,*,*,*,*,Est,C,sensationnel',
'* 2 -1D 0/2 0.000000',
'Chat\t substantif,Général,*,*,*,*,Chat,chat,chat',
'alors\t verbe auxiliaire,*,*,*,Spécial,Type continu,Est,De,De',
'y a-t-il\t verbe auxiliaire,*,*,*,Cinq étapes, La ligne Al,Forme basique,y a-t-il,Al,Al',
'。\symbole t,Phrase,*,*,*,*,。,。,。']
Returns:
List[Morph]: [description]
"""
res = []
for word in sent:
if word[0] == "*":
continue
features = word.split(",")
dic = {
"surface": features[0].split("\t")[0],
"base": features[6],
"pos": features[0].split("\t")[1],
"pos1": features[1],
}
res.append(Morph(dic))
return res
fpath = "neko.txt.cabocha"
sentences = read_file(fpath)
morph_sents = [convert_sent_to_morph(sent) for sent in sentences]
for m in morph_sents[2]:
print(m) # __str__()
# surface[Nom] base[Nom] pos[nom] pos1[Général]
# surface[Est] base[Est] pos[Particule] pos1[係Particule]
# surface[encore] base[encore] pos[adverbe] pos1[Connexion auxiliaire]
# surface[Non] base[Non] pos[adjectif] pos1[Indépendance]
# surface[。] base[。] pos[symbole] pos1[Phrase]
ans40_2.py
from typing import List
import CaboCha
def read_file(path: str) -> List[str]:
data = []
with open(path) as f:
for line in f:
line = line.strip()
if line != "":
data.append(line)
return data
class Morph:
def __init__(self, surface, base, pos, pos1):
self.surface = surface #Type de surface
self.base = base #Forme basique
self.pos = pos #Partie
self.pos1 = pos1 #Sous-classification des paroles des parties 1
def __str__(self):
s = "surface[{}]\tbase[{}]\tpos[{}]\tpos1[{}]"
return s.format(self.surface, self.base, self.pos, self.pos1)
def get_morph(sent: str) -> list:
c = CaboCha.Parser()
parsed_sent = c.parse(sent).toString(CaboCha.FORMAT_LATTICE)
words = parsed_sent.strip().split("\n")
# e.g. ['* 0 -1D 0/0 0.000000', 'un\t substantif,nombre,*,*,*,*,un,Ichi,Ichi', 'EOS']
morphs = []
for word in words:
#Le début est*La ligne est le résultat de l'analyse des dépendances, alors sautez-la
if word[0] == "*" or word.strip() == "EOS":
continue
#La couche de surface est délimitée par des tabulations, sinon','Séparer par pause
features = word.split(",")
morphs.append(
Morph(
features[0].split("\t")[0], # surface
features[6], # base
features[0].split("\t")[1], # pos
features[1], # pos1
)
)
return morphs
file_path = "neko.txt"
sentence_list = read_file(file_path)
# ['un', 'Je suis un chat.', 'Il n'y a pas encore de nom.', 'Je n'ai aucune idée d'où je suis né.']
morphs = [get_morph(sent) for sent in sentence_list] #Le temps d'analyse de Cabocha est un peu long
for m in morphs[3]:
print(m)
# surface[Où] base[Où] pos[nom] pos1[代nom]
# surface[alors] base[alors] pos[Particule] pos1[格Particule]
# surface[Née] base[Néeる] pos[verbe] pos1[Indépendance]
# surface[Ta] base[Ta] pos[Verbe auxiliaire] pos1[*]
# surface[Ou] base[Ou] pos[Particule] pos1[副Particule/並立Particule/終Particule]
# surface[Tonto] base[Tonto] pos[adverbe] pos1[Général]
# surface[S'inscrire] base[S'inscrire] pos[nom] pos1[Changer de connexion]
# surface[Mais] base[Mais] pos[Particule] pos1[格Particule]
# surface[Tsuka] base[Tsukuri] pos[verbe] pos1[Indépendance]
# surface[Nu] base[Nu] pos[Verbe auxiliaire] pos1[*]
# surface[。] base[。] pos[symbole] pos1[Phrase]
ans40_parse_to_cabocha_format.py
import CaboCha
def parse_txt(file_in: str, file_out: str) -> None:
"""Convert neko.txt to cabocha format in a clear format."""
with open(file_in) as f_in, open(file_out, "w") as f_out:
cabocha = CaboCha.Parser()
for line in f_in:
line = line.strip()
if line == "":
continue
parsed_sent = cabocha.parse(line).toString(CaboCha.FORMAT_LATTICE)
f_out.write(parsed_sent)
file_in = "neko.txt"
file_out = "neko.txt.cabocha"
parse_txt(file_in, file_out)
ans40.sh
cat neko.txt | cabocha -f1 > neko.txt.cabocha
Recommended Posts