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.
――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 **
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.
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
Wenn man sich die morphologischen Ausgangselemente ansieht, wird "Ich bin eine Katze" in der ersten Zeile als richtige Nomenklatur identifiziert. Es kümmert mich nicht.
Das Ausgabeformat ist (laut mecab)
"Oberfläche \ t Teil des Wortes, Unterklassifizierung eines Teils des Wortes 1, Unterklassifizierung eines Teils des Wortes 2, Unterklassifizierung eines Teils des Wortes 3, Verwendungsart, Verwendungsform, Prototyp, Lesen, Aussprache"
Es sollten 10 Elemente sein, aber gelegentlich gab es eine Linie mit 8 Elementen, wie unten gezeigt. (Es gibt keine 9 Elemente)
['Nackenmuskel', 'Nomen', 'Allgemein', '*', '*', '*', '*', '* \ n'] ['Girigo', 'Nomenklatur', 'General', '*', '*', '*', '*', '* \ n'] ['Mushi', 'Nomenklatur', 'General', '*', '*', '*', '*', '* \ n']
Ich frage mich, ob es weggelassen wird.
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.
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
Extrahieren Sie alle Oberflächenformen des Verbs.
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'])
Extrahieren Sie alle Originalformen des Verbs.
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'])
Extrahieren Sie die Nomenklatur, in der zwei Nomenklaturen durch "Nein" verbunden sind.
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
Extrahieren Sie die Verkettung der Nomenklatur (Substantive, die nacheinander erscheinen) mit der längsten Übereinstimmung.
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
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.
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
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).
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
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.
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.
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.
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.
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.
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
Ein logarithmisches Histogramm sieht so aus
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.
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()
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.
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