получить следующее слово из биграмной модели по максимальной вероятности

1

Я хочу генерировать сонеты, используя nltk с битрамами. Я сгенерировал bigrams и вычислил вероятность каждого биграма и сохранил в default dict так.

[('"Let', defaultdict(<function <lambda>.<locals>.<lambda> at0x1a17f98bf8>, 
{'the': 0.2857142857142857, 'dainty': 
0.14285714285714285, 'it': 0.14285714285714285, 'those': 
0.14285714285714285, 'me': 0.14285714285714285, 'us': 
0.14285714285714285}))]

вероятность каждого слова, появляющегося после let дается. Например, у меня есть модель bigram для моего корпуса. Теперь я хочу сгенерировать 4 строки сонета с 15 словами в каждой строке. Я пробовал этот код, но он не работает.

def generate_sonnet(word):
lines = 4
words= 15
for i in range(lines):
    line = ()
    for j in range(words):
   #I am selecting max probability but not that word. How I can select that word which has max probability of occurring with word?
        nword = float(max(model[word].values()))
        word += nword

word = random.choice(poetrylist)
generate_sonnet(word)

Я выбираю случайное слово и передаю его моей функции. где я хочу присоединиться к 15 словам, используя bigrams, и когда 1 линия завершается, следующие 3 должны быть выполнены.

Помощь будет оценена

Теги:
nltk
defaultdict
language-model

1 ответ

1
Лучший ответ

вот простой фрагмент кода, чтобы показать, как эта задача может быть достигнута (с очень наивным подходом)

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

выход

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 нравится так (черновик)

for _ in range(iterations):
    word = np.random.choice(model[word].keys(), p=model[word].values())
  • 0
    не могли бы вы поместить новый код в предыдущий? Я не понимаю, где это должно быть размещено.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню