[PYTHON] J'ai essayé de créer automatiquement un rapport avec la chaîne de Markov

Qu'est-ce que la chaîne de Markov?

L'explication simple de la chaîne de Markov est que l'état à l'instant précédent détermine l'état à la fois suivante. En regardant un exemple concret dans le texte, quand vous voyez le mot «ventre», il semble que «vide» viendra ensuite. Cependant, ce n'est pas la seule bonne réponse pour «vacant», mais d'autres «pleins» peuvent venir. Alors, pensons à exprimer cela avec une probabilité. Supposons que les mots qui suivent «ventre» ont 60% de chances d'être «vacants» et 40% de chances d'être «plein». Cette probabilité est la probabilité de chacun des états suivants appelés probabilité de transition. Jusqu'à présent, c'est facile, mais j'ai parlé de la chaîne Markov. Si vous voulez en savoir plus sur l'histoire ici, veuillez lire Les bases de la chaîne de Markov et l'équation de Kormogorov (une belle histoire de mathématiques au lycée).

Cependant, ce n'est pas le cas si l'on dit que les phrases peuvent être entièrement expliquées par la chaîne de Markov. Par exemple, quand «j'ai faim», il y a une forte probabilité que j'aie «faim», mais quand j'ai «déjà faim», il y a une forte probabilité que je sois «rassasié». Cela signifie que la phrase dépend non seulement du mot précédent mais aussi des mots précédents. D'ailleurs, cela dépend du contexte. Cependant, puisque cet article traite de la chaîne de Markov, je voudrais introduire ce domaine dans un autre article.

programme

Le but du programme créé cette fois-ci est de générer automatiquement un nouveau rapport en utilisant les données du rapport créé par moi-même. Alors, lisez d'abord le fichier.


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")

Data.csv chargé. Voici les données du rapport de l'auteur, mais je pense que c'est un peu mal de publier ceci à l'extérieur, donc je vais le mettre dans une phrase appropriée lors de la publication sur github. Je l'ai remplacé après l'avoir lu car je voulais insérer «@» comme marque à la fin de la phrase.


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)

Nous effectuerons une analyse morphologique à l'aide de Tokenizer. L'analyse morphologique consiste à diviser une phrase en mots, par exemple, comme suit.

["Je publierai un article sur qiita."]] ↓ ["Je", "est", "qiita", "vers", "article", "vers", "post", "vers", ". ']

De plus, par défaut, des informations supplémentaires telles que les paroles des parties sont ajoutées, donc en définissant le paramètre sur wakati = True, seuls les mots sont extraits.


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

Ici, la correspondance entre le mot précédent et le mot suivant est générée dans un format de dictionnaire tel que {"Tummy": ["Suita", "Full"]}.


word = input("Veuillez saisir le premier mot")
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)

Le premier mot se présente sous la forme d'être entré. Ensuite, le mot saisi est analysé morphologiquement et la chaîne de Markov est démarrée à partir du dernier mot. La probabilité de transition est extraite aléatoirement du dictionnaire et proportionnelle au nombre d'occurrences. Enfin, je l'ai présenté comme un signe à la fin de la phrase, j'ai fixé une limite supérieure pour qu'il n'atteigne pas @ ou ne boucle indéfiniment, et cela se termine.

Ceci termine le programme. Essayons-le.

Entrez "Aujourd'hui" Génération "Aujourd'hui, il y a eu un retard dans l'agrégation de procédures moins satisfaisantes et l'utilisation de techniques non naturelles."

Entrez "personne" Génération "Je pensais qu'il était nécessaire de voir le flux d'assistance technique pour les procédures spécifiques de données de fortes pluies à l'avenir, qui est plus susceptible d'être porté par les gens."

Je ne sais pas de quoi tu parles. Comme je l'ai mentionné au début, la langue n'est pas déterminée uniquement par le dernier mot, donc je me suis retrouvé avec une connexion non naturelle comme "beaucoup → → →". La prochaine fois, j'aimerais l'améliorer afin de pouvoir juger le mot optimal à partir d'autres états passés utilisant LSTM, etc. Code source ici

Les références

Je veux générer des tweets en Python! -Markov Chain Edition- Les bases de la chaîne de Markov et l'équation de Kormogorov (une belle histoire de mathématiques au lycée)

Recommended Posts

