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