Python 20行マルコフチェーンを実現した鶏スープジェネレータ

6698 ワード

原文住所:https://codeburst.io/how-i-generated-inspirational-quotes-with-less-than-20-lines-of-code-38273623c905著者:Ramtin Alami
マルコフ鎖
本文は私のいくつかの简単な翻訳と理解です(多くの面白さを削除したら、タイプを少なくするために...).翻訳者の猫に対する尊重がなければ、私に連絡してください.原文を直接読むのがおすすめです
私には猫がいて、毎日食べたり飲んだりして寝ていて、目が覚めたら直接遊びに行くのはほとんど不可能ですが、ご飯を食べたら騒ぎ始める可能性が高いです.次の図:各輪は状態を表し、矢印の数字は次の状態を表す確率は に重点を置いている.
マルコフチェーンベースの文字ジェネレータ
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))