Sprachverarbeitung 100 Schläge 2015 ["Kapitel 4: Morphologische Analyse"](http: //www.cl.ecei.tohoku) .ac.jp / nlp100 / # ch4) 34. "A B" Datensatz. Diesmal ist es eine Herausforderung, Zeileninformationen zu kombinieren, daher ist es nicht mehr so einfach wie früher. Ich bin nicht gut in Pandas und SQL. Es ist jedoch nicht schwierig, da es sich nur um einen Schleifenprozess handelt.
Verknüpfung | Bemerkungen |
---|---|
034."B von A".ipynb | Antwortprogramm GitHub Link |
100 Klicks Amateur-Sprachverarbeitung:34 | Kopieren Sie die Quelle vieler Quellteile und fügen Sie sie ein |
MeCab Official | MeCab-Seite zum Anschauen |
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 |
---|---|
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.
Extrahieren Sie die Nomenklatur, in der zwei Nomenklaturen durch "Nein" verbunden sind.
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')
# EOS,Symbol,Lass ein Leerzeichen
return df
df = read_text()
POS_TARGET = 'Substantiv'
for index in df['surface'].index:
#Keine spezielle Logik in der ersten und letzten Zeile
if df['surface'][index] == 'von' \
and df['pos'][index-1] == POS_TARGET \
and df['pos'][index+1] == POS_TARGET:
print(index, '\t', df['surface'][index-1] + 'von' + df['surface'][index+1])
#Begrenzt, weil es viele gibt
if index > 2000:
break
Im Gegensatz zum vorherigen Klopfen werden EOS, Symbole und Leerzeilen nicht entfernt. Dies liegt daran, dass ich es zu einer Bedingung machen wollte, dass "B von A" stetig ist, einschließlich der Klarheit am Ende von Sätzen und Symbolen.
python
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')
# EOS,Symbol,Lass ein Leerzeichen
return df
Schleife auf dem Pandas Series Index. Und es wird beurteilt, ob die Zeilen davor und danach Nomenklaturen sind.
python
for index in df['surface'].index:
#Keine spezielle Logik in der ersten und letzten Zeile
if df['surface'][index] == 'von' \
and df['pos'][index-1] == POS_TARGET \
and df['pos'][index+1] == POS_TARGET:
print(index, '\t', df['surface'][index-1] + 'von' + df['surface'][index+1])
Wenn das Programm ausgeführt wird, werden die folgenden Ergebnisse ausgegeben. Da es so viele gibt, sehe ich nur bis zu 2000 Zeilen.
Ausgabeergebnis
118 seine Handfläche
144 auf der Handfläche
151 Schülergesicht
197 Gesicht, das sein sollte
235 in der Mitte des Gesichts
248 Im Loch
292 Die Handfläche des Schülers
294 Hinter der Handfläche
382 was
421 Wesentliche Mutter
478 auf dem Strohhalm
484 In Sasahara
498 Endlich Gedanken
516 Vor dem Teich
658 Endlich was
729 Danke an Kazuki
742 Zaunloch
752 Die drei Haare des Nachbarn
758 Uhr Passage
806 Momentane Gnade
842 Im Haus
858 Sein Schüler
Andere Menschen als 861
892 Vorheriger Schüler
958 Deine Chance
1029 Sansan no San
1046 Brustjucken
1068 Haushälterin
1089 Meister
1121 unter der Nase
1130 Mein Gesicht
1192 Mein Zuhause
1208 Mein Mann
1249 Heimzeug
1281 davon
1300 sein Arbeitszimmer
Auf 1326 Büchern
1341 Hautfarbe
Am 1402
1411 seine jede Nacht
Andere als 1516
1588 Neben meinem Mann
1608 sein Knie
1610 am Knie
1659 Erfahrung
1665 Auf der Reisschüssel
1671 Auf dem 炬 燵
1700 hier raus
1702 Unser kleiner Begleiter
1704 Kleines Bett
1747 Mitte von ihnen
1773 Einer der kleinen Gefährten
1826 Fälle von Nerven
1830 Sexueller Meister
1839 Nebenzimmer
1919 egoistisch
1953 I.
2000 Zwischen den Küchenbrettern
Recommended Posts