[PYTHON] 100 Sprachverarbeitung Knock-30 (unter Verwendung von Pandas): Lesen der Ergebnisse der morphologischen Analyse

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.

Referenzlink

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

Umgebung

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

Kapitel 4: Morphologische Analyse

Inhalt des Studiums

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

Inhalt anklopfen

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.

30. Morphologische Analyseergebnisse lesen

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.

Problemergänzung (über "MeCab")

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

Antworten

Antwortprogramm (MeCab-Ausführung) [Kapitel 4_ Morphologische Analyse.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/04.%E5%BD%A2%E6%85%8B%E7% B4% A0% E8% A7% A3% E6% 9E% 90 /% E7% AC% AC4% E7% AB% A0_% 20% E5% BD% A2% E6% 85% 8B% E7% B4% A0% E8 % A7% A3% E6% 9E% 90.ipynb)

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

Antwortprogramm (Listenerstellung) [030. Lesen der Ergebnisse der morphologischen Analyse.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/04.%E5%BD%A2%E6%85%8B%E7 % B4% A0% E8% A7% A3% E6% 9E% 90/030.% E5% BD% A2% E6% 85% 8B% E7% B4% A0% E8% A7% A3% E6% 9E% 90% E7% B5% 90% E6% 9E% 9C% E3% 81% AE% E8% AA% AD% E3% 81% BF% E8% BE% BC% E3% 81% BF.ipynb)

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

Kommentar beantworten

Dateireader

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

Read_table Problem mit Leerzeichen

Es 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,*,*,*,*, , , 

DataFrame-Informationen

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

Ausgabe der Liste der Wörterbuchtypen

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)

Ausgabeergebnis (Ausführungsergebnis)

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': '。'}]]

Recommended Posts

100 Sprachverarbeitung Knock-30 (unter Verwendung von Pandas): Lesen der Ergebnisse der morphologischen Analyse
100 Sprachverarbeitung Knock-20 (unter Verwendung von Pandas): Lesen von JSON-Daten
100 Sprachverarbeitung Knock 2020 Kapitel 4: Morphologische Analyse
100 Sprachverarbeitung Knock Kapitel 4: Morphologische Analyse
Sprachverarbeitung 100 Knocks-31 (mit Pandas): Verben
100 Language Processing Knock 2015 Kapitel 4 Morphologische Analyse (30-39)
100 Sprachverarbeitung Knock-38 (mit Pandas): Histogramm
100 Sprachverarbeitung Knock-33 (mit Pandas): Sahen Nomen
100 Sprachverarbeitung Knock-35 (mit Pandas): Nomenklatur
100 Sprachverarbeitung Knock-39 (mit Pandas): Zipf-Gesetz
100 Sprachverarbeitung Knock-34 (mit Pandas): "B von A"
Sprachverarbeitung 100 Knocks-40: Lesen der Ergebnisse der Abhängigkeitsanalyse (Morphologie)
100 Sprachverarbeitung Knock-41: Lesen des Abhängigkeitsanalyseergebnisses (Phrase / Abhängigkeit)
100 Sprachverarbeitung Knock-32 (mit Pandas): Prototyp des Verbs
100 Sprachverarbeitung Knock-99 (mit Pandas): Visualisierung durch t-SNE
100 Sprachverarbeitung Knock-95 (mit Pandas): Bewertung mit WordSimilarity-353
100 Sprachverarbeitung Knock-57: Abhängigkeitsanalyse
Verarbeitung natürlicher Sprache 1 Morphologische Analyse
100 Sprachverarbeitung Knock-56: Co-Referenz-Analyse
100 Sprachverarbeitung Knock-36 (unter Verwendung von Pandas): Häufigkeit des Auftretens von Wörtern
100 Sprachverarbeitung Knock: Kapitel 2 UNIX-Befehlsgrundlagen (mit Pandas)
100 Sprachverarbeitung Knock-83 (mit Pandas): Messung der Wort- / Kontexthäufigkeit
100 Sprachverarbeitung Knock 2015 Kapitel 5 Abhängigkeitsanalyse (40-49)
100 Sprachverarbeitung Knock-76 (mit Scicit-Learn): Beschriftung
100 Sprachverarbeitung Knock 2020 Kapitel 5: Abhängigkeitsanalyse
100 Sprachverarbeitung Knock-59: Analyse der S-Formel
100 Sprachverarbeitung Knock-73 (mit Scikit-Learn): Lernen
[Sprachverarbeitung 100 Schläge 2020] Kapitel 4: Morphologische Analyse
100 Sprachverarbeitung Knock-74 (mit Scicit-Learn): Vorhersage
100 Sprachverarbeitung Knock-84 (mit Pandas): Erstellen einer Wortkontextmatrix
100 Sprachverarbeitung Knock-97 (mit Scicit-Learn): k-bedeutet Clustering
100 Sprachverarbeitungsklopfen (2020): 28
100 Sprachverarbeitung Knock-71 (mit Stanford NLP): Stoppwort
100 Sprachverarbeitungsklopfen (2020): 38
100 Sprachverarbeitung klopfen 00 ~ 02
100 Sprachverarbeitung Knock-93 (unter Verwendung von Pandas): Berechnung der Genauigkeitsrate der Analogie-Aufgabe
100 Sprachverarbeitung Knock-75 (mit Scicit-Learn): Gewicht der Identität
100 Sprachverarbeitung klopft Morphologische Analyse in Kapitel 4 gelernt
100 Sprachverarbeitung Knock-72 (unter Verwendung von Stanford NLP): Identitätsextraktion
100 Sprachverarbeitung klopfen 2020 [00 ~ 39 Antwort]
100 Sprachverarbeitung klopfen 2020 [00-79 Antwort]
100 Sprachverarbeitung klopfen 2020 [00 ~ 69 Antwort]
100 Sprachverarbeitung Knock 2020 Kapitel 1
100 Amateur-Sprachverarbeitungsklopfen: 17
100 Sprachverarbeitung klopfen 2020 [00 ~ 49 Antwort]
100 Sprachverarbeitung Knock-52: Stemming
100 Amateur-Sprachverarbeitungsklopfen: 07
100 Sprachverarbeitung Knock 2020 Kapitel 3
100 Sprachverarbeitung Knock 2020 Kapitel 2
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-92 (mit Gensim): Anwendung auf Analogiedaten
100 natürliche Sprachverarbeitung klopft Kapitel 4 Morphologische Analyse (zweite Hälfte)
100 Sprachverarbeitung Knock-94 (mit Gensim): Ähnlichkeitsberechnung mit WordSimilarity-353
100 Sprachverarbeitung Knock-37 (mit Pandas): Top 10 der häufigsten Wörter
[Für Anfänger] Sprachanalyse mit dem Verarbeitungswerkzeug "GiNZA" (von der morphologischen Analyse bis zur Vektorisierung)
100 Sprachverarbeitungsklopfen mit Python 2015