Sprachverarbeitung 100 Schläge 2015 ["Kapitel 4: Morphologische Analyse"](http: //www.cl.ecei.tohoku) Dies ist die Aufzeichnung von 39. "Zipf's Law" von .ac.jp / nlp100 / # ch4). "Zipfs Gesetz" ist [Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B8%E3%83%83%E3%83%97%E3%81%AE%E6%B3 Gemäß% 95% E5% 89% 87) wird es in der folgenden Erklärung geschrieben, und um es klar auszudrücken, die Regel lautet: ** Je häufiger es erscheint, desto größer ist das Gesamtverhältnis **.
Das Zipf-Gesetz (Zipf-Gesetz) oder das Zipf-Gesetz ist eine empirische Regel, nach der der Anteil des k-ten am häufigsten vorkommenden Elements im Ganzen proportional zu $ \ frac {1} {k} $ ist.
Verknüpfung | Bemerkungen |
---|---|
039.Zipfs Gesetz.ipynb | Antwortprogramm GitHub Link |
100 Klicks Amateur-Sprachverarbeitung:39 | Kopieren Sie die Quelle vieler Quellteile und fügen Sie sie ein |
MeCab Official | MeCab-Seite zum ersten Mal |
Art | Ausführung | Inhalt |
---|---|---|
OS | Ubuntu18.04.01 LTS | Es läuft virtuell |
pyenv | 1.2.16 | Ich benutze pyenv, weil ich manchmal mehrere Python-Umgebungen benutze |
Python | 3.8.1 | python3 auf pyenv.8.Ich benutze 1 Pakete werden mit venv verwaltet |
Mecab | 0.996-5 | apt-Installieren Sie mit get |
In der obigen Umgebung verwende ich die folgenden zusätzlichen Python-Pakete. Einfach mit normalem Pip installieren.
Art | Ausführung |
---|---|
matplotlib | 3.1.3 |
pandas | 1.0.1 |
Wenden Sie den morphologischen Analysator MeCab auf Natsume Sosekis Roman "Ich bin eine Katze" an und erhalten Sie die Statistik der Wörter im Roman.
Morphologische Analyse, MeCab, Teiltexte, Häufigkeit des Auftretens, Zipf-Gesetz, matplotlib, Gnuplot
Verwenden von MeCab für den Text (neko.txt) von Natsume Sosekis Roman "Ich bin eine Katze" Führen Sie eine morphologische Analyse durch und speichern Sie das Ergebnis in einer Datei namens neko.txt.mecab. 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.
Zeichnen Sie beide logarithmischen Diagramme mit der Häufigkeit des Auftretens von Wörtern auf der horizontalen Achse und der Häufigkeit des Auftretens auf der vertikalen Achse.
import matplotlib.pyplot as plt
import pandas as pd
def read_text():
# 0:Oberflächentyp(surface)
# 1:Teil(pos)
# 2:Teiltexte Unterklassifizierung 1(pos1)
# 7:Grundform(base)
df = pd.read_table('./neko.txt.mecab', sep='\t|,', header=None,
usecols=[0, 1, 2, 7], names=['surface', 'pos', 'pos1', 'base'],
skiprows=4, skipfooter=1 ,engine='python')
return df[(df['pos'] != 'Leer') & (df['surface'] != 'EOS') & (df['pos'] != 'Symbol')]
df = read_text()
frequency = df['surface'].value_counts().values.tolist()
plt.xscale('log')
plt.yscale('log')
plt.xlim(1, len(frequency)+1)
plt.ylim(1, frequency[0])
plt.xlabel('Rang')
plt.ylabel('Häufigkeit des Auftretens')
plt.scatter(x=range(1, len(frequency)+1), y=df['surface'].value_counts().values.tolist())
Die Funktion value_counts
zählt die eindeutigen Frequenzen und die Funktion tolist
listet sie auf.
python
frequency = df['surface'].value_counts().values.tolist()
Dieses Mal lautet die Problemstellung "beide logarithmischen Graphen", daher verwende ich die Protokollskala.
Zeichnen Sie beide logarithmischen Diagramme mit der Häufigkeit des Auftretens von Wörtern auf der horizontalen Achse und der Häufigkeit des Auftretens auf der vertikalen Achse.
python
plt.xscale('log')
plt.yscale('log')
Die x-Achse maximiert die Listenlänge + 1 (da Python bei 0 beginnt), und die y-Achse maximiert den 0. Wert, der bei absteigenden Sortierungen am häufigsten vorkommt.
python
plt.xlim(1, len(frequency)+1)
plt.ylim(1, frequency[0])
Wenn das Programm ausgeführt wird, werden die folgenden Ergebnisse ausgegeben. Es geht hervorragend bergab.