Python 20行マルコフチェーンを実現した鶏スープジェネレータ
6698 ワード
原文住所:https://codeburst.io/how-i-generated-inspirational-quotes-with-less-than-20-lines-of-code-38273623c905著者:Ramtin Alami
マルコフ鎖
本文は私のいくつかの简単な翻訳と理解です(多くの面白さを削除したら、タイプを少なくするために...).翻訳者の猫に対する尊重がなければ、私に連絡してください.原文を直接読むのがおすすめです
私には猫がいて、毎日食べたり飲んだりして寝ていて、目が覚めたら直接遊びに行くのはほとんど不可能ですが、ご飯を食べたら騒ぎ始める可能性が高いです.次の図:各輪は状態を表し、矢印の数字は次の状態を表す確率は
マルコフチェーンベースの文字ジェネレータ
この2つの文は訓練集で、I like toとYouはいつもeatと一緒にいて、eatの後ろはapplesとorangesの確率と平等であることがわかります.確率遷移図は以下の通りです.このモデルでは、2つの新しい文を生成することができます.
しかし、私は次のいくつかの文で訓練して、結果はとても違います.
いくつか複雑ですが、原理は同じです.startノードからランダムに次のノードに終了することを知っています.4つの文化しかありませんが、数百の文を生成することができます.
コード#コード#
簡単です.pythonのrandom moduleを使えばいいです.2つの部分、1つの訓練、1つの生成文が含まれています.
Training
コード構築のモデルは辞書であり、辞書のkeyはノードであり、対応するvauleはkeyのノードが接続されている可能性のあるノードであり、例えば前の2つの文「I like to eat oranges」、「You eat apples」が構築した辞書は大体このようなものである.
確率を統計する必要はありません.何度も現れたら、辞書に2つ追加すればいいです.例えば、「we eat apples」という文があると、自分は次のようになります.
2つの追加のノードSTARTとENDは私たちがどこからいつ結合するかだけを始めるためです.
Generation
startの単語からランダムに1つを選択してリストに追加し、この単語の接続された次の単語をランダムに1つ選択してリストに追加し、endまでループします.
マルコフ鎖
本文は私のいくつかの简単な翻訳と理解です(多くの面白さを削除したら、タイプを少なくするために...).翻訳者の猫に対する尊重がなければ、私に連絡してください.原文を直接読むのがおすすめです
私には猫がいて、毎日食べたり飲んだりして寝ていて、目が覚めたら直接遊びに行くのはほとんど不可能ですが、ご飯を食べたら騒ぎ始める可能性が高いです.次の図:各輪は状態を表し、矢印の数字は次の状態を表す確率は
に重点を置いている.マルコフチェーンベースの文字ジェネレータ
I like to eat apples.
You eat oranges.
この2つの文は訓練集で、I like toとYouはいつもeatと一緒にいて、eatの後ろはapplesとorangesの確率と平等であることがわかります.確率遷移図は以下の通りです.このモデルでは、2つの新しい文を生成することができます.
I like to eat oranges.
You eat apples.
しかし、私は次のいくつかの文で訓練して、結果はとても違います.
my friend makes the best raspberry pies in town
i think apple pies are the best pies
steve thinks apple makes the best computers in the world
I own two computers and they’re not apple because I am not steve or rich
いくつか複雑ですが、原理は同じです.startノードからランダムに次のノードに終了することを知っています.4つの文化しかありませんが、数百の文を生成することができます.
コード#コード#
簡単です.pythonのrandom moduleを使えばいいです.2つの部分、1つの訓練、1つの生成文が含まれています.
Training
コード構築のモデルは辞書であり、辞書のkeyはノードであり、対応するvauleはkeyのノードが接続されている可能性のあるノードであり、例えば前の2つの文「I like to eat oranges」、「You eat apples」が構築した辞書は大体このようなものである.
{'START': ['i', 'you'], 'i': ['like'], 'like': ['to'], 'to': ['eat'],
'you': ['eat'], 'eat': ['apples', 'oranges'], 'END': ['apples', 'oranges']}
確率を統計する必要はありません.何度も現れたら、辞書に2つ追加すればいいです.例えば、「we eat apples」という文があると、自分は次のようになります.
{'START': ['i', 'we', 'you'], 'i': ['like'], 'like': ['to'], 'to': ['eat'],
'you': ['eat'], 'we': ['eat'], 'eat': ['apples', 'oranges', 'apples'],
'END': ['apples', 'oranges', 'apples']}
2つの追加のノードSTARTとENDは私たちがどこからいつ結合するかだけを始めるためです.
for line in dataset_file:
line = line.lower().split()
for i, word in enumerate(line):
if i == len(line)-1:
model['END'] = model.get('END', []) + [word]
else:
if i == 0:
model['START'] = model.get('START', []) + [word]
model[word] = model.get(word, []) + [line[i+1]]
Generation
startの単語からランダムに1つを選択してリストに追加し、この単語の接続された次の単語をランダムに1つ選択してリストに追加し、endまでループします.
import random
generated = []
while True:
if not generated:
words = model['START']
elif generated[-1] in model['END']:
break
else:
words = model[generated[-1]]
generated.append(random.choice(words))