[PYTHON] Ich habe mit GiNZA v3.1 Kapitel 4 100 Sprachverarbeitungsklopfen 2020 durchgeführt

Einführung

Sprachverarbeitung 100 Knock 2020 wurde veröffentlicht, daher werde ich es sofort versuchen.

In Kapitel 4 werden wir die Morphologie mit MeCab analysieren. Ich werde es jedoch mit GiNZA tun (obwohl ich es nur am Anfang verwendet habe).

Kapitel 4: Morphologische Analyse

Verwenden Sie MeCab, um den Text (neko.txt) von Natsume Sosekis Roman "Ich bin eine Katze" morphologisch zu analysieren und das Ergebnis in einer Datei namens neko.txt.mecab zu speichern. 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.

Code


import spacy
import pandas as pd
import pprint
from functools import reduce
import collections
import matplotlib.pyplot as plt
import seaborn as sns

with open('neko.txt') as f:
    raw_text = f.read()
    #Entfernen Sie die zusätzlichen Zeichen am Anfang
    raw_text = raw_text.replace('einer\n\n ', '')
    nlp = spacy.load('ja_ginza')
    doc = nlp(raw_text)
    with open('neko.txt.ginza', 'a') as f2:
        for sent in doc.sents:
            for token in sent:
                #Ausgabenummer, Oberflächensystem, Grundform, Teiletexte
                f2.write(','.join([str(token.i), token.orth_, token.lemma_, token.tag_]) + '\n')

GiNZA scheint in der Lage zu sein, dieselbe Ausgabe wie MeCab in der Befehlszeile auszugeben, aber da ich die API von Python nicht finden konnte, gebe ich sie so aus, wie sie ist.

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.

Code


neko_df = pd.read_csv('neko.txt.ginza', header=None)

docs = []
sentence = []
for row in neko_df.itertuples():
    pos, *pos1 = row[4].split('-')
    neko_dict = {
        'surface': row[2],
        'base': row[3],
        'pos': pos,
        'pos1': pos1
    }
    sentence.append(neko_dict)
    #.. Getrennt durch
    if row[2] == '。':
        docs.append(sentence)
        sentence = []
pprint.pprint(docs[0])

Ausgabeergebnis


[{'base': 'Mein Mann', 'pos': 'Gleichbedeutend', 'pos1': [], 'surface': 'ich'},
 {'base': 'Ist', 'pos': 'Partikel', 'pos1': ['係Partikel'], 'surface': 'Ist'},
 {'base': 'Katze', 'pos': 'Substantiv', 'pos1': ['普通Substantiv', 'Allgemeines'], 'surface': 'Katze'},
 {'base': 'Ist', 'pos': 'Hilfsverb', 'pos1': [], 'surface': 'damit'},
 {'base': 'Ja', 'pos': 'Verb', 'pos1': ['Nicht unabhängig'], 'surface': 'Gibt es'},
 {'base': '。', 'pos': 'Hilfssymbol', 'pos1': ['Phrase'], 'surface': '。'}]

31. Verb

Extrahieren Sie alle Oberflächenformen des Verbs.

Code


surfaces = []
for sentence in docs:
    for morpheme in sentence:
        surfaces.append(morpheme['surface'])
print(surfaces[:30])

Ausgabeergebnis


['ich', 'Ist', 'Katze', 'damit', 'Gibt es', '。', 'Name', 'Ist', 'noch', 'Nein', '。', 'Wo', 'damit', 'Geboren', 'Ta', 'Oder', 'Wann', 'んWann', 'Registrieren', 'Aber', 'つOder', 'Nu', '。', 'Was', 'damit', 'Ebenfalls', 'dim', 'Feuchtigkeit', 'Shi', 'Ta']

32. Prototyp des Verbs

Extrahieren Sie alle Originalformen des Verbs.

Code


bases = []
for sentence in docs:
    for morpheme in sentence:
        bases.append(morpheme['base'])
print(bases[:30])

Ausgabeergebnis


['Mein Mann', 'Ist', 'Katze', 'Ist', 'Ja', '。', 'Name', 'Ist', '未Ist', 'Nein', '。', 'Wo', 'damit', 'geboren werden', 'Ta', 'Oder', 'Wann', 'うんWann', 'Registrieren', 'Aber', 'Anfügen', 'Zu', '。', 'Was', 'damit', 'Ebenfalls', 'dim', 'Feuchtigkeit', 'Machen', 'Ta']

33. "B von A"

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

Code


nouns = []
for sentence in docs:
    for i in range(len(sentence) - 2):
        if sentence[i]['pos'] == 'Substantiv' and sentence[i + 1]['surface'] == 'von' and sentence[i + 2]['pos'] == 'Substantiv':
            nouns.append(sentence[i]['surface'] + sentence[i + 1]['surface'] + sentence[i + 2]['surface'])
