Ich habe versucht Sprachverarbeitung 100 Knock 2020. Klicken Sie hier für Links in anderen Kapiteln und klicken Sie hier für den Quellcode (https://github.com/makototama24/100knockLanguage).
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.
030.py
import pandas as pd
with open(file="neko.txt.mecab", mode="rt", encoding="utf-8") as neko:
nekotext = neko.readlines()
nekolist = []
for str in nekotext:
list = str.replace("\n", "").replace(" ", "").replace("\t", ",").split(",")
if list[0] != "EOS": nekolist.append([list[0], list[7], list[1], list[2]])
else: nekolist.append([list[0], "*", "*", "*"])
pd.set_option('display.unicode.east_asian_width', True)
df_neko = pd.DataFrame(nekolist, columns=["surface", "base", "pos", "pos1"])
print(df_neko)
# -> surface base pos pos1
#0 11 Nomen Nummer
#1 Symbol leer
#2 Ich bin Ich bin ein Synonym
#3 ist ein Assistent
#4 Katze Katze Nomenklatur allgemein...
Ich habe es in "Pandas" zusammengestellt, aber ... es ist praktisch, es sieht aus wie ein Mapping-Typ, nicht wahr? (Nein)
Extrahieren Sie alle Oberflächenformen des Verbs.
031.py
import input_neko as nk
df = nk.input()
print(df.query("pos == 'Verb'")["surface"].values.tolist())
# -> ['Geboren', 'Tsuka', 'Shi', 'Weinen',...
Ich verwende das Ergebnis von Nr. 30 als "Import". Der Typ "Serie" und der Typ "Liste" können ineinander konvertiert werden, was praktisch ist.
Extrahieren Sie alle Originalformen des Verbs.
032.py
import input_neko as nk
df = nk.input()
print(df.query("pos == 'Verb'")["base"].values.tolist())
# -> ['Geboren', 'Tsukuri', 'Machen', 'Schrei',...
Die "Oberfläche" von Nr. 31 wurde gerade in "Basis" geändert.
Extrahieren Sie die Nomenklatur, in der zwei Nomenklaturen durch "Nein" verbunden sind.
033.py
import input_neko as nk
df = nk.input()
df.reset_index()
list_index = df.query("surface == 'von' & pos == 'Partikel'").index
print([f"{df.iloc[item-1,1]}von{df.iloc[item+1,1]}" for item in list_index if df.iloc[item-1, 2] == df.iloc[item+1, 2] == "Substantiv"])
# -> ['Seine Handfläche', 'Auf der Handfläche', 'Studentengesicht', 'Sollte Gesicht',...
Ich dachte, ich könnte es mit df.iloc [item-1: item + 1, 1]
ausgeben, aber es hat nicht funktioniert, also habe ich einen langen Code erhalten.
Extrahieren Sie die Verkettung der Nomenklatur (Substantive, die nacheinander erscheinen) mit der längsten Übereinstimmung.
034.py
import input_neko as nk
df = nk.input()
df.reset_index()
num = 0
str = ""
ans = []
for i in range(len(df)):
if df.iloc[i, 2] == "Substantiv":
num = num + 1
str = str + df.iloc[i, 0]
else:
if num >= 2:
ans.append(str)
num = 0
str = ""
print(ans)
# -> ['In Menschen', 'Das Schlechteste', 'Rechtzeitig', 'Ein Haar',...
Fügen Sie die Nomenklatur zu "str" hinzu und fügen Sie sie zu "ans" hinzu, wenn zwei oder mehr Nachbarschaften der Nomenklatur vorhanden sind.
Finden 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.
035.py
import input_neko as nk
df = nk.input()
print(df["surface"].value_counts().to_dict())
# -> {'von': 9194, '。': 7486, 'Hand': 6868, '、': 6772,...
Es wird gesagt, dass "Serie" praktisch ist, weil es auch in "Dikt" -Typ konvertiert werden kann.
Zeigen Sie die 10 Wörter mit hoher Häufigkeit und ihrer Häufigkeit in einem Diagramm an (z. B. einem Balkendiagramm).
036.py
import input_neko as nk
import japanize_matplotlib
import matplotlib.pyplot as plt
df = nk.input()
df_dict = df["surface"].value_counts()[:10].to_dict()
left = list(df_dict.keys())
height = list(df_dict.values())
fig = plt.figure()
plt.bar(left, height)
plt.show()
fig.savefig("036_graph.png ")
# ->
Es hat lange gedauert, bis die japanischen Zeichen von matplotlib
aktiviert waren, aber ich habe es gelöst, indem ich japanize_matplotlib
eingefügt habe.
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.
037.py
from collections import defaultdict
import input_neko as nk
import japanize_matplotlib
import matplotlib.pyplot as plt
df = nk.input()
start = 0
neko_phrase = []
freq = defaultdict(int)
for i in range(len(df)):
if df.iloc[i, 0] == "EOS":
phrase = df.iloc[start:i, 0].to_list()
if "Katze" in phrase:
neko_phrase.append(phrase)
for word in phrase:
if word != "Katze": freq[word] += 1
start = i + 1
neko_relation = sorted(freq.items(), key=lambda x: x[1], reverse=True)[:10]
left = [item[0] for item in neko_relation]
height = [item[1] for item in neko_relation]
fig = plt.figure()
plt.bar(left, height)
fig.savefig("037_graph.png ")
# ->
Wörter, die häufig in Sätzen mit Katzen vorkommen, weisen eine hohe Häufigkeit des gemeinsamen Auftretens auf. Ein "Lambda" -Ausdruck wird in der Mitte verwendet, um nach dem "Wert" -Wert vom Typ "dict" zu sortieren.
Zeichnen Sie ein Histogramm der Häufigkeit des Auftretens von Wörtern (die horizontale Achse repräsentiert die Häufigkeit des Auftretens und die vertikale Achse repräsentiert die Anzahl der Arten von Wörtern, die die Häufigkeit des Auftretens als Balkendiagramm verwenden).
038.py
import input_neko as nk
import pandas as pd
import japanize_matplotlib
import matplotlib.pyplot as plt
df = nk.input()
df_dict = df["surface"].value_counts().to_dict()
word = list(df_dict.keys())
count = list(df_dict.values())
d = pd.DataFrame(count, index=word).groupby(0).size()
height = list(d[:10])
fig = plt.figure()
plt.bar(range(1, 11), height)
fig.savefig("038_graph.png ")
# ->
Ich dachte, ich sollte "groupby" verwenden, aber ich habe das Gefühl, dass das Konvertieren von "dict", "DataFrame", "Series", "list" das Verständnis erschwert hat ...
Zeichnen Sie beide logarithmischen Diagramme mit der Worthäufigkeitsrangfolge auf der horizontalen Achse und der Worthäufigkeit auf der vertikalen Achse.
039.py
import input_neko as nk
import pandas as pd
import japanize_matplotlib
import matplotlib.pyplot as plt
df = nk.input()
df_dict = df["surface"].value_counts().to_dict()
word = list(df_dict.keys())
count = list(df_dict.values())
d = pd.DataFrame(count, index=word).groupby(0).size()
height = list(d[:])
fig = plt.figure()
plt.xscale("log")
plt.yscale("log")
plt.plot(range(len(height)), height)
fig.savefig("039_graph.png ")
# ->
[Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B8%E3%83%83%E3%83%97%E3%81%AE%E6%B3%95%E5%89 Ich habe das Zipf-Gesetz mit% 87 überprüft.
Das Zip-Gesetz (Zipf-Gesetz) oder das Zipf-Gesetz ist eine empirische Regel, nach der das k-te häufigste Element 1 / k der Gesamtmenge ausmacht.
Wenn Sie ein logarithmisches Diagramm auf beiden Achsen erstellen, ist dies im Idealfall eine gerade Linie, die nach rechts abfällt, aber ich bin der Meinung, dass die Ausgabeergebnisse im Allgemeinen gleich sind. Es scheint seltsam, dass das Gesetz von Zipf in verschiedenen Situationen auftritt.
Recommended Posts