[PYTHON] 100 Sprachverarbeitung Knock Kapitel 4: Morphologische Analyse

Kapitel 4: Morphologische Analyse

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.

Artikelbeschreibung

――Dieser Artikel enthält die Ergebnisse der Lösung von Language Processing 100 Knock 2020 durch einen Amateurstudenten sowohl in Sprachverarbeitung als auch in Python. .. Ich freue mich sehr, auf Fehler oder Verbesserungen hinweisen zu können. Vielen Dank. ―― ~~ Ich verfolge die Inspektion von Pycharm, um Python zu studieren, daher gibt es möglicherweise viel nutzlosen Code. ~~

** Umgebung **

Vorbereitungen

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.

Führen Sie also das folgende Programm aus, um es zu erstellen.

** Erstelltes Programm (Klick) **

pre_processing.py


# -*- coding: utf-8 -*-

import MeCab
from MeCab import Tagger

analyser: Tagger = MeCab.Tagger("-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd")

with open('./neko.txt', "r") as infile:
    lines = infile.readlines()

with open('./neko.txt.mecab.txt', "w") as outfile:
    for line in lines:
        mors = analyser.parse(line)
        outfile.write(mors)

note

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 dem Schlüssel der Oberflächenform (Oberfläche), der Grundform (Basis), einem Teil des Wortes (pos) und einem Teil der Wortunterklassifizierung 1 (pos1) 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.

** Erstelltes Programm (Klick) **

k30input.py


#! /usr/bin/env python3
# -*- coding: utf-8 -*-

import re
import sys

def input_macab(filename):
    with open(filename, "r") as infile:
        sentences = []
        sentence =[]
        for line in infile.readlines():
            #Oberflächenschicht \ t Teil Texte,Teiltexte Unterklassifizierung 1,Teil Teil Unterklassifizierung 2,Teiltexte Unterklassifizierung 3,Nutzungsart,Nutzungsart,Prototyp,lesen,Aussprache
            if line == 'EOS\n':
                if len(sentence) > 0:
                    sentences.append(sentence)
                    sentence =[]
                continue

            sline = re.split('[,\t]', line)

            if len(sline) < 8:
                print("###Lese fehler:\n", sline + "\n")
                sys.exit(1)

            sentence.append({'surface': sline[0], 'base': sline[7], 'pos': sline[1], 'pos1': sline[2] })

    print("**Laden abgeschlossen**\n")
    return sentences

if __name__ == '__main__':
    filename = "neko.txt.mecab.txt"
    ss = input_macab(filename)
    print("")
    print("Es wurde als Haupt ausgeführt.")

note

31. Verb

Extrahieren Sie alle Oberflächenformen des Verbs.

** Erstelltes Programm (Klick) **

k31verb_surface.py


# -*- coding: utf-8 -*-
import k30input

sentences = k30input.input_macab("neko.txt.mecab.txt")

for sentence in sentences:
    for mor in sentence:
        if mor['pos']=="Verb":
            print(mor['surface'])

32. Prototyp des Verbs

Extrahieren Sie alle Originalformen des Verbs.

** Erstelltes Programm (Klick) **

k32verb_base.py


# -*- coding: utf-8 -*-
import k30input

sentences = k30input.input_macab("neko.txt.mecab.txt")

for sentence in sentences:
    for mor in sentence:
        if mor['pos']=="Verb":
            print(mor['base'])

33. "B von A"

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

** Erstelltes Programm (Klick) **

k33noun_no_noun.py


# -*- coding: utf-8 -*-
import k30input

sentences = k30input.input_macab("neko.txt.mecab.txt")

noun_flag = 0
no_flag = 0
noun1: str

for sentence in sentences:
    for mor in sentence:
        if noun_flag == 0 :
            if mor['pos']=="Substantiv":
                noun_flag = 1
                noun1 = mor['surface']
        elif noun_flag == 1 and no_flag == 0:
            if mor['surface']=="von":
                no_flag = 1
            else:
                noun1 = ""
                noun_flag = no_flag = 0
        elif noun_flag == 1 and no_flag == 1:
            if mor['pos']=="Substantiv":
                print(noun1+"von"+mor['surface'])
                noun_flag = no_flag = 0

34. Verkettung der Nomenklatur

