[PYTHON] 100 natürliche Sprachverarbeitung klopft Kapitel 4 Morphologische Analyse (erste Hälfte)

Eine Aufzeichnung zur Lösung der Probleme in der ersten Hälfte von Kapitel 4. Die Zieldatei ist neko.txt, wie auf der Webseite gezeigt.

Verwenden Sie MeCab, um den Text (neko.txt) von Natsume Sosekis Roman "Ich bin eine Katze" morphologisch zu analysieren und das Ergebnis in einer Datei namens neko.txt.mecab zu speichern. Verwenden Sie diese Datei, um ein Programm zu implementieren, das die folgenden Fragen beantwortet. Verwenden Sie für die Probleme 37, 38, 39 matplotlib oder Gnuplot.

</ i> 30. Lesen der Ergebnisse der morphologischen Analyse

Implementieren Sie ein Programm, das die Ergebnisse der morphologischen Analyse liest (neko.txt.mecab). Jedes morphologische Element wird jedoch in einem Zuordnungstyp mit der Oberfläche, der Grundform (Basis), einem Teil des Wortes (pos) und einem Teil der Wortunterklassifizierung 1 (pos1) als Schlüssel gespeichert, und ein Satz wird als Liste morphologischer Elemente (Zuordnungstyp) ausgedrückt. Machen wir das. Verwenden Sie für die restlichen Probleme in Kapitel 4 das hier erstellte Programm.

# -*- coding: utf-8 -
__author__ = 'todoroki'

def mecab_reader(mecabfile):
    sentences = []
    sentence = []
    for line in mecabfile:
        if line == "EOS\n":
            if len(sentence) > 0:
                sentences.append(sentence)
            sentence = []
        else:
            surface, features = line.split("\t")
            features = features.split(",")
            dic = {
                'surface': surface,
                'base': features[6],
                'pos': features[0],
                'pos1': features[1]
            }
            sentence.append(dic)
    return sentences

if __name__ == '__main__':
    inputfile = 'neko.txt.mecab'
    outputfile = 'neko.mecab_dic.txt'
    f = open(inputfile, 'r')
    g = open(outputfile, 'w')
    sentences = mecab_reader(f)

    for s in sentences:
        # print str(s).decode("string-escape")
        g.write(str(s).decode("string-escape") + "\n")

    f.close()
    g.close()

Wenn der Wörterbuchtyp "s" einschließlich Japanisch einfach "print s" ist, kann Japanisch nicht so angezeigt werden, wie es ist. Daher entspricht es, Japanisch als "str (s) .decode (" string-Escape ")" anzeigen zu können.

</ i> 31. Verb

Extrahieren Sie alle Oberflächenformen des Verbs.

# -*- coding: utf-8 -
__author__ = 'todoroki'

import problem30

def extract_verb(sentences):
    res = []
    for sentence in sentences:
        for morpheme in sentence:
            if morpheme['pos'] == 'Verb':
                res.append(morpheme['surface'])
    return res

if __name__ == "__main__":
    inputfile = 'neko.txt.mecab'
    outputfile = 'neko.mecab_verb.txt'
    f = open(inputfile, "r")
    g = open(outputfile, "w")
    sentences = problem30.mecab_reader(f)
    verbs = extract_verb(sentences)
    for verb in verbs:
        # print verb
        g.write(verb + '\n')
    f.close()
    g.close()

</ i> 32. Prototyp des Verbs

Extrahieren Sie alle Originalformen des Verbs.

# -*- coding: utf-8 -
__author__ = 'todoroki'

import problem30

def extract_verb_base(sentences):
    res = []
    for sentence in sentences:
        for morpheme in sentence:
            if morpheme['pos'] == 'Verb':
                res.append(morpheme['base'])
    return res

if __name__ == "__main__":
    inputfile = 'neko.txt.mecab'
    outputfile = 'neko.mecab_verb_base.txt'
    f = open(inputfile, "r")
    g = open(outputfile, "w")
    sentences = problem30.mecab_reader(f)
    verb_bases = extract_verb_base(sentences)
    for verb in verb_bases:
        # print verb
        g.write(verb + '\n')
    f.close()
    g.close()

</ i> 33.

Extrahieren Sie die gesamte Nomenklatur der Verbindung.

# -*- coding: utf-8 -
__author__ = 'todoroki'

import problem30

def extract_sahen(sentences):
    res = []
    for sentence in sentences:
        for morpheme in sentence:
            if morpheme['pos1'] == 'Verbindung ändern':
                res.append(morpheme['surface'])
    return res

if __name__ == "__main__":
    inputfile = 'neko.txt.mecab'
    outputfile = 'neko.mecab_sahen.txt'
    f = open(inputfile, "r")
    g = open(outputfile, "w")
    sentences = problem30.mecab_reader(f)
    sahens = extract_sahen(sentences)
    for sahen in sahens:
        # print sahen
        g.write(sahen + '\n')
    f.close()
    g.close()

</ i> 34. "B von A"

Extrahieren Sie die Nomenklatur, in der zwei Nomenklaturen durch "Nein" verbunden sind.

# -*- coding: utf-8 -
__author__ = 'todoroki'

import problem30

def extract_AofB(sentences):
    res = []
    for sentence in sentences:
        for k in xrange(len(sentence)-3):
            triple = sentence[k:k+3]
            b1 = triple[0]['pos'] == 'Substantiv'
            b2 = triple[1]['surface'] == 'von'
            b3 = triple[2]['pos'] == 'Substantiv'
            if b1 and b2 and b3:
                res.append(t['surface'] for t in triple)
    return res

if __name__ == "__main__":
    inputfile = 'neko.txt.mecab'
    outputfile = 'neko.mecab_AofB.txt'
    f = open(inputfile, "r")
    g = open(outputfile, "w")
    sentences = problem30.mecab_reader(f)
    res = extract_AofB(sentences)
    for r in res:
        # print "".join(r)
        g.write("".join(r) + '\n')
    f.close()
    g.close()

Recommended Posts