Sprachverarbeitung 100 Schläge 2015 ["Kapitel 4: Morphologische Analyse"](http: //www.cl.ecei.tohoku) Es ist eine Aufzeichnung von 30. "Ergebnis der morphologischen Analyse lesen" von .ac.jp / nlp100 / # ch4). "Morphologische Analyse" Mit dem Eintritt in das Kapitel ist es eher zu einer vollständigen Sprachverarbeitung geworden. Die morphologische Analyse ist eine Methode, die einen Satz wie "Warten" in "Warten", "Shi", "Te", "Ori" und "Masu" unterteilt und jedem Informationen wie Teiltexte hinzufügt. Weitere Informationen "Wikipedia" Etc.
Verknüpfung | Bemerkungen |
---|---|
030.Ergebnisse der morphologischen Analyse lesen.ipynb | Antwortprogramm GitHub Link |
100 Klicks Amateur-Sprachverarbeitung:30 | Kopieren Sie die Quelle vieler Quellteile und fügen Sie sie ein |
MeCab Official | MeCab-Seite zum Anschauen |
Ich verwende Python 3.8.1 ab diesem Zeitpunkt (3.6.9 bis zum letzten Mal). In Kapitel 3, "Reguläre Ausdrücke", wurde collection.OrderdDict
verwendet, um geordnete Wörterbuchtypen zu unterstützen, aber [seit Python 3.7.1 werden garantiert auch Standardwörterbuchtypen geordnet](https: //docs.python .org / ja / 3 / whatsnew / 3.7.html). Es gab keinen besonderen Grund, sich an 3.6.9 zu halten, also habe ich die Umgebung erneuert.
Ich habe vergessen, wie MeCab installiert wird. Ich habe es vor einem Jahr installiert, aber ich kann mich nicht erinnern, gestolpert zu sein.
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.
Implementieren Sie ein Programm, das die Ergebnisse der morphologischen Analyse liest (neko.txt.mecab). Jedes morphologische Element wird jedoch in einem Zuordnungstyp mit der Oberfläche, der Grundform (Basis), einem Teil des Wortes (pos) und einem Teil der Wortunterklassifizierung 1 (pos1) als Schlüssel 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.
Es ist "MeCab", ein Standard für die morphologische Analyse. Zum Vergleich mit anderen morphologischen Analysegeräten habe ich auf den Artikel "Vergleich der morphologischen Analysegeräte Ende 2019" verwiesen (Vergleichsergebnis "MeCab"). Ich dachte, ich würde es tun.
Wenn Sie MeCab verwenden, werden die Informationen für die geteilten Wörter im folgenden Format bewertet. Beachten Sie, dass das Trennzeichen eine Registerkarte (\ t
) und ein Komma (warum?) Ist.
Oberflächenform \ t Teiltexte, Teilunterklassifizierung 1, Teilunterklassifizierung 2, Teilunterklassifizierung 3, Verwendungsart, Verwendungsform, Originalform, Lesen, Aussprache
Zum Beispiel ist im Fall von "im Oberschenkelschenkel" das Ausgabeergebnis wie folgt.
No | Oberflächentyp | Teil | Teil細分類1 | Teil細分類2 | Teil細分類3 | Nutzungsart | Nutzungsart | Prototyp | lesen | Aussprache |
---|---|---|---|---|---|---|---|---|---|---|
1 | Sumomo | Substantiv | Allgemeines | * | * | * | * | Sumomo | Sumomo | Sumomo |
2 | Ebenfalls | Partikel | 係Partikel | * | * | * | * | Ebenfalls | Mo. | Mo. |
3 | Pfirsiche | Substantiv | Allgemeines | * | * | * | * | Pfirsiche | Pfirsich | Pfirsich |
4 | Ebenfalls | Partikel | 係Partikel | * | * | * | * | Ebenfalls | Mo. | Mo. |
5 | Pfirsiche | Substantiv | Allgemeines | * | * | * | * | Pfirsiche | Pfirsich | Pfirsich |
6 | von | Partikel | Union | * | * | * | * | von | Nein | Nein |
7 | Zuhause | Substantiv | Nicht unabhängig | Anwalt möglich | * | * | * | Zuhause | Uchi | Uchi |
8 | EOS |
Der folgende MeCab-Ausführungsteil ist die Voraussetzung für Kapitel 4.
Verwenden von MeCab für den Text (neko.txt) von Natsume Sosekis Roman "Ich bin eine Katze" Analysieren Sie die Morphologie und speichern Sie das Ergebnis in einer Datei namens neko.txt.mecab.
Es ist ein einfacher Prozess, der mit einem einzigen Befehl endet.
mecab neko.txt -o neko.txt.mecab
Zur Zeit habe ich ein Programm mit mecab-python3
(ver0.996.3) in Python erstellt, wie unten gezeigt, aber das Ergebnis unterscheidet sich geringfügig von dem, wenn der Befehl ausgeführt wird. ** Der Satz wurde nicht durch EOS (End Of Statement) getrennt ** war für das anschließende Klopfen fatal. Die Methode zum Angeben von Optionen ist möglicherweise schlecht, aber da ich sie nicht untersuchen möchte, wird das Ausführungsergebnis des Python-Programms später nicht verwendet.
import MeCab
mecab = MeCab.Tagger()
with open('./neko.txt') as in_file, \
open('./neko.txt.mecab', mode='w') as out_file:
out_file.write(mecab.parse(in_file.read()))
from pprint import pprint
import pandas as pd
def read_text():
# 0:Oberflächentyp(surface)
# 1:Teil(pos)
# 2:Teil Teil 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')
#Das Leerzeichen ist tatsächlich pos1, aber es hat sich verschoben.
return df[df['pos'] != 'Leer']
df = read_text()
print(df.info())
target = []
morphemes = []
for i, row in df.iterrows():
if row['surface'] == 'EOS' \
and len(target) != 0:
morphemes.append(df.loc[target].to_dict(orient='records'))
target = []
else:
target.append(i)
print(len(morphemes))
pprint(morphemes[:5])
Die von MeCab erstellte Datei wird von "read_table" gelesen. Es ist etwas ärgerlich, dass die Trennzeichen Tabulator (\ t
) und Komma (,
) sind. Dies wird erreicht, indem ein regulärer Ausdruck (ODER mit "|") mit dem Parameter "sep" verwendet und "engine" auf "python" gesetzt wird.
Ich habe "skiprows" und "skipfooter" eingestellt, weil es ärgerlich war, den Inhalt der Datei zu sehen.
python
def read_text():
# 0:Oberflächentyp(surface)
# 1:Teil(pos)
# 2:Teil Teil 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
Der Datenrahmen enthält die folgenden Informationen.
Read_table
Problem mit LeerzeichenEs ist schwer zu verstehen, aber wenn das folgende (Leerzeichen halber Breite) am Anfang der Zeile steht, verschiebt sich die Spalte beim Lesen mit der Funktion `read_table`. Wenn Sie
und \ t
(Tab) ignorieren, wird die erste Spalte als" Symbol "erkannt. Ich habe einige Versuche unternommen, z. B. den Parameter "skipinitialspace" zu setzen, konnte ihn jedoch nicht lösen. Ich denke, es ist wahrscheinlich ein Fehler bei Pandas.
Dieses Mal musste ich nicht besonders darauf eingehen, daher schließe ich "leere" Zeilen aus.
Symbol,Leer,*,*,*,*, , ,
Die Daten der gelesenen Datei als DataFrame werden wie folgt mit df.info ()
ausgegeben.
<class 'pandas.core.frame.DataFrame'>
Int64Index: 212143 entries, 0 to 212552
Data columns (total 4 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 surface 212143 non-null object
1 pos 202182 non-null object
2 pos1 202182 non-null object
3 base 202182 non-null object
dtypes: object(4)
memory usage: 8.1+ MB
None
Speichern Sie jedes morphologische Element in einem Mapping-Typ mit dem Schlüssel Oberflächenform (Oberfläche), Grundform (Basis), Teil des Wortes (pos) und Teil der Wortunterklassifikation 1 (pos1) und drücken Sie einen Satz als Liste morphologischer Elemente (Mapping-Typ) aus.
Erstellen Sie eine Liste des Zuordnungstyps (Wörterbuchtyp). Ich habe es jedoch nicht für Schläge nach ** verwendet, und es ist vollständig für die Python-Praxis (bei nachfolgenden Schlägen erfordert die Verwendung von Pandas keinen so mühsamen Prozess).
Wenn EOS (End Of Statement) ausgegeben wird, ist dies das Ende eines Satzes, sodass die morphologischen Elemente bis zu diesem Punkt von der Funktion to_dict
ausgegeben werden.
python
target = []
morphemes = []
for i, row in df.iterrows():
if row['surface'] == 'EOS' \
and len(target) != 0:
morphemes.append(df.loc[target].to_dict(orient='records'))
target = []
else:
target.append(i)
Wenn das Programm ausgeführt wird, wird das folgende Ergebnis ausgegeben (nur die ersten 5 Sätze). Der Grund, warum "Ich bin eine Katze" in der ersten Zeile eine Nomenklatur ist, ist übrigens, dass es sich um eine richtige Nomenklatur des Buchtitels handelt. Es ist richtig, dass der Satz im Buch zerlegt wird, aber es wird bisher nicht getan.
Ausgabeergebnis
[[{'base': 'ich bin eine Katze', 'pos': 'Substantiv', 'pos1': '固有Substantiv', 'surface': 'ich bin eine Katze'},
{'base': '。', 'pos': 'Symbol', 'pos1': 'Phrase', 'surface': '。'}],
[{'base': 'Name', 'pos': 'Substantiv', 'pos1': 'Allgemeines', 'surface': 'Name'},
{'base': 'Ist', 'pos': 'Partikel', 'pos1': '係Partikel', 'surface': 'Ist'},
{'base': 'noch', 'pos': 'Adverb', 'pos1': 'Hilfsanschluss', 'surface': 'noch'},
{'base': 'Nein', 'pos': 'Adjektiv', 'pos1': 'Unabhängigkeit', 'surface': 'Nein'},
{'base': '。', 'pos': 'Symbol', 'pos1': 'Phrase', 'surface': '。'}],
[{'base': None, 'pos': None, 'pos1': None, 'surface': 'EOS'},
{'base': 'Wo', 'pos': 'Substantiv', 'pos1': '代Substantiv', 'surface': 'Wo'},
{'base': 'damit', 'pos': 'Partikel', 'pos1': '格Partikel', 'surface': 'damit'},
{'base': 'Geboren', 'pos': 'Verb', 'pos1': 'Unabhängigkeit', 'surface': 'Geboren'},
{'base': 'Ta', 'pos': 'Hilfsverb', 'pos1': '*', 'surface': 'Ta'},
{'base': 'Feuer', 'pos': 'Substantiv', 'pos1': 'Allgemeines', 'surface': 'Katon'},
{'base': 'Wann', 'pos': 'Partikel', 'pos1': '格Partikel', 'surface': 'Wann'},
{'base': 'Registrieren', 'pos': 'Substantiv', 'pos1': 'Verbindung ändern', 'surface': 'Registrieren'},
{'base': 'Aber', 'pos': 'Partikel', 'pos1': '格Partikel', 'surface': 'Aber'},
{'base': 'Tsukuri', 'pos': 'Verb', 'pos1': 'Unabhängigkeit', 'surface': 'Tsuka'},
{'base': 'Nu', 'pos': 'Hilfsverb', 'pos1': '*', 'surface': 'Nu'},
{'base': '。', 'pos': 'Symbol', 'pos1': 'Phrase', 'surface': '。'}],
[{'base': 'Was', 'pos': 'Substantiv', 'pos1': '代Substantiv', 'surface': 'Was'},
{'base': 'Aber', 'pos': 'Partikel', 'pos1': '副Partikel', 'surface': 'Aber'},
{'base': 'dim', 'pos': 'Adjektiv', 'pos1': 'Unabhängigkeit', 'surface': 'dim'},
{'base': 'Feuchtigkeit', 'pos': 'Adverb', 'pos1': 'Allgemeines', 'surface': 'Feuchtigkeit'},
{'base': 'tat', 'pos': 'Substantiv', 'pos1': 'Allgemeines', 'surface': 'tat'},
{'base': 'Platz', 'pos': 'Substantiv', 'pos1': 'Suffix', 'surface': 'Platz'},
{'base': 'damit', 'pos': 'Partikel', 'pos1': '格Partikel', 'surface': 'damit'},
{'base': 'Miau Miau', 'pos': 'Adverb', 'pos1': 'Allgemeines', 'surface': 'Miau Miau'},
{'base': 'Schrei', 'pos': 'Verb', 'pos1': 'Unabhängigkeit', 'surface': 'Weinen'},
{'base': 'Hand', 'pos': 'Partikel', 'pos1': '接続Partikel', 'surface': 'Hand'},
{'base': 'Was war da', 'pos': 'Substantiv', 'pos1': 'Allgemeines', 'surface': 'Was war da'},
{'base': 'Nur', 'pos': 'Partikel', 'pos1': '副Partikel', 'surface': 'Nur'},
{'base': 'Ist', 'pos': 'Partikel', 'pos1': '係Partikel', 'surface': 'Ist'},
{'base': 'Erinnerung', 'pos': 'Substantiv', 'pos1': 'Verbindung ändern', 'surface': 'Erinnerung'},
{'base': 'Machen', 'pos': 'Verb', 'pos1': 'Unabhängigkeit', 'surface': 'Shi'},
{'base': 'Hand', 'pos': 'Partikel', 'pos1': '接続Partikel', 'surface': 'Hand'},
{'base': 'Ist', 'pos': 'Verb', 'pos1': 'Nicht unabhängig', 'surface': 'Ist'},
{'base': '。', 'pos': 'Symbol', 'pos1': 'Phrase', 'surface': '。'}],
[{'base': 'ich', 'pos': 'Substantiv', 'pos1': '代Substantiv', 'surface': 'ich'},
{'base': 'Ist', 'pos': 'Partikel', 'pos1': '係Partikel', 'surface': 'Ist'},
{'base': 'Hier', 'pos': 'Substantiv', 'pos1': '代Substantiv', 'surface': 'Hier'},
{'base': 'damit', 'pos': 'Partikel', 'pos1': '格Partikel', 'surface': 'damit'},
{'base': 'Start', 'pos': 'Verb', 'pos1': 'Unabhängigkeit', 'surface': 'Start'},
{'base': 'Hand', 'pos': 'Partikel', 'pos1': '接続Partikel', 'surface': 'Hand'},
{'base': 'Mensch', 'pos': 'Substantiv', 'pos1': 'Allgemeines', 'surface': 'Mensch'},
{'base': 'Das', 'pos': 'Partikel', 'pos1': '格Partikel', 'surface': 'Das'},
{'base': 'Ding', 'pos': 'Substantiv', 'pos1': 'Nicht unabhängig', 'surface': 'Ding'},
{'base': 'Zu', 'pos': 'Partikel', 'pos1': '格Partikel', 'surface': 'Zu'},
{'base': 'sehen', 'pos': 'Verb', 'pos1': 'Unabhängigkeit', 'surface': 'Sie sehen'},
{'base': 'Ta', 'pos': 'Hilfsverb', 'pos1': '*', 'surface': 'Ta'},
{'base': '。', 'pos': 'Symbol', 'pos1': 'Phrase', 'surface': '。'}]]