Extrahieren Sie die Verkettung der Nomenklatur (Substantive, die nacheinander erscheinen) mit der längsten Übereinstimmung.

** Erstelltes Programm (Klick) **

k34nounoun_longest.py


# -*- coding: utf-8 -*-
import k30input

sentences = k30input.input_macab("neko.txt.mecab.txt")

nouns = []

for sentence in sentences:
    for mor in sentence:
        if mor['pos']=="Substantiv":
            nouns.append(mor['surface'])
        else:
            if len(nouns) > 1:
                for i in nouns:
                    print(i+" ", end="")
                print("")
            nouns = []

note

35. Häufigkeit des Auftretens von Wörtern

Suchen Sie die Wörter, die im Satz erscheinen, und ihre Häufigkeit des Auftretens, und ordnen Sie sie in absteigender Reihenfolge der Häufigkeit des Auftretens an.

** Erstelltes Programm (Klick) **

k35word_freq.py


# -*- coding: utf-8 -*-
import k30input

sentences = k30input.input_macab("neko.txt.mecab.txt")

nouns = []

mor_freq = dict()

for sentence in sentences:
    for mor in sentence:
        #Der Schlüssel ist(Oberflächensystem,Teil)Taple,Der Wert ist die Anzahl der Vorkommen.
        mor_freq.setdefault((mor['surface'], mor['pos']), 0)
        mor_freq[(mor['surface'], mor['pos'])] = mor_freq[(mor['surface'], mor['pos'])] + 1

ranking = sorted(mor_freq.items(), key=lambda i: i[1], reverse=True)

for i in ranking:
    print(i)

note

36. Top 10 der häufigsten Wörter

Zeigen Sie die 10 Wörter mit hoher Häufigkeit des Auftretens und deren Häufigkeit des Auftretens in einem Diagramm an (z. B. einem Balkendiagramm).

** Erstelltes Programm (Klick) **

k36word10_graph.py


# -*- coding: utf-8 -*-
from matplotlib import pyplot
import k30input

sentences = k30input.input_macab("neko.txt.mecab.txt")

nouns = []

mor_freq = dict()

for sentence in sentences:
    for mor in sentence:
        #Der Schlüssel ist(Oberflächensystem,Teil)Taple,Der Wert ist die Anzahl der Vorkommen.
        mor_freq.setdefault((mor['surface'], mor['pos']), 0)
        mor_freq[(mor['surface'], mor['pos'])] = mor_freq[(mor['surface'], mor['pos'])] + 1

ranking = sorted(mor_freq.items(), key=lambda i: i[1], reverse=True)

top10 = ranking[0:10]

x = []
y = []
for i in top10:
    x.append(i[0][0])
    y.append(i[1])

pyplot.bar(x, y)

#Graphentitel
pyplot.title('Top 10 der häufigsten Wörter')

#Diagrammachse
pyplot.xlabel('Morphem')
pyplot.ylabel('Frequenz')

pyplot.show()

note

37. Top 10 Wörter, die häufig zusammen mit "Katze" vorkommen

Zeigen Sie 10 Wörter an, die häufig zusammen mit "cat" (hohe Häufigkeit des gemeinsamen Auftretens) und deren Häufigkeit des Auftretens in einem Diagramm (z. B. einem Balkendiagramm) vorkommen.

** Erstelltes Programm (Klick) **

k37co_cat.py


# -*- coding: utf-8 -*-
from matplotlib import pyplot
import k30input

sentences = k30input.input_macab("neko.txt.mecab.txt") # neko.txt.mecab.clean.txt

nouns = []

tmp_count = dict()
co_cat_count = dict()
cat_flag = 0

for sentence in sentences:
    for mor in sentence:
        #Der Schlüssel ist(Oberflächensystem,Teil)Taple,Der Wert ist die Anzahl der Vorkommen.
        tmp_count.setdefault((mor['surface'], mor['pos']), 0)
        tmp_count[(mor['surface'], mor['pos'])] = tmp_count[(mor['surface'], mor['pos'])] + 1
        if mor['surface'] == "Katze":
            cat_flag = 1

    if cat_flag == 1:
        for k, v in tmp_count.items():
            co_cat_count.setdefault(k, 0)
            co_cat_count[k] = co_cat_count[k] + v
        cat_flag = 0
    tmp_count = {}

