[Jouons avec Python] Viser la génération automatique de phrases ~ Achèvement de la génération automatique de phrases ~

introduction

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.

Partie de code

Préparer des données textuelles

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écomposer les 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)

Générer automatiquement des phrases

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. 2020-02-19.png

Réflexion et prudence

(゚ Д ゚) 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.

Bavarder

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. 2020-02-19 (1).png

Recommended Posts

[Jouons avec Python] Viser la génération automatique de phrases ~ Achèvement de la génération automatique de phrases ~
[Jouons avec Python] Viser la génération automatique de phrases ~ Effectuer une analyse morphologique ~
[Jouons avec Python] Viser la génération automatique de phrases ~ Lisez .txt et faites-en une unité de phrase ~
Jouons avec Excel avec Python [Débutant]
Jouez avec 2016-Python
Jeu à la main en Python (commençons avec AtCoder?)
Fonctionnement automatique de Chrome avec Python + Sélénium + pandas
Déplacer la scène automatique THORLABS avec Python [pour recherche]
[Python3] Génération automatique de texte avec janome et markovify
Jouons avec Python Receive et enregistrez / affichez le texte du formulaire de saisie
Paramètres VS Code pour le développement en Python avec achèvement
[Jouons avec Python] Créer un livre de comptes de ménage
Récapitulatif des outils d'exploitation de l'interface graphique Windows avec Python
[Pour jouer] Essayez de faire de Yuma un robot LINE (Python)
[Piyopiyokai # 1] Jouons avec Lambda: création d'un script Python
Exploitons GPIO de Raspeye avec Python CGI
J'ai écrit le code pour la génération de phrases japonaises avec DeZero
[Pour les débutants] Résumé de l'entrée standard en Python (avec explication)
Simulez des dommages-intérêts tardifs pour les frais de garde d'enfants en souffrance avec Python
[Jouons avec Python] Traitement d'image en monochrome et points
Tourner un tableau de chaînes avec une instruction for (Python3)
Jouez avec le mécanisme de mot de passe de GitHub Webhook et Python
Génération automatique de quiz avec COTOHA
Jouons avec la 4e dimension 4e
Mise à jour automatique du module Python
Génération de phrases avec GRU (keras)
Jouons avec les données Amedas - Partie 4
[Python] Jouez avec le Webhook de Discord.
Jouons avec les données Amedas - Partie 3
Jouons avec les données Amedas - Partie 2
Construisons git-cat avec Python
Mécanisme de vérification automatique des peluches avec flake8 lors de la validation du code python
Faites attention à LANG pour UnicodeEncodeError lors de l'impression du japonais avec Python 3
J'ai créé beaucoup de fichiers pour la connexion RDP avec Python
L'histoire de la création d'un pilote standard pour db avec python.
Résumons le degré de couplage entre les modules avec du code Python
Création automatique du calendrier mensuel 2021 (recharge pour notebook système) par Python
Les débutants créeront un bot de trading automatique Bitcoin visant beaucoup d'argent! Partie 2 [Transaction avec API]
Faisons une interface graphique avec python.
Premiers pas avec Python pour les classes PHPer
Premiers pas avec Python Bases de Python
Jeu de vie avec Python! (Le jeu de la vie de Conway)
10 fonctions du "langage avec batterie" python
Faisons du scraping d'images avec Python
4ème nuit de boucle avec pour
Générer un mot de passe pour le manuel avec python
Faisons un graphe avec python! !!
Implémentation de la méthode Dyxtra par python
Génération de jetons de contre-mesure CSRF avec Python
Génération automatique de Sadamasashi Kawayanagi
Premiers pas avec python3
Coexistence de Python2 et 3 avec CircleCI (1.0)
Premiers pas avec Python pour les fonctions PHPer
J'ai essayé la génération de phrases avec GPT-2
Enregistrement de l'introduction de Python pour les nouveaux arrivants
Analysons la voix avec Python # 1 FFT