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).
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.
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': '。'}]
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']
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']
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']
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']
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)]
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
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
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
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.
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
Recommended Posts