[PYTHON] 100 coups de traitement linguistique (2020): 40

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

100 traitements linguistiques frappent 03 ~ 05
100 coups de traitement linguistique (2020): 40
100 coups de traitement linguistique (2020): 32
100 coups de traitement linguistique (2020): 35
100 coups de traitement linguistique (2020): 47
100 coups de traitement linguistique (2020): 39
100 coups de traitement linguistique (2020): 22
100 coups de traitement linguistique (2020): 26
100 coups de traitement linguistique (2020): 34
100 coups de traitement linguistique (2020): 42
100 coups de traitement linguistique (2020): 29
100 coups de traitement linguistique (2020): 49
Le traitement de 100 langues frappe 06 ~ 09
100 coups de traitement linguistique (2020): 43
100 coups de traitement linguistique (2020): 24
100 coups de traitement linguistique (2020): 45
100 coups de traitement linguistique (2020): 10-19
100 coups de traitement linguistique (2020): 30
100 coups de traitement linguistique (2020): 00-09
100 coups de traitement linguistique (2020): 31
100 coups de traitement linguistique (2020): 48
100 coups de traitement linguistique (2020): 44
100 coups de traitement linguistique (2020): 41
100 coups de traitement linguistique (2020): 37
100 coups de traitement linguistique (2020): 25
100 coups de traitement linguistique (2020): 23
100 coups de traitement linguistique (2020): 33
100 coups de traitement linguistique (2020): 20
100 coups de traitement linguistique (2020): 27
100 coups de traitement linguistique (2020): 46
100 coups de traitement linguistique (2020): 21
100 coups de traitement linguistique (2020): 36
100 coups de traitement du langage amateur: 41
100 coups de traitement du langage amateur: 71
100 coups de traitement du langage amateur: 56
100 coups de traitement du langage amateur: 24
100 coups de traitement du langage amateur: 50
100 coups de traitement du langage amateur: 59
100 coups de traitement du langage amateur: 70
100 coups de traitement du langage amateur: 62
100 coups de traitement du langage amateur: 60
100 coups de traitement du langage amateur: 92
100 coups de langue amateur: 30
100 coups de langue amateur: 06
100 coups de traitement du langage amateur: 84
100 coups de traitement du langage amateur: 81
100 coups de langue amateur: 33
100 coups de traitement du langage amateur: 46
100 coups de traitement du langage amateur: 88
100 coups de traitement du langage amateur: 89
100 coups de traitement du langage amateur: 40
100 coups de traitement du langage amateur: 45
100 coups de traitement du langage amateur: 43
100 coups de traitement du langage amateur: 55
100 coups de traitement du langage amateur: 22
100 coups de traitement du langage amateur: 61
100 coups de traitement du langage amateur: 94
100 coups de traitement du langage amateur: 54
100 coups de langue amateur: 04
100 coups de traitement du langage amateur: 63
100 coups de traitement du langage amateur: 78