[PYTHON] Ich habe versucht, 100 Sprachverarbeitung zu klopfen 2020: Kapitel 4

Einführung

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).

Kapitel 4 Morphologische Analyse

Nr. 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.

Antwort

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...
Kommentare

Ich habe es in "Pandas" zusammengestellt, aber ... es ist praktisch, es sieht aus wie ein Mapping-Typ, nicht wahr? (Nein)

Nr.31 Verb

Extrahieren Sie alle Oberflächenformen des Verbs.

Antwort

031.py


import input_neko as nk

df = nk.input()
print(df.query("pos == 'Verb'")["surface"].values.tolist())

# -> ['Geboren', 'Tsuka', 'Shi', 'Weinen',...
Kommentare

Ich verwende das Ergebnis von Nr. 30 als "Import". Der Typ "Serie" und der Typ "Liste" können ineinander konvertiert werden, was praktisch ist.

Nr.32 Prototyp des Verbs

Extrahieren Sie alle Originalformen des Verbs.

Antwort

032.py


import input_neko as nk

df = nk.input()
print(df.query("pos == 'Verb'")["base"].values.tolist())

# -> ['Geboren', 'Tsukuri', 'Machen', 'Schrei',...
Kommentare

Die "Oberfläche" von Nr. 31 wurde gerade in "Basis" geändert.

Nr. 33 "A B"

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

Antwort

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',...
Kommentare

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.

Nr.34 Nomenklaturanschluss

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

Antwort

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',...
Kommentare

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.

Nr. 35 Häufigkeit des Auftretens von Wörtern

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.

Antwort

035.py


import input_neko as nk

df = nk.input()
print(df["surface"].value_counts().to_dict())

# -> {'von': 9194, '。': 7486, 'Hand': 6868, '、': 6772,...
Kommentare

Es wird gesagt, dass "Serie" praktisch ist, weil es auch in "Dikt" -Typ konvertiert werden kann.

Nr.36 Top 10 der häufigsten Wörter

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

Antwort

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 ")

# ->

036_graph.png

Kommentare

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.

Nr.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.

Antwort

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 ")

# -> 

037_graph.png

Kommentare

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.

Histogramm Nr. 38

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).

Antwort

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 ")

# -> 

038_graph.png

Kommentare

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 ...

Nr.39 Zipfs Gesetz

Zeichnen Sie beide logarithmischen Diagramme mit der Worthäufigkeitsrangfolge auf der horizontalen Achse und der Worthäufigkeit auf der vertikalen Achse.

Antwort

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 ")

# -> 

039_graph.png

Kommentare

[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

Ich habe versucht, 100 Sprachverarbeitung klopfen 2020: Kapitel 3
Ich habe versucht, 100 Sprachverarbeitung klopfen 2020: Kapitel 1
Ich habe versucht, 100 Sprachverarbeitung zu klopfen 2020: Kapitel 2
Ich habe versucht, 100 Sprachverarbeitung zu klopfen 2020: Kapitel 4
Ich habe versucht, 100 Sprachverarbeitung klopfen 2020
100 Sprachverarbeitung Knock 2020 Kapitel 1
100 Sprachverarbeitung Knock Kapitel 1
100 Sprachverarbeitung Knock 2020 Kapitel 3
100 Sprachverarbeitung Knock 2020 Kapitel 2
100 Sprachverarbeitung Knock Kapitel 1 (Python)
100 Sprachverarbeitung Knock Kapitel 2 (Python)
Ich habe versucht, die Version 2020 mit 100 Sprachverarbeitung zu lösen [Kapitel 2: UNIX-Befehle 15-19]
100 Sprachverarbeitung Knock 2020 Kapitel 2: UNIX-Befehle
100 Sprachverarbeitung Knock 2015 Kapitel 5 Abhängigkeitsanalyse (40-49)
100 Sprachverarbeitungsklopfen mit Python (Kapitel 1)
100 Sprachverarbeitung Knock Kapitel 1 in Python
100 Sprachverarbeitung Knock 2020 Kapitel 4: Morphologische Analyse
100 Sprachverarbeitung Knock 2020 Kapitel 9: RNN, CNN
100 Sprachverarbeitungsklopfen (2020): 28
100 Sprachverarbeitungsklopfen mit Python (Kapitel 3)
100 Sprachverarbeitungsklopfen: Kapitel 1 Vorbereitungsbewegung
100 Sprachverarbeitung Knock 2020 Kapitel 6: Maschinelles Lernen
100 Sprachverarbeitung Knock Kapitel 4: Morphologische Analyse
100 Sprachverarbeitung Knock 2020 Kapitel 10: Maschinelle Übersetzung (90-98)
100 Sprachverarbeitung Knock 2020 Kapitel 5: Abhängigkeitsanalyse
100 Sprachverarbeitung Knock 2020 Kapitel 7: Word Vector
100 Sprachverarbeitung Knock 2020 Kapitel 8: Neuronales Netz
Python-Anfänger versucht 100 Sprachverarbeitung klopfen 2015 (05 ~ 09)
100 Sprachverarbeitungsklopfen (2020): 38
100 Sprachverarbeitung klopfen 00 ~ 02
100 Sprachverarbeitung Knock Kapitel 1 von Python
100 Sprachverarbeitung Knock 2020 Kapitel 3: Reguläre Ausdrücke
Python-Anfänger versucht 100 Sprachverarbeitung klopfen 2015 (00 ~ 04)
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
Ich habe versucht, natürliche Sprache mit Transformatoren zu verarbeiten.
100 Sprachverarbeitung klopfen 2020 [00 ~ 39 Antwort]
100 Sprachverarbeitung klopfen 2020 [00-79 Antwort]
100 Sprachverarbeitung klopfen 2020 [00 ~ 69 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
100 Sprachverarbeitung Knock UNIX-Befehle in Kapitel 2
100 Sprachverarbeitung Klopfen Sie auf reguläre Ausdrücke, die Sie in Kapitel 3 gelernt haben
Ich habe versucht, die Version 2020 mit 100 Sprachverarbeitung zu lösen [Kapitel 3: Reguläre Ausdrücke 25-29]
100 Sprachverarbeitung Knock-51: Wortausschnitt
100 Sprachverarbeitung Knock-58: Extraktion von Taple
100 Sprachverarbeitung Knock-57: Abhängigkeitsanalyse
100 Sprachverarbeitung Knock-50: Satzumbruch
[Ich habe es versucht] Nand2 Tetris Kapitel 6