print(nouns[:30])

Ausgabeergebnis


['Auf der Handfläche', 'Studentengesicht', 'Dinge sehen', 'Sollte Gesicht', 'Mitten im Gesicht', 'In dem Loch', 'Kalligraphiepalme', 'Die Rückseite der Handfläche', 'Bisher', 'Auf dem Strohhalm', 'In Sasahara', 'Vor dem Teich', 'Auf dem Teich', 'Danke an Kazuki', 'Loch im Zaun', 'Nebenan drei Haare', 'Zeitablauf', 'Momentane Gnade', 'Im Haus', 'Andere Menschen als', 'Vorheriger Schüler', 'Deine Chance', 'Drei von euch', 'Juckreiz in der Brust', 'Haushälterin', 'Meister', 'Kleine Katze ohne', 'Unter der Nase', 'Mein Zuhause', 'Heimzeug']

34. Verkettung der Nomenklatur

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

Code


nouns2 = []
for sentence in docs:
    word = ''
    count = 0
    for morpheme in sentence:
        if morpheme['pos'] == 'Substantiv':
            word += morpheme['surface']
            count += 1
        else:
            if count >= 2:
                nouns2.append(word)
            word = ''
            count = 0 
print(nouns2[:30]) 

Ausgabeergebnis


['Start', 'Rechtzeitig', 'Ein Haar', 'Hintere Katze', 'Bis jetzt', 'Uchiike', 'Anders als Student', 'Mao', 'Kein Gasthaus', 'Mama zurück', 'Ganztägiges Studium', 'Fast', 'Manchmal Stealth', 'Ein paar Seiten', 'Anders als mein Mann', 'Morgenmeister', 'Sou Seite', 'Ein Raum', 'Nervöser Magen schwach', 'Manchmal das gleiche', 'Sprachpause', 'Meine Frau', 'Neulich Ball', 'Die ganze Geschichte', 'Wie viel Mensch', 'Herr Hoshikake', 'Sora Munemori', 'Januar', 'Monatliches Gehaltsdatum', 'Aquarellfarbe']

35. Häufigkeit des Auftretens von Wörtern

Code


#Reduzieren Sie eine zweidimensionale Liste
words = reduce(list.__add__, docs)
#Nur Wörter extrahieren
words = collections.Counter(map(lambda e: e['surface'], words))
#Berechnen Sie die Häufigkeit des Auftretens
words = words.most_common()
#Sortieren nach Häufigkeit des Auftretens
words = sorted(words, key=lambda e: e[1], reverse=True)
print(words[:30])

Ausgabeergebnis


[('von', 9546), ('。', 7486), ('Hand', 7401), ('Zu', 7047), ('、', 6772), ('Ist', 6485), ('Wann', 6150), ('Zu', 6118), ('Aber', 5395), ('damit', 4542), ('Ta', 3975), ('「', 3238), ('」', 3238), ('Ebenfalls', 3229), ('Ist', 2705), ('Shi', 2530), ('Abwesend', 2423), ('Von', 2213), ('Oder', 2041), ('Gibt es', 1729), ('Hmm', 1625), ('Nana', 1600), ('Ist', 1255), ('Ding', 1214), ('Machen', 1056), ('Ebenfallsvon', 1005), ('Was', 998), ('damitす', 978), ('Du', 967), ('sagen', 937)]

36. Top 10 der häufigsten Wörter

Code


words_df = pd.DataFrame(words[:10], columns=['word', 'count'])
sns.set(font='AppleMyungjo')

fig = plt.figure()
ax = fig.add_subplot(111)
ax.bar(words_df['word'], words_df['count'])
plt.show()

Ausgabeergebnis 36.png

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.

Code


cats = []
for sentence in docs:
    cat_list = list(filter(lambda e: e['surface'] == 'Katze', sentence))
    if len(cat_list) > 0:
        for morpheme in sentence:
            if morpheme['surface'] != 'Katze':
                cats.append(morpheme['surface'])
cats = collections.Counter(cats)
#Berechnen Sie die Häufigkeit des Auftretens
cats = cats.most_common()
#Sortieren nach Häufigkeit des Auftretens
cats = sorted(cats, key=lambda e: e[1], reverse=True)

cats_df = pd.DataFrame(cats[:10], columns=['word', 'count'])
sns.set(font='AppleMyungjo')

fig = plt.figure()
ax = fig.add_subplot(111)
ax.bar(cats_df['word'], cats_df['count'])
# plt.show()
plt.savefig('37.png')