J'ai essayé de créer automatiquement un rapport avec la chaîne de Markov
[Outlook] J'ai essayé de créer automatiquement un e-mail de rapport quotidien avec Python
[Python] J'ai essayé de créer automatiquement un rapport quotidien de YWT avec la messagerie Outlook
[Chaîne de Markov] J'ai essayé de lire les citations en Python.
J'ai essayé de créer un linebot (implémentation)
J'ai essayé de créer un linebot (préparation)
Un mémorandum lors de l'acquisition automatique avec du sélénium
J'ai essayé de créer une liste de nombres premiers avec python
J'ai essayé de créer des taureaux et des vaches avec un programme shell
J'ai essayé de créer un programme qui convertit les nombres hexadécimaux en nombres décimaux avec python
J'ai essayé de créer un plug-in avec HULFT IoT Edge Streaming [Development] (2/3)
J'ai essayé de créer un plug-in avec HULFT IoT Edge Streaming [Execution] (3/3)
J'ai essayé de créer un plug-in avec HULFT IoT Edge Streaming [Setup] (1/3)
J'ai essayé de lire et d'enregistrer automatiquement avec VOICEROID2 2
J'ai essayé de lire et d'enregistrer automatiquement avec VOICEROID2
Je souhaite créer manuellement une légende avec matplotlib
Quand j'ai essayé de créer un environnement virtuel avec Python, cela n'a pas fonctionné
J'ai essayé de créer facilement un système de présence entièrement automatique avec Selenium + Python
J'ai essayé de créer un bouton pour Slack avec Raspeye + Tact Switch
J'ai essayé de créer un modèle avec l'exemple d'Amazon SageMaker Autopilot
J'ai essayé d'implémenter une ligne moyenne mobile de volume avec Quantx
J'ai essayé de créer l'API Quip
Créez un bot Mastodon avec une fonction pour répondre automatiquement avec Python
[Chaîne de Markov] J'ai essayé de charger des émotions négatives dans Python.
J'ai essayé de générer automatiquement la chaîne de caractères à entrer dans M. Adjustment avec Python
J'ai essayé de résoudre le problème d'optimisation des combinaisons avec Qiskit
J'ai essayé de commencer avec Hy ・ Définir une classe
J'ai essayé de créer un environnement d'apprentissage amélioré pour Othello avec Open AI gym
J'ai essayé de trier une colonne FizzBuzz aléatoire avec un tri à bulles.
J'ai essayé de créer un bot pour annoncer un événement Wiire
J'ai essayé de créer une classe pour rechercher des fichiers avec la méthode Glob de Python dans VBA
J'ai essayé d'écrire dans un modèle de langage profondément appris
J'ai essayé de créer un cadre de données pandas en grattant les informations de rappel d'aliments avec Python
J'ai essayé de créer un article dans Wiki.js avec SQL Alchemy
[5e] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé de créer un environnement serveur qui fonctionne sous Windows 10
J'ai essayé de créer un pointage de crédit simple avec régression logistique.
[2nd] J'ai essayé de créer un certain outil de type Authenticator avec python
Je voulais créer une présentation intelligente avec Jupyter Notebook + nb present
[3ème] J'ai essayé de créer un certain outil de type Authenticator avec python
[Python] Un mémo que j'ai essayé de démarrer avec asyncio
J'ai essayé de faire un processus d'exécution périodique avec Selenium et Python
J'ai essayé de créer une application de notification de publication à 2 canaux avec Python
J'ai essayé de créer une application todo en utilisant une bouteille avec python
[4th] J'ai essayé de créer un certain outil de type Authenticator avec python
[1er] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé de faire une étrange citation pour Jojo avec LSTM
J'ai essayé de collecter automatiquement des images de Kanna Hashimoto avec Python! !!
J'ai essayé de me connecter automatiquement à Twitter avec du sélénium (RPA, scraping)
J'ai essayé de créer un mécanisme de contrôle exclusif avec Go
J'ai essayé d'implémenter Autoencoder avec TensorFlow
J'ai essayé de visualiser AutoEncoder avec TensorFlow
J'ai essayé de commencer avec Hy
J'ai essayé un langage fonctionnel avec Python
J'ai essayé d'implémenter CVAE avec PyTorch
J'ai créé une API Web
J'ai essayé de résoudre TSP avec QAOA