Dies ist das dritte Mal, dass eine automatische Satzgenerierung angestrebt wird. Dieses Mal erstellen wir eine Funktion zur Satzgenerierung. Der Code wird lang sein. Lass es uns in der richtigen Reihenfolge tun.
Lassen Sie uns nun über Code sprechen. Hier ist derjenige, der zuerst verwendet wird.
import re
from janome.tokenizer import Tokenizer
from tqdm import tqdm
from collections import Counter
from collections import defaultdict
import random
t = Tokenizer()
Bereiten Sie den Text vor und laden Sie ihn. Halten Sie auch den Textinhalt sauber. Dieser Bereich ist wie im vorherigen Artikel.
a = open('test.txt', 'r', encoding = "utf-8")
original_text = a.read()
#print(original_text) #Dokument anzeigen
first_sentence = '"Erklärung von Python."'
last_sentence = 'Die Reptilien-Nishiki-Schlange, was das englische Wort Python bedeutet, wird als Maskottchen und Symbol der Python-Sprache verwendet.'
#Textdaten organisieren.
_, text = original_text.split(first_sentence)
text, _ = text.split(last_sentence)
text = first_sentence + text + last_sentence
text = text.replace('!', '。') #!! Was? Zu. Ändern. Achten Sie auf volle und halbe Winkel
text = text.replace('?', '。')
text = text.replace('(', '').replace(')', '') #Löschen ().
text = text.replace('\r', '').replace('\n', '') #Wird mit Zeilenumbrüchen in Textdaten angezeigt\Löschen n
text = re.sub('[、「」?]', '', text)
sentences = text.split('。') #.. Teile Sätze in Sätze mit
print('Wortzahl:', len(sentences))
sentences[:10] #10 Sätze anzeigen
Satz für Satz aufschlüsseln.
start = '__start__' #Anweisung Startmarke
fin = '__fin__' #Ende des Satzes
def get_three_words_list(sentence): #Geben Sie einen Satz als Satz von 3 Wörtern zurück
t = Tokenizer()
words = t.tokenize(sentence, wakati=True)
words = [start] + words + [fin]
three_words_list = []
for i in range(len(words) - 2):
three_words_list.append(tuple(words[i:i+3]))
return three_words_list
three_words_list = []
for sentence in tqdm(sentences):
three_words_list += get_three_words_list(sentence)
three_words_count = Counter(three_words_list)
len(three_words_count)
Wörter verbinden und gewichten
#Markov-Kette
def generate_markov_dict(three_words_count):
markov_dict = {}
for three_words, count in three_words_count.items():
two_words = three_words[:2] #Unterteilt in die ersten beiden Wörter und das nächste Wort
next_word = three_words[2]
if two_words not in markov_dict: #Generieren Sie leere Daten, wenn diese nicht im Wörterbuch vorhanden sind
markov_dict[two_words] = {'words': [], 'weights': []}
markov_dict[two_words]['words'].append(next_word) #Fügen Sie die folgenden Wörter und Zeiten hinzu
markov_dict[two_words]['weights'].append(count)
return markov_dict
markov_dict = generate_markov_dict(three_words_count)
markov_dict
def get_first_words_weights(three_words_count):
first_word_count = defaultdict(int)
for three_words, count in three_words_count.items():
if three_words[0] == start:
next_word = three_words[1]
first_word_count[next_word] += count
words = [] #Wörter und Gewichte(Anzahl der Auftritte)Liste zum Speichern
weights = []
for word, count in first_word_count.items():
words.append(word) #Fügen Sie der Liste Wörter und Gewichte hinzu
weights.append(count)
return words, weights
get_first_words_weights(three_words_count)
markov_dict = generate_markov_dict(three_words_count)
print(len(markov_dict))
first_words, first_weights = get_first_words_weights(three_words_count)
print(len(first_words))
def get_first_words_weights(three_words_count):
first_word_count = defaultdict(int)
for three_words, count in three_words_count.items():
if three_words[0] == start:
next_word = three_words[1]
first_word_count[next_word] += count
words = [] #Wörter und Gewichte(Anzahl der Auftritte)Liste zum Speichern
weights = []
for word, count in first_word_count.items():
words.append(word) #Fügen Sie der Liste Wörter und Gewichte hinzu
weights.append(count)
return words, weights
get_first_words_weights(three_words_count)
def get_first_words_weights(three_words_count):
first_word_count = defaultdict(int) #Erstellen Sie ein Standarddikt mit dem Wert int
for three_words, count in three_words_count.items():
if three_words[0] == start: #Extrahieren Sie nur diejenigen, die mit start beginnen
next_word = three_words[1]
first_word_count[next_word] += count #Fügen Sie die Anzahl der Auftritte hinzu
return first_word_count
get_first_words_weights(three_words_count)
def generate_text(fwords, fweights, markov_dict):
first_word = random.choices(fwords, weights=fweights)[0] #Holen Sie sich das erste Wort
generate_words = [start, first_word] #Liste zum Speichern von Wörtern für die Satzgenerierung
while True:
pair = tuple(generate_words[-2:]) #Holen Sie sich die letzten beiden Wörter
words = markov_dict[pair]['words'] #Holen Sie sich eine Liste der folgenden Wörter und Gewichte
weights = markov_dict[pair]['weights']
next_word = random.choices(words, weights=weights)[0] #Holen Sie sich das nächste Wort
if next_word == fin: #Verlasse die Schleife, wenn der Satz endet
break
generate_words.append(next_word)
return ''.join(generate_words[1:]) #Erstellen Sie Sätze aus Wörtern
Generierung starten!
for l in range(3):
sentence = generate_text(first_words, first_weights, markov_dict)
print(sentence)
Das Ergebnis ist dies.
(゚ Д ゚) Die ursprüngliche Mutter ist herausgekommen ... Absolut die Menge an Originaltext ist gering. Achtung) Als ich versuchte, es auszuführen, waren die Spezifikationen des PCs unzureichend oder es wurde nicht richtig generiert. Der Grund ist unbekannt. Es braucht Zeit für eine große Menge Text.
Der Text wird jetzt automatisch generiert. Dies ist das Ende von "Streben nach automatischer Satzgenerierung". Es gibt einige Verbesserungen, aber die ursprüngliche Textmenge und die Funktionen sind immer noch unzureichend. Aus diesem Grund gibt es viele, die den Satz von sic unweigerlich beendet haben. Schade, dass der Text in diesem Beispiel nicht interessant ist. Ich werde wieder einen Artikel schreiben, wenn ich ihn ein wenig reparieren kann.
Dieser Code basiert auf dem Buch und seinem Beispielcode. (Ich habe den Namen des Buches vergessen.) Osamu Osamu, der damals ging.
Recommended Posts