Ausgabeergebnis 37.png

38. Histogramm

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

Code


hist_df = pd.DataFrame(words, columns=['word', 'count'])
sns.set(font='AppleMyungjo')

fig = plt.figure()
ax = fig.add_subplot(111)
ax.hist(hist_df['count'], range=(1, 100))
# plt.show()
plt.savefig('38.png')

Ausgabeergebnis 38.png

Die horizontale Achse ist auf 100 begrenzt. Da die Anzahl der Anzeigen um 1 überwältigend groß ist, wird sie wie folgt angezeigt, wenn Sie sie ohne Einschränkungen anzeigen, und Sie können sie nicht richtig visualisieren. 38_2.png

39. Zipfs Gesetz

Zeichnen Sie beide logarithmischen Graphen mit der Häufigkeit des Auftretens von Wörtern auf der horizontalen Achse und der Häufigkeit des Auftretens auf der vertikalen Achse.

Code


zipf_df = pd.DataFrame(words, columns=['word', 'count'])
sns.set(font='AppleMyungjo')

fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_yscale('log')
ax.set_xscale('log')
ax.plot(zipf_df['count'])
# plt.show()
plt.savefig('39.png')

Ausgabeergebnis 39.png

Recommended Posts

Ich habe mit GiNZA v3.1 Kapitel 4 100 Sprachverarbeitungsklopfen 2020 durchgeführt
100 Sprachverarbeitungsklopfen mit Python (Kapitel 1)
100 Sprachverarbeitungsklopfen mit Python (Kapitel 3)
100 Sprachverarbeitung Knock 2020 Kapitel 1
100 Sprachverarbeitung Knock Kapitel 1
100 Sprachverarbeitung Knock 2020 Kapitel 3
100 Sprachverarbeitung Knock 2020 Kapitel 2
100 Sprachverarbeitungsklopfen mit Python (Kapitel 2, Teil 2)
100 Sprachverarbeitungsklopfen mit Python (Kapitel 2, Teil 1)
100 Sprachverarbeitungsklopfen mit Python 2015
100 Sprachverarbeitung Knock Kapitel 1 (Python)
100 Sprachverarbeitung Knock Kapitel 2 (Python)
100 Sprachverarbeitung Knock 2020 Kapitel 2: UNIX-Befehle
100 Sprachverarbeitung Knock 2015 Kapitel 5 Abhängigkeitsanalyse (40-49)
100 Sprachverarbeitung Knock Kapitel 1 in Python
100 Sprachverarbeitung Knock 2020 Kapitel 4: Morphologische Analyse
100 Sprachverarbeitung Knock 2020 Kapitel 9: RNN, CNN
Ich habe versucht, 100 Sprachverarbeitung klopfen 2020: 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
Ich habe versucht, 100 Sprachverarbeitung klopfen 2020: Kapitel 1
100 Sprachverarbeitung Knock 2020 Kapitel 1: Vorbereitende Bewegung
100 Sprachverarbeitung Knock Kapitel 1 von Python
100 Sprachverarbeitung Knock 2020 Kapitel 3: Reguläre Ausdrücke
100 Language Processing Knock 2015 Kapitel 4 Morphologische Analyse (30-39)
Ich habe versucht, 100 Sprachverarbeitung zu klopfen 2020: Kapitel 2
Ich habe versucht, 100 Sprachverarbeitung zu klopfen 2020: Kapitel 4
100 Sprachverarbeitungsklopfen (2020): 28
100 Sprachverarbeitungsklopfen (2020): 38
100 Sprachverarbeitung klopfen 00 ~ 02
[Programmierer-Neuling "100 Sprachverarbeitung klopfen 2020"] Lösen Sie Kapitel 1
Sprachverarbeitung 100 Klopfen-88: 10 Wörter mit hoher Ähnlichkeit
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-90 (mit Gensim): Lernen mit word2vec
100 Sprachverarbeitung Knock UNIX-Befehle in Kapitel 2
100 Sprachverarbeitung Klopfen Sie auf reguläre Ausdrücke, die Sie in Kapitel 3 gelernt haben
100 Sprachverarbeitung Knock-95 (mit Pandas): Bewertung mit WordSimilarity-353
Rehabilitation von Python- und NLP-Kenntnissen ab "100 Language Processing Knock 2015" (Kapitel 1)
100 Sprachverarbeitung Knock-51: Wortausschnitt
100 Sprachverarbeitung Knock-58: Extraktion von Taple
100 Sprachverarbeitung Knock-57: Abhängigkeitsanalyse
Sprachverarbeitung 100 Knock-80 (ersetzt durch regulären Ausdruck): Korpusformatierung