C'est la troisième fois que l'on vise la génération automatique de phrases. Cette fois, nous allons créer une fonction pour la génération de phrases. Le code sera long. Faisons-le dans l'ordre.
Parlons maintenant du code. Voici celui à utiliser en premier.
import re
from janome.tokenizer import Tokenizer
from tqdm import tqdm
from collections import Counter
from collections import defaultdict
import random
t = Tokenizer()
Préparez le texte et chargez-le. Gardez également le contenu du texte propre. Ce domaine est comme je l'ai fait dans l'article précédent.
a = open('test.txt', 'r', encoding = "utf-8")
original_text = a.read()
#print(original_text) #Afficher le document
first_sentence = '"Explication de Python."'
last_sentence = 'Le reptile Nishiki Snake, qui signifie le mot anglais Python, est utilisé comme mascotte et icône du langage Python.'
#Organisez les données textuelles.
_, text = original_text.split(first_sentence)
text, _ = text.split(last_sentence)
text = first_sentence + text + last_sentence
text = text.replace('!', '。') #!! Quoi? À. Changer en. Faites attention aux angles pleins et demi
text = text.replace('?', '。')
text = text.replace('(', '').replace(')', '') #Effacer ().
text = text.replace('\r', '').replace('\n', '') #Affiché avec des sauts de ligne dans les données texte\Supprimer n
text = re.sub('[、「」?]', '', text)
sentences = text.split('。') #.. Divisez les phrases en phrases avec
print('nombre de mots:', len(sentences))
sentences[:10] #Afficher 10 phrases
Décomposez phrase par phrase.
start = '__start__' #Marque de début de l'instruction
fin = '__fin__' #Fin de phrase
def get_three_words_list(sentence): #Renvoie une phrase sous la forme d'un ensemble de 3 mots
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)
Connecter et peser les mots
#Chaîne de Markov
def generate_markov_dict(three_words_count):
markov_dict = {}
for three_words, count in three_words_count.items():
two_words = three_words[:2] #Divisé en deux premiers mots et le mot suivant
next_word = three_words[2]
if two_words not in markov_dict: #Générer des données vides si elles n'existent pas dans le dictionnaire
markov_dict[two_words] = {'words': [], 'weights': []}
markov_dict[two_words]['words'].append(next_word) #Ajoutez les mots et heures suivants
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 = [] #Mots et poids(Nombre d'apparitions)Liste à stocker
weights = []
for word, count in first_word_count.items():
words.append(word) #Ajouter des mots et des poids à la liste
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 = [] #Mots et poids(Nombre d'apparitions)Liste à stocker
weights = []
for word, count in first_word_count.items():
words.append(word) #Ajouter des mots et des poids à la liste
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) #Créer un defaultdict avec une valeur de int
for three_words, count in three_words_count.items():
if three_words[0] == start: #Extrayez uniquement ceux qui commencent par start
next_word = three_words[1]
first_word_count[next_word] += count #Ajouter le nombre d'apparitions
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] #Obtenez le premier mot
generate_words = [start, first_word] #Liste pour stocker les mots pour la génération de phrases
while True:
pair = tuple(generate_words[-2:]) #Obtenez les deux derniers mots
words = markov_dict[pair]['words'] #Obtenez une liste des mots et poids suivants
weights = markov_dict[pair]['weights']
next_word = random.choices(words, weights=weights)[0] #Obtenez le mot suivant
if next_word == fin: #Quitter la boucle à la fin de la phrase
break
generate_words.append(next_word)
return ''.join(generate_words[1:]) #Créer des phrases à partir de mots
Commencez la génération!
for l in range(3):
sentence = generate_text(first_words, first_weights, markov_dict)
print(sentence)
Le résultat est le suivant.
(゚ Д ゚) La maman d'origine est sortie ... Absolument, la quantité de texte original est petite. Attention) Lorsque j'ai essayé de l'exécuter, les spécifications du PC étaient insuffisantes ou il n'a pas été généré correctement. La raison est inconnue. Cela prend du temps pour une grande quantité de texte.
Le texte est maintenant généré automatiquement. C'est la fin de "Viser la génération automatique de phrases". Il y a quelques améliorations, mais la quantité originale de texte et de fonctionnalités est encore insuffisante. Pour cette raison, il y en a beaucoup qui ont inévitablement terminé la phrase de sic. C'est donc dommage personnellement que le texte de cet exemple ne soit pas intéressant. J'écrirai à nouveau un article si je peux le réparer un peu.
Ce code est basé sur le livre et son exemple de code. (J'ai oublié le nom du livre.) Osamu Osamu Je publierai également le texte qui a été créé sur la base de la disqualification des êtres humains.
Recommended Posts