ranking = sorted(co_cat_count.items(), key=lambda i: i[1], reverse=True)

top10 = ranking[0:10]

x = []
y = []
for i in top10:
    x.append(i[0][0])
    y.append(i[1])

pyplot.bar(x, y)

#Graphentitel
pyplot.title('Top 10 Wörter, die häufig zusammen mit "Katze" vorkommen')

#Diagrammachse
pyplot.xlabel('Morphem')
pyplot.ylabel('Frequenz')

pyplot.show()

note

Koexistenz bedeutet, dass, wenn ein Wort in einem Satz (oder Satz) erscheint, häufig ein anderes begrenztes Wort im Satz (Satz) erscheint. ^ 1

――Dieses Mal sind es die Top 10 Wörter (Morphologie), die häufig in Sätzen vorkommen, die "Katze" enthalten. ―― "Katze" selbst sollte ausgeschlossen werden, aber ich habe es verlassen, weil es als eines der Kriterien interessant ist und es leicht gelöscht werden kann, wenn Sie es löschen möchten.

Ergebnis

1 2 3 4 5 6 7 8 9 10
von Ist Katze Zu Zu Hand Wann Aber

Phrasenpunkte, Hilfswörter und Hilfsverben werden ebenfalls als Wörter gezählt, daher ist es nicht interessant, weil sich das Ergebnis nicht wie ein Ergebnis anfühlt, weil es eine "Katze" ist. Mit anderen Worten, es ist nicht interessant, weil jedes Wort mit diesen Wörtern koexistieren wird.

Ergebnis 2

Das Ergebnis der Erstellung einer Datei neko.txt.mecab.clean.txt, die die morphologischen Informationen von Satzzeichen, Hilfswörtern und Hilfsverben aus neko.txt.mecab ausschließt

1 2 3 4 5 6 7 8 9 10
Katze Shi Ding ich von Ist Gibt es Machen Mensch こvon

――Obwohl es etwas besser ist, habe ich nicht das Gefühl, dass die Eigenschaften von "Katzen" bereits erfasst wurden. ――Ich frage mich, ob in einem Satz "Ja, gibt es, mach" steht.

38. Histogramm

Zeichnen Sie ein Histogramm der Häufigkeit des Auftretens von Wörtern. Die horizontale Achse stellt jedoch die Häufigkeit des Auftretens dar und ist eine lineare Skala von 1 bis zum Maximalwert der Häufigkeit des Auftretens von Wörtern. Die vertikale Achse ist die Anzahl der verschiedenen Wörter (Anzahl der Typen), die zur Häufigkeit des Auftretens auf der x-Achse geworden sind.

** Erstelltes Programm (Klick) **

k38histogram.py


# -*- coding: utf-8 -*-
from matplotlib import pyplot
import k30input

sentences = k30input.input_macab("neko.txt.mecab.txt") # neko.txt.mecab.clean.txt

nouns = []

tmp_count = dict()
co_cat_count = dict()
cat_flag = 0

for sentence in sentences:
    for mor in sentence:
        #Der Schlüssel ist(Oberflächensystem,Teil)Taple,Der Wert ist die Anzahl der Vorkommen.
        tmp_count.setdefault((mor['surface'], mor['pos']), 0)
        tmp_count[(mor['surface'], mor['pos'])] = tmp_count[(mor['surface'], mor['pos'])] + 1
        if mor['surface'] == "Katze":
            cat_flag = 1

    if cat_flag == 1:
        for k, v in tmp_count.items():
            co_cat_count.setdefault(k, 0)
            co_cat_count[k] = co_cat_count[k] + v
        cat_flag = 0
    tmp_count = {}

ranking = sorted(co_cat_count.items(), key=lambda i: i[1], reverse=True)

x = []
for i in ranking:
    x.append(i[1])

pyplot.hist(x, range=(0,ranking[0][1]))

#Graphentitel
pyplot.title('Häufigkeit des Auftretens von Wörtern')

#Diagrammachse
pyplot.xlabel('Häufigkeit des Auftretens')
pyplot.ylabel('Anzahl der Typen')

pyplot.show()

note

Ergebnis

