Die einfache Erklärung der Markov-Kette ist, dass der Zustand zum vorherigen Zeitpunkt den Zustand zum nächsten Mal bestimmt. Wenn Sie sich ein konkretes Beispiel im Text ansehen und das Wort "Bauch" sehen, scheint es, als würde "leer" als nächstes kommen. Dies ist jedoch nicht die einzig richtige Antwort für "frei", sondern es können auch andere "voll" kommen. Denken wir also darüber nach, dies mit einer Wahrscheinlichkeit auszudrücken. Nehmen wir an, dass die Wörter, die auf "Bauch" folgen, eine 60% ige Chance haben, "frei" zu sein, und eine 40% ige Chance, "voll" zu sein. Diese Wahrscheinlichkeit ist die Wahrscheinlichkeit jedes der folgenden Zustände, die als Übergangswahrscheinlichkeit bezeichnet wird. Bisher ist es einfach, aber ich habe über die Markov-Kette gesprochen. Wenn Sie mehr über die Geschichte hier erfahren möchten, lesen Sie bitte Die Grundlagen der Markov-Kette und der Kormogorov-Gleichung (eine schöne Geschichte der Mathematik der High School).
Es ist jedoch nicht der Fall, wenn gesagt wird, dass die Sätze vollständig durch die Markov-Kette erklärt werden können. Wenn zum Beispiel "Ich habe Hunger", besteht eine hohe Wahrscheinlichkeit, dass ich "hungrig" bin, aber wenn ich "bereits hungrig" bin, besteht eine hohe Wahrscheinlichkeit, dass ich "voll" bin. Dies bedeutet, dass der Satz nicht nur vom vorherigen Wort, sondern auch von den früheren Wörtern abhängt. Im Übrigen kommt es auf den Kontext an. Da sich dieser Artikel jedoch mit der Markov-Kette befasst, möchte ich diesen Bereich in einem anderen Artikel vorstellen.
Der Zweck des diesmal erstellten Programms besteht darin, automatisch einen neuen Bericht mit den Daten des von mir erstellten Berichts zu erstellen. Lesen Sie also zuerst die Datei.
import random
from janome.tokenizer import Tokenizer
with open("data.csv", "rt", encoding="utf-8_sig") as f:
text_raws = f.read()
text_raws = text_raws.replace("\n", "@\n").split("\n")
Geladene data.csv. Hier sind die Daten des Berichts des Autors, aber ich finde es etwas schlecht, dies nach außen zu veröffentlichen, deshalb werde ich es in einen entsprechenden Satz setzen, wenn ich es auf github poste. Ich habe es nach dem Lesen ersetzt, weil ich am Ende des Satzes "@" als Zeichen einfügen wollte.
text_lists = []
t = Tokenizer()
for text_raw in text_raws:
text_list = []
tokens = t.tokenize(text_raw, wakati=True)
for token in tokens:
text_list.append(token)
text_lists.append(text_list)
Wir werden eine morphologische Analyse mit Tokenizer durchführen. Die morphologische Analyse besteht darin, einen Satz beispielsweise wie folgt in Wörter zu unterteilen.
["Ich werde einen Artikel über Qiita veröffentlichen."]] ↓ ['Ich', 'ist', 'Qiita', 'zu', 'Artikel', 'zu', 'Post', 'zu', '. ']
Außerdem werden standardmäßig zusätzliche Informationen wie Teiltexte hinzugefügt. Wenn Sie den Parameter auf "wakati = True" setzen, werden nur die Wörter extrahiert.
dic = {}
for text_list in text_lists:
for i in range(len(text_list) - 1):
if text_list[i] in dic:
lists = dic[text_list[i]]
else:
lists = []
lists.append(text_list[i + 1])
dic[text_list[i]] = lists
Hier wird die Entsprechung zwischen dem vorherigen und dem nächsten Wort in einem Wörterbuchformat wie {"Tummy": ["Suita", "Full"]} generiert.
word = input("Bitte geben Sie das erste Wort ein")
generate = word
word = list(t.tokenize(word, wakati=True))[-1]
limit = 10000
cnt = 0
while cnt < limit:
try:
word = random.choice(dic[word])
if word == "@":
break
except:
break
cnt += 1
generate += word
print(generate)
Das erste Wort hat die Form der Eingabe. Dann wird das eingegebene Wort morphologisch analysiert und die Markov-Kette wird vom letzten Wort aus gestartet. Die Übergangswahrscheinlichkeit wird zufällig aus dem Wörterbuch abgerufen und ist proportional zur Anzahl der Vorkommen. Schließlich habe ich es als Zeichen am Ende des Satzes eingeführt, eine Obergrenze festgelegt, um nicht "@" oder eine unbegrenzte Schleife zu erreichen, und fertig.
Damit ist das Programm abgeschlossen. Probieren wir es aus.
Geben Sie "Heute" ein Generation "Heute gab es eine Verzögerung bei der Zusammenfassung weniger zufriedenstellender Verfahren und der Nutzung unnatürlicher Techniken."
Geben Sie "Person" ein Generation "Ich dachte, es sei notwendig, den Fluss der technischen Unterstützung für bestimmte Datenverfahren bei starkem Regen in der Zukunft zu sehen, die eher von Menschen getragen werden."
Ich weiß nicht, wovon du sprichst. Wie eingangs erwähnt, wird die Sprache nicht nur durch die unmittelbar vorhergehenden Wörter bestimmt, so dass ich eine unnatürliche Verbindung wie "viele → → →" hatte. Das nächste Mal möchte ich es verbessern, damit ich mit LSTM usw. das optimale Wort aus früheren Zuständen beurteilen kann. Quellcode hier
Ich möchte Tweets in Python generieren! -Markov Chain Edition- Die Grundlagen der Markov-Kette und der Kormogorov-Gleichung (eine schöne Geschichte der Mathematik der High School)
Recommended Posts