[PYTHON] 100 Language Processing Knock 2015 Kapitel 4 Morphologische Analyse (30-39)

100 Language Processing Knock 2015 "Kapitel 4 Morphologische Analyse (30 ~) 39) ”ist gelöst.

Umgebung

Vorbereitung

Bibliothek zu verwenden

import MeCab
import ngram
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties

Speichern Sie den morphologisch analysierten Text als Datei

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

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.

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

31. Verb / 32. Prototyp des Verbs / 33.

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

34. "B von A"

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

35. Verkettung der Nomenklatur

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

36. Häufigkeit des Auftretens von Wörtern

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

37. Top 10 häufige Wörter / 38. Histogramm / 39. Zipf-Gesetz

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

morphological_analysis.png

Recommended Posts

100 Sprachverarbeitung Knock 2020 Kapitel 4: Morphologische Analyse
100 Sprachverarbeitung Knock Kapitel 4: Morphologische Analyse
100 Language Processing Knock 2015 Kapitel 4 Morphologische Analyse (30-39)
100 Sprachverarbeitung Knock 2015 Kapitel 5 Abhängigkeitsanalyse (40-49)
100 Sprachverarbeitungsklopfen 2020: Kapitel 4 (morphologische Analyse)
100 Sprachverarbeitung Knock 2020 Kapitel 5: Abhängigkeitsanalyse
[Sprachverarbeitung 100 Schläge 2020] Kapitel 4: Morphologische Analyse
100 Sprachverarbeitung Knock 2020 Kapitel 1
100 Sprachverarbeitung Knock Kapitel 1
100 Sprachverarbeitung Knock 2020 Kapitel 3
100 Sprachverarbeitung Knock 2020 Kapitel 2
Sprachverarbeitung 100 Schläge Kapitel 4: Morphologische Analyse 31. Verben
100 Sprachverarbeitung Knock-57: Abhängigkeitsanalyse
100 Sprachverarbeitung Knock Kapitel 1 (Python)
100 Sprachverarbeitung Knock Kapitel 2 (Python)
100 Sprachverarbeitung Knock-56: Co-Referenz-Analyse
100 natürliche Sprachverarbeitung klopft Kapitel 4 Morphologische Analyse (erste Hälfte)
100 Sprachverarbeitung Knock 2020 Kapitel 2: UNIX-Befehle
100 Sprachverarbeitungsklopfen mit Python (Kapitel 1)
100 natürliche Sprachverarbeitung klopft Kapitel 4 Morphologische Analyse (zweite Hälfte)
100 Sprachverarbeitung Knock Kapitel 1 in Python
100 Sprachverarbeitung Knock 2020 Kapitel 9: RNN, CNN
[Sprachverarbeitung 100 Schläge 2020] Kapitel 5: Abhängigkeitsanalyse
100 Sprachverarbeitungsklopfen (2020): 28
Ich habe versucht, 100 Sprachverarbeitung klopfen 2020: Kapitel 3
100 Sprachverarbeitungsklopfen mit Python (Kapitel 3)
100 Sprachverarbeitungsklopfen: Kapitel 1 Vorbereitungsbewegung
100 Sprachverarbeitung Knock 2020 Kapitel 6: Maschinelles Lernen
100 Sprachverarbeitung Knock 2020 Kapitel 10: Maschinelle Übersetzung (90-98)
100 Sprachverarbeitung Knock-30 (unter Verwendung von Pandas): Lesen der Ergebnisse der morphologischen Analyse
100 Sprachverarbeitung Knock 2020 Kapitel 7: Word Vector
100 Sprachverarbeitung Knock 2020 Kapitel 8: Neuronales Netz
100 Sprachverarbeitung Knock-59: Analyse der S-Formel
100 Sprachverarbeitungsklopfen (2020): 38
Ich habe versucht, 100 Sprachverarbeitung klopfen 2020: Kapitel 1
100 Sprachverarbeitung klopfen 00 ~ 02
100 Sprachverarbeitung Knock Kapitel 1 von Python
100 Sprachverarbeitung Knock 2020 Kapitel 3: Reguläre Ausdrücke
Ich habe versucht, 100 Sprachverarbeitung zu klopfen 2020: Kapitel 2
Ich habe versucht, 100 Sprachverarbeitung zu klopfen 2020: Kapitel 4
Ich habe mit GiNZA v3.1 Kapitel 4 100 Sprachverarbeitungsklopfen 2020 durchgeführt
100 Sprachverarbeitungsklopfen mit Python (Kapitel 2, Teil 2)
100 Sprachverarbeitungsklopfen mit Python (Kapitel 2, Teil 1)
[Programmierer-Neuling "100 Sprachverarbeitung klopfen 2020"] Lösen Sie Kapitel 1
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 UNIX-Befehle in Kapitel 2
100 Sprachverarbeitung Klopfen Sie auf reguläre Ausdrücke, die Sie in Kapitel 3 gelernt haben