Figure_1.png

Ein logarithmisches Histogramm sieht so aus

Figure_1.png

39. Zipfs Gesetz

Zeichnen Sie beide logarithmischen Graphen mit der Häufigkeit des Auftretens von Wörtern auf der horizontalen Achse und der Häufigkeit des Auftretens auf der vertikalen Achse.

** Erstelltes Programm (Klick) **

k39loglog_graph.py


# -*- coding: utf-8 -*-
from matplotlib import pyplot
import k30input
import numpy as np

sentences = k30input.input_macab("neko.txt.mecab.txt") # neko.txt.mecab.clean.txt

nouns = []

tmp_count = dict()
co_cat_count = dict()
cat_flag = 0

for sentence in sentences:
    for mor in sentence:
        #Der Schlüssel ist(Oberflächensystem,Teil)Taple,Der Wert ist die Anzahl der Vorkommen.
        tmp_count.setdefault((mor['surface'], mor['pos']), 0)
        tmp_count[(mor['surface'], mor['pos'])] = tmp_count[(mor['surface'], mor['pos'])] + 1
        if mor['surface'] == "Katze":
            cat_flag = 1

    if cat_flag == 1:
        for k, v in tmp_count.items():
            co_cat_count.setdefault(k, 0)
            co_cat_count[k] = co_cat_count[k] + v
        cat_flag = 0
    tmp_count = {}

ranking = sorted(co_cat_count.items(), key=lambda i: i[1], reverse=True)

y = []
for i in ranking:
    y.append(i[1])
x = range(len(ranking))

print("size", len(ranking))

pyplot.title('Häufigkeit des Auftretens von Wörtern')
pyplot.xlabel('Ereignishäufigkeits-Ranglistenprotokoll(y)')
pyplot.ylabel('Anzahl der Protokolltypen(x)')

# scatter(Streudiagramm)Ich wusste nicht, wie ich es logarithmisch speichern soll, also habe ich hier nur Süßigkeiten. Deshalb benutze ich Numpy.
pyplot.scatter(np.log(x),np.log(y))
pyplot.show()

Ergebnis

Figure_1.png

note

Es ist eine empirische Regel, dass das Verhältnis des Elements mit der k-ten höchsten Auftrittsfrequenz zum Ganzen proportional zu 1 / k ist. [^ 3]

――Es scheint, dass dieses Gesetz nicht nur eine empirische Regel der natürlichen Sprache ist, sondern für verschiedene Phänomene gilt.

ウィキペディア(30ヶ国語版)における単語の出現頻度

Impressionen

Es ist immer noch in der Kategorie Python zu studieren. Das Studieren der Module Numpy, Pandas und Sammlungen war jedoch mühsam, und ich musste sie nicht verwenden. Aber ist es nicht schwieriger, es nicht zu benutzen? Außerdem wollte ich den gleichen Prozess funktional und cool machen. Fahren Sie mit dem nächsten Mal fort. (Ich werde es auf jeden Fall tun)

