Вот простой фрагмент кода, чтобы показать, как можно решить эту задачу (с очень наивным подходом)
bigram1 = {'Let' : {'the': 0.2857142857142857, 'dainty':
0.14285714285714285, 'it': 0.14285714285714285, 'those':
0.14285714285714285, 'me': 0.14285714285714285, 'us':
0.14285714285714285}}
bigram2 = {'the' : {'dogs' : 0.4, 'it' : 0.2, 'a' : 0.2, 'b': 0.2}}
bigram3 = {'dogs' : {'out' : 0.6, 'it' : 0.2, 'jj' : 0.2}}
model = {}
model.update(bigram1)
model.update(bigram2)
model.update(bigram3)
sentence = []
iterations = 3
word = 'Let'
sentence.append(word)
for _ in range(iterations):
max_value = 0
for k, v in model[word].iteritems():
if v >= max_value:
word = k
max_value = v
sentence.append(word)
print(" ".join(sentence))
output
Let the dogs out
код написан в оченьпростой способ, и это игрушечный пример для понимания предлагает
имейте в виду, слово, взятое в первом слове, встречающемся с максимальным значением, таким образом, эта модель является детерминированной, рассмотрите возможность добавления случайного подхода выбора из набораслов, которые имеют одно и то же максимальное значение
Я предлагаю сделать выборку слов пропорционально их вероятностям, как, например, так:
dist = {'the': 0.2857142857142857, 'dainty':
0.14285714285714285, 'it': 0.14285714285714285, 'those':
0.14285714285714285, 'me': 0.14285714285714285, 'us':
0.14285714285714285}
words = dist.keys()
probabilities = dist.values()
numpy.random.choice(words, p=probabilities)
это даст вам "случайное" слово каждый раз согласнок распределению, указанному
smt, вот так ( draft )
for _ in range(iterations):
word = np.random.choice(model[word].keys(), p=model[word].values())