100 Language Processing Knock 2015 "Kapitel 4 Morphologische Analyse (30 ~) 39) ”ist gelöst.
import MeCab
import ngram
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
Der Text von Soseki Natsumes Roman "Ich bin eine Katze" () morphologisch neko.txt analysieren ) mit MeCab und das Ergebnis in einer Datei namens neko.txt.mecab 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.
Erstellen Sie eine Funktion namens make_analyzed_file, führen Sie eine morphologische Analyse durch und speichern Sie sie in einer Datei. Es wird davon ausgegangen, dass neko.txt im Voraus heruntergeladen und im selben Ordner wie die Ausführungsdatei gespeichert wird.
def make_analyzed_file(input_file_name: str, output_file_name: str) -> None:
"""
Morphologische Analyse von einfachen japanischen Textdateien und Speichern in Datei.
:param input_file_name Einfacher japanischer Satzdateiname
:param output_file_name Satzdateiname, der morphologisch analysiert wurde
"""
_m = MeCab.Tagger("-Ochasen")
with open(input_file_name, encoding='utf-8') as input_file:
with open(output_file_name, mode='w', encoding='utf-8') as output_file:
output_file.write(_m.parse(input_file.read()))
make_analyzed_file('neko.txt', 'neko.txt.mecab')
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.
Konvertieren Sie einfach die morphologischen Analyseergebnisse von durch Tabulatoren getrennten Zeichenfolgen in den Wörterbuchtyp, speichern Sie sie in "Morphemen" und speichern Sie jeden Satz in "Sätzen".
def tabbed_str_to_dict(tabbed_str: str) -> dict:
"""
Zum Beispiel "allmählich Shidaini allmählich hinzufügen-Konvertieren Sie eine Zeichenfolge, die ein morphologisches Element darstellt, mit einem Tabulatortrennzeichen wie "allgemein" in einen Dict-Typ.
:param tabbed_str Tabulatorgetrennte Zeichenfolge, die die Morphologie darstellt
:Ein morphologisches Element, das durch den Return-Dict-Typ dargestellt wird
"""
elements = tabbed_str.split()
if 0 < len(elements) < 4:
return {'surface': elements[0], 'base': '', 'pos': '', 'pos1': ''}
else:
return {'surface': elements[0], 'base': elements[1], 'pos': elements[2], 'pos1': elements[3]}
def morphemes_to_sentence(morphemes: list) -> list:
"""
Gruppieren und listen Sie die Liste der morphologischen Elemente auf, die durch den Satztyp durch Interpunktion dargestellt werden.
:param morphemes Liste der morphologischen Elemente, dargestellt durch den Dict-Typ
:return Liste der Sätze
"""
sentences = []
sentence = []
for morpheme in morphemes:
sentence.append(morpheme)
if morpheme['pos1'] == 'Symbol-Phrase':
sentences.append(sentence)
sentence = []
return sentences
with open('neko.txt.mecab', encoding='utf-8') as file_wrapper:
morphemes = [tabbed_str_to_dict(line) for line in file_wrapper]
sentences = morphemes_to_sentence(morphemes)
#Überprüfen Sie das Ergebnis
print(morphemes[::100])
print(sentences[::100])
Extrahieren Sie alle Oberflächenformen des Verbs. Extrahieren Sie alle Originalformen des Verbs. Extrahieren Sie die gesamte Nomenklatur der Verbindung.
Es ist einfach, wenn Sie die in "30" erstellten "Morpheme" verwenden. Lesen der Ergebnisse der morphologischen Analyse.
verbs_surface = [morpheme['surface'] for morpheme in morphemes if morpheme['pos1'].find('Verb') == 0]
verbs_base = [morpheme['base'] for morpheme in morphemes if morpheme['pos1'].find('Verb') == 0]
nouns_suru = [morpheme['surface'] for morpheme in morphemes if morpheme['pos1'] == 'Substantiv-Verbindung ändern']
#Überprüfen Sie das Ergebnis
print(verbs_surface[::100])
print(verbs_base[::100])
print(nouns_suru[::100])
Extrahieren Sie die Nomenklatur, in der zwei Nomenklaturen durch "Nein" verbunden sind.
def ngramed_list(lst: list, n: int = 3) -> list:
"""
Liste in N-Gramm konvertieren.
:param lst N Liste der Grammatikziele
:param n N (Der Standardwert ist N.= 3)
:N Grammed-Liste zurückgeben
"""
index = ngram.NGram(N=n)
return [term for term in index.ngrams(lst)]
def is_noun_no_noun(words: list) -> bool:
"""
Eine Liste von drei Wörtern ist ein "Substantiv"-von-Bestimmen Sie, ob es aus "Nomen" besteht.
:param Wörter Eine Liste von 3 Wörtern
:return bool (True:"Substantiv-von-Es besteht aus "Nomen"/ False:"Substantiv-von-Es besteht nicht aus "Nomen")
"""
return (type(words) == list) and (len(words) == 3) and \
(words[0]['pos1'].find('Substantiv') == 0) and \
(words[1]['surface'] == 'von') and \
(words[2]['pos1'].find('Substantiv') == 0)
#"Substantiv-von-名詞」を含むNグラムvonみを抽出
noun_no_noun = [ngrams for ngrams in ngramed_list(morphemes) if is_noun_no_noun(ngrams)]
#Nehmen Sie die Oberflächenschicht heraus und verbinden Sie sie
noun_no_noun = [''.join([word['surface'] for word in ngram]) for ngram in noun_no_noun]
#Überprüfen Sie das Ergebnis
print(noun_no_noun[::100])
Extrahieren Sie die Verkettung der Nomenklatur (Substantive, die nacheinander erscheinen) mit der längsten Übereinstimmung.
def morphemes_to_noun_array(morphemes: list) -> list:
"""
Gruppieren Sie die Liste der vom Wörterbuchtyp dargestellten morphologischen Elemente nach anderen morphologischen Elementen als Interpunktion oder Nomenklatur und erstellen Sie eine Liste..
:param morphemes Liste der morphologischen Elemente, die durch den Wörterbuchtyp dargestellt werden
:return Liste der Nomenklaturverbindungen
"""
nouns_list = []
nouns = []
for morpheme in morphemes:
if morpheme['pos1'].find('Substantiv') >= 0:
nouns.append(morpheme)
elif (morpheme['pos1'] == 'Symbol-Phrase') | (morpheme['pos1'].find('Substantiv') < 0):
nouns_list.append(nouns)
nouns = []
return [nouns for nouns in nouns_list if len(nouns) > 1]
noun_array = [''.join([noun['surface'] for noun in nouns]) for nouns in morphemes_to_noun_array(morphemes)]
#Überprüfen Sie das Ergebnis
print(noun_array[::100])
Finden Sie die Wörter, die im Satz erscheinen, und ihre Häufigkeit des Auftretens, und ordnen Sie sie in absteigender Reihenfolge der Häufigkeit des Auftretens an.
def get_frequency(words: list) -> dict:
"""
Empfängt eine Liste von Wörtern und gibt ein Wörterbuch mit Wörtern als Schlüssel und Häufigkeit als Wert zurück.
:param Wörter Liste der Wörter
:return dict Ein Wörterbuch mit Wort als Schlüssel und Häufigkeit als Wert
"""
frequency = {}
for word in words:
if frequency.get(word):
frequency[word] += 1
else:
frequency[word] = 1
return frequency
frequency = get_frequency([morpheme['surface'] for morpheme in morphemes])
#Sortieren
frequency = [(k, v) for k, v in sorted(frequency.items(), key=lambda x: x[1], reverse=True)]
#Überprüfen Sie das Ergebnis
print(frequency[0:20])
Zeigen Sie die 10 am häufigsten vorkommenden Wörter und ihre Häufigkeit des Auftretens in einem Diagramm an (z. B. einem Balkendiagramm). 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). Zeichnen Sie beide logarithmischen Diagramme mit der Häufigkeit des Auftretens von Wörtern auf der horizontalen Achse und der Häufigkeit des Auftretens auf der vertikalen Achse.
Das Grafiksystem wird zusammen ausgegeben.
fig = plt.figure(figsize=(20, 6))
# 37.Zeigen Sie die 10 Wörter mit hoher Häufigkeit des Auftretens und deren Häufigkeit des Auftretens in einem Diagramm an (z. B. einem Balkendiagramm).
words = [f[0] for f in frequency[0:10]]
x_pos = np.arange(len(words))
fp = FontProperties(fname=r'/Library/Fonts/Hiragino Marugo ProN W4.ttc', size=14)
ax1 = fig.add_subplot(131)
ax1.bar(x_pos, [f[1] for f in frequency[0:10]], align='center', alpha=0.4)
ax1.set_xticks(x_pos)
ax1.set_xticklabels(words, fontproperties=fp)
ax1.set_ylabel('Frequency')
ax1.set_title('Top 10 frequent words')
# 38.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).
freq = list(dict(frequency).values())
freq.sort(reverse=True)
ax2 = fig.add_subplot(132)
ax2.hist(freq, bins=50, range=(0, 50))
ax2.set_title('Histogram of word count')
ax2.set_xlabel('Word count')
ax2.set_ylabel('Frequency')
# 39.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.
rank = list(range(1, len(freq) + 1))
ax3 = fig.add_subplot(133)
ax3.plot(freq, rank)
ax3.set_xlabel('Rank')
ax3.set_ylabel('Frequency')
ax3.set_title('Zipf low')
ax3.set_xscale('log')
ax3.set_yscale('log')
fig.savefig('morphological_analysis.png')
Recommended Posts