[^ 2]: --Wixtionäre japanische Version [^ 3]: [Zip's Law-Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B8%E3%83%83%E3%83%97%E3%81%AE% E6% B3% 95% E5% 89% 87)

Recommended Posts

100 Sprachverarbeitung Knock 2020 Kapitel 4: Morphologische Analyse
100 Sprachverarbeitung Knock Kapitel 4: Morphologische Analyse
100 Language Processing Knock 2015 Kapitel 4 Morphologische Analyse (30-39)
100 Sprachverarbeitung Knock 2015 Kapitel 5 Abhängigkeitsanalyse (40-49)
100 Sprachverarbeitungsklopfen 2020: Kapitel 4 (morphologische Analyse)
100 Sprachverarbeitung Knock 2020 Kapitel 5: Abhängigkeitsanalyse
[Sprachverarbeitung 100 Schläge 2020] Kapitel 4: Morphologische Analyse
100 Sprachverarbeitung Knock 2020 Kapitel 1
100 Sprachverarbeitung Knock Kapitel 1
100 Sprachverarbeitung Knock 2020 Kapitel 3
100 Sprachverarbeitung Knock 2020 Kapitel 2
Sprachverarbeitung 100 Schläge Kapitel 4: Morphologische Analyse 31. Verben
100 Sprachverarbeitung Knock-57: Abhängigkeitsanalyse
100 Sprachverarbeitung Knock Kapitel 1 (Python)
100 Sprachverarbeitung Knock Kapitel 2 (Python)
Verarbeitung natürlicher Sprache 1 Morphologische Analyse
100 Sprachverarbeitung Knock-56: Co-Referenz-Analyse
100 Sprachverarbeitung klopft Morphologische Analyse in Kapitel 4 gelernt
100 natürliche Sprachverarbeitung klopft Kapitel 4 Morphologische Analyse (erste Hälfte)
100 Sprachverarbeitung Knock 2020 Kapitel 2: UNIX-Befehle
100 Sprachverarbeitungsklopfen mit Python (Kapitel 1)
100 natürliche Sprachverarbeitung klopft Kapitel 4 Morphologische Analyse (zweite Hälfte)
100 Sprachverarbeitung Knock Kapitel 1 in Python
100 Sprachverarbeitung Knock 2020 Kapitel 9: RNN, CNN
[Sprachverarbeitung 100 Schläge 2020] Kapitel 5: Abhängigkeitsanalyse
100 Sprachverarbeitungsklopfen (2020): 28
Ich habe versucht, 100 Sprachverarbeitung klopfen 2020: Kapitel 3
100 Sprachverarbeitungsklopfen mit Python (Kapitel 3)
100 Sprachverarbeitungsklopfen: Kapitel 1 Vorbereitungsbewegung
100 Sprachverarbeitung Knock 2020 Kapitel 6: Maschinelles Lernen
100 Sprachverarbeitung Knock 2020 Kapitel 10: Maschinelle Übersetzung (90-98)
100 Sprachverarbeitung Knock-30 (unter Verwendung von Pandas): Lesen der Ergebnisse der morphologischen Analyse
100 Sprachverarbeitung Knock 2020 Kapitel 7: Word Vector
100 Sprachverarbeitung Knock 2020 Kapitel 8: Neuronales Netz
100 Sprachverarbeitung Knock-59: Analyse der S-Formel
100 Sprachverarbeitungsklopfen (2020): 38
Ich habe versucht, 100 Sprachverarbeitung klopfen 2020: Kapitel 1
100 Sprachverarbeitung klopfen 00 ~ 02
100 Sprachverarbeitung Knock 2020 Kapitel 1: Vorbereitende Bewegung
100 Sprachverarbeitung Knock Kapitel 1 von Python
100 Sprachverarbeitung Knock 2020 Kapitel 3: Reguläre Ausdrücke
Ich habe versucht, 100 Sprachverarbeitung zu klopfen 2020: Kapitel 2
Ich habe versucht, 100 Sprachverarbeitung zu klopfen 2020: Kapitel 4
Ich habe mit GiNZA v3.1 Kapitel 4 100 Sprachverarbeitungsklopfen 2020 durchgeführt
100 Sprachverarbeitungsklopfen mit Python (Kapitel 2, Teil 2)
100 Sprachverarbeitungsklopfen mit Python (Kapitel 2, Teil 1)
[Programmierer-Neuling "100 Sprachverarbeitung klopfen 2020"] Lösen Sie Kapitel 1
100 Sprachverarbeitung klopfen 2020 [00 ~ 39 Antwort]
100 Sprachverarbeitung klopfen 2020 [00-79 Antwort]
100 Amateur-Sprachverarbeitungsklopfen: 17
100 Sprachverarbeitung klopfen 2020 [00 ~ 49 Antwort]
100 Sprachverarbeitung Knock-52: Stemming
100 Sprachverarbeitungsklopfen ~ Kapitel 1
100 Amateur-Sprachverarbeitungsklopfen: 07
100 Sprachverarbeitung klopft Kapitel 2 (10 ~ 19)
100 Amateur-Sprachverarbeitungsklopfen: 09
100 Amateur-Sprachverarbeitungsklopfen: 47
100 Sprachverarbeitung Knock-53: Tokenisierung
100 Amateur-Sprachverarbeitungsklopfen: 97
100 Sprachverarbeitung klopfen 2020 [00 ~ 59 Antwort]
100 Amateur-Sprachverarbeitungsklopfen: 67