- Es gibt zwei Methoden zur Verarbeitung natürlicher Sprache.
- Die Methode zum Ausdrücken von Wörtern aus statistischen Informationen wird als "** Zählbasis " bezeichnet, und die Methode zum neuronalen Netzwerk wird als " Inferenzbasis **" bezeichnet.
- Betrachten Sie als zählbasierte Methode ein Programm, das Sätze basierend auf der ** Häufigkeitsverteilung N-Gramm ** von "Reihen" von Buchstaben und Wörtern generiert.
⑴ Textdaten lesen
from google.colab import files
uploaded = files.upload()
- Wählen Sie eine Textdatei lokal aus und laden Sie sie auf Colaboratory hoch.
- Öffnen Sie die hochgeladene Textdatei und speichern Sie sie in einer Variablen.
- Dieses Mal werde ich den vollständigen Text von Soseki Natsumes "Ich bin eine Katze" als Korpus verwenden.
- https://github.com/yumi-ito/sample_data/blob/master/Neko.txt
with open('Neko.txt', mode='rt', encoding='utf-8') as f:
read_text = f.read()
nekotxt = read_text
print(nekotxt)
- Die Argumente von "open ()" sind der "Dateiname" von links, "mode =" rt "ist die Textmodus-Spezifikation und" encoding = "utf-8" ist der Zeichencode. Wenn Sie links "with" hinzufügen, wird die geöffnete Datei automatisch geschlossen, nachdem der Code im Einzug ausgeführt wurde.
⑵ Morphologische Analyse von MeCab
- MeCab ist eine Open-Source-Engine für morphologische Analysen, die auf zwei Arten verwendet werden kann.
- Eine ist, ** zu verwenden, um eine separate Notiz ** zu machen, die auf die gleiche Weise wie englische Sätze verarbeitet werden kann.
- Die andere Möglichkeit besteht darin, ** Informationen wie Lesen, Originalform und Wortbestandteile für jedes Wort ** zu erhalten, mit denen beispielsweise nur die Nomenklatur extrahiert werden kann.
!apt install aptitude
!aptitude install mecab libmecab-dev mecab-ipadic-utf8 git make curl xz-utils file -y
!pip install mecab-python3==0.7
- Das Obige ist die Installation von MeCab. Importieren und konvertieren Sie dann den vollständigen Text in "separates Schreiben".
- Sie können das Ergebnis als Zeichenfolge erhalten, indem Sie eine Instanz in der Klasse "MeCab.Tagger ()" mit dem Argument "-Owakati" erstellen und dann die Methode "parse ()" aufrufen.
import MeCab
tagger = MeCab.Tagger("-Owakati")
nekotxt = tagger.parse(nekotxt)
print(nekotxt)
- Die Zeichenfolge wird weiter unterteilt. Wenn das Argument jedoch mit "split ()" weggelassen wird, wird ein Leerzeichen als Trennzeichen verwendet.
nekotxt = nekotxt.split()
print(nekotxt)
⑶ Generierung eines N-Gramm-Wörterbuchs
from collections import Counter
import numpy as np
from numpy.random import *
- Platzieren Sie nun die geteilte Wortfolge
nekotxt
als Variable string
.
- Bei 2 Wörtern, dh 2 Gramm, werden die Liste vom Anfang bis zum Ende von "string" und die Liste vom nächsten Wort bis zum Ende von "string" mit "zip ()" und "double" zu einem kombiniert. Sagen wir `.
- Bei 3 Gramm die Liste vom Anfang bis zum Ende von "string", die Liste vom nächsten Wort am Anfang bis zum Ende vor dem Ende und die Liste vom nächsten Wort nach dem Anfang bis zum Ende. Kombinieren Sie die Liste zu einer Liste mit dem Namen "Triple".
- Verwenden Sie zu diesem Zeitpunkt die Funktion
filter ()
, um alle in der Variablen delimiiter
definierten Zeichensymbole zu entfernen.
string = nekotxt
#Auszuschließende Zeichen
delimiter = ['「', '」', '…', ' ']
#2-Wort-Liste
double = list(zip(string[:-1], string[1:]))
double = filter((lambda x: not((x[0] in delimiter) or (x[1] in delimiter))), double)
#Liste von 3 Wörtern
triple = list(zip(string[:-2], string[1:-1], string[2:]))
triple = filter((lambda x: not((x[0] in delimiter) or (x[1] in delimiter) or (x[2] in delimiter))), triple)
#Zählen Sie die Anzahl der Elemente und erstellen Sie ein Wörterbuch
dic2 = Counter(double)
dic3 = Counter(triple)
double
ist eine Liste mit zwei aufeinanderfolgenden Wörtern als Elementen, und Triple
ist eine Liste mit drei aufeinanderfolgenden Wörtern als Elementen.
- Das Ergebnis der Zählung der Häufigkeit des Auftretens von Elementen mit "Counter ()" ist ** 2 Gramm sind "dic2", 3 Gramm sind "dic3" Frequenzdaten **, dh ** N-Gramm-Wörterbuch **. Ich werde.
- Zeigt den Inhalt des N-Gramm-Wörterbuchs an.
for u,v in dic2.items():
print(u, v)
for u,v in dic3.items():
print(u, v)
⑷ Definition der Satzgenerierungsmethode
- Definieren Sie eine Methode
nextword
**, die Sätze generiert, indem Wörter nacheinander basierend auf dem N-Gramm-Wörterbuch generiert werden.
- Mit anderen Worten, ** die Häufigkeit des Auftretens für jeden Satz aufeinanderfolgender Wörter sollte als die Wahrscheinlichkeit des "nächsten Wortes" ** gelesen werden.
- Geben Sie das erste Wort ein, wiederholen Sie die Auswahl des nächsten Wortes, des nächsten Wortes und der häufigsten Wörter und stoppen Sie die Generierung, wenn Sie das Ende erreichen, z. B. ".".
def nextword(words, dic):
##➀ Ermitteln Sie die Anzahl der Elementgramm der ersten Wortwörter
grams = len(words)
## ➁N-Extrahieren Sie passende Elemente aus dem Gramm-Wörterbuch dic
#Für 2 Wörter
if grams == 2:
matcheditems = np.array(list(filter(
(lambda x: x[0][0] == words[1]), #1. Spiele
dic.items())))
#Für 3 Wörter
else:
matcheditems = np.array(list(filter(
(lambda x: x[0][0] == words[1]) and (lambda x: x[0][1] == words[2]), #1. und 2. Spiel
dic.items())))
##➂ Fehlermeldung, wenn kein übereinstimmendes Wort vorhanden ist
if(len(matcheditems) == 0):
print("No matched generator for", words[1])
return ''
##➃ Liste der gewichteten Erscheinungshäufigkeiten
#Abrufen der Häufigkeit des Auftretens von übereinstimmenden Elementen
probs = [row[1] for row in matcheditems]
#Generieren Sie eine Pseudozufallszahl von 0 bis 1 und multiplizieren Sie sie mit der Häufigkeit des Auftretens
weightlist = rand(len(matcheditems)) * probs
##➄ Holen Sie sich das Element mit der höchsten gewichteten Erscheinungshäufigkeit aus übereinstimmenden Elementen
if grams == 2:
u = matcheditems[np.argmax(weightlist)][0][1]
else:
u = matcheditems[np.argmax(weightlist)][0][2]
return u
- ** ➀ ** Das erste Argument,
words
, ist ** ein Wort, das Sie als Anfang eingeben können **. Das zweite Argument "dic" (dic2 oder dic3) wird ausgewählt, je nachdem, ob die Anzahl der Elemente 2 oder 3 Wörter beträgt.
- ** ➁ ** Bei 2 Wörtern stimmt das erste Wort überein, und bei 3 Wörtern stimmen das erste und das nächste Wort ** überein ** bzw. ** aus dem N-Gramm-Wörterbuch extrahiert ** Und speichern Sie es in der Variablen
matcheditems
.
- ** ➂ ** Gibt zurück, wenn die Fehlermeldung kein übereinstimmendes Wort enthält.
- ** ➃ Erzeugt eine Liste der "gewichteten Häufigkeit des Auftretens" ** durch Multiplizieren der Häufigkeit des Auftretens mit einer Pseudozufallszahl. Übrigens, wenn Sie einfach das Element mit der höchsten Erscheinungsfrequenz nehmen, ist das Ergebnis fest und nicht interessant, sodass Sie es durch Rauschen ändern können.
- ** ➄ ** Ruft das Element ** mit der höchsten "gewichteten Erscheinungshäufigkeit" aus der Liste der übereinstimmenden Elemente "übereinstimmende Elemente" ab und gibt es zurück.
⑸ Ausführung des Satzgenerierungsprogramms
- Hier werden 2 Wörter (2 Gramm) übernommen und das erste Wort als "I" eingegeben.
- Wenn Sie das optionale Argument
end =”
for print ()
in der endgültigen dokumentierten Ausgabe verwenden, werden die Leerzeichen (Leerzeichen halber Breite) entfernt, die beim Verketten von Zeichenfolgen entstehen.
#Geben Sie die ersten Wortwörter ein
words = ['', 'ich'] # 2-gram
#words = ['', 'ich', 'Ist'] # 3-gram
#Betten Sie Wörter am Anfang der Ausgabe ein
output = words[1:]
#Holen Sie sich "nächstes Wort"
for i in range(100):
#Für 2 Wörter
if len(words) == 2:
newword = nextword(words, dic2)
#Für 3 Wörter
else:
newword = nextword(words, dic3)
#Fügen Sie der Ausgabe die folgenden Wörter hinzu
output.append(newword)
#Ende, wenn das nächste Zeichen ein Ende ist
if newword in ['', '。', '?', '!']:
break
#Das nächste Wort vorbereiten
words = output[-len(words):]
print(words)
#Ausgabe Ausgabe anzeigen
for u in output:
print(u, end='')
- 2-Zeigt an, wie Elemente nacheinander aus dem Gramm-Wörterbuch extrahiert werden.
- Daher ist N-Gramm im Gegensatz zur inferenzbasierten Methode sehr einfach ...
- Als persönliche Erfahrung stieß ich 2008 (2008) auf einen sehr interessanten Forschungsbericht mit N-Gramm.
- Verwenden Sie die Sammlung japanischer Gedichte "Kokonwakashu" aus der frühen Heian-Zeit als Korpus, extrahieren Sie die einzigartigen Ausdrücke jedes Mannes und jeder Frau nach N-Gramm und überprüfen Sie auf dieser Grundlage die japanischen Gedichte, die von den Figuren in "Genji Monogatari" geschrieben wurden. Es ist eine Initiative.
- Es ist nicht ungewöhnlich, dass Frauen auch in der heutigen Zeit männliche Sprache verwenden, aber es stellte sich heraus, dass Menschen in Wirklichkeit durch die Verwendung von männlicher und weiblicher Sprache geschickt modelliert wurden. Zum Beispiel kann ein Mann, dem männliche Ausdrücke fehlen und der nicht männlich ist, oder eine Frau, die über männlich zentrierte soziale Normen hinausgeht, als interessant bezeichnet werden, die nur Leser zu dieser Zeit verstehen können.
- Kurz gesagt, ich denke, N-Gramm hat immer noch viel Potenzial, abhängig von der Idee, was für den Korpus verwendet und was damit analysiert werden soll.