Я пытался реализовать алгоритм Stupid Backoff в моей модели NGram. По сути, это рекурсивная функция, объясненная в одном из ответов StackOverflow:
So for "a sunny day" where no instance was observed, you would calculate S("day" | "a sunny"). Not finding the trigram "a sunny day" you would take case two in equation 5, and estimate S("day" | "a sunny") as alpha * S("day" | "sunny").
If again, you recorded no observances of "sunny day" you would approximate S("day" | "sunny") as alpha * S("day"), which is the terminal case f("day") / N (the number of observed unigrams).
By setting alpha to 0.4 you get exactly what you wrote out above.
Я попытался реализовать ее с помощью этой функции, и пока она работает правильно. В приведенном ниже коде wordlist - это список всех слов в корпусе, allgrams - список всех униграмм, биграмм и т. Д. До n граммов. И Uniquegram - это список всех грамм от всех грамм, кроме уникальных (не повторяющихся).
def probability(n,gram,wordlist,uniquegrams,allgrams):
if len(gram)==1:
return (wordlist.count(gram[0])/len(wordlist))
elif gram in uniquegrams:
ngram_probability = uniquegrams.count(gram) / allgrams.count(gram[:-1])
return ngram_probability
else:
return probability(n-1,gram[1:],wordlist,uniquegrams,allgrams)*0.4
Но здесь я нахожу вероятность по отдельности. В одной из моих других функций я уже нашел все вероятности и преобразовал их в список данных. Например,
[ 0 1
0 sample 0.142857
1 a 0.142857
2 this 0.285714
3 is 0.285714
4 sentence 0.142857, 0 1 2
0 is a 0.5
1 sample sentence 1.0
2 a sample 1.0
3 this is 1.0
4 sentence this 1.0, 0 1 2 3
0 is a sample 1.0
1 this is a 0.5
2 sentence this is 1.0
3 sample sentence this 1.0
4 a sample sentence 1.0]
Теперь я хочу использовать этот вывод в поиске вероятности заданного NGram, например [задано это ["this", "is", "sample"], тогда моя функция будет ищите точное совпадение в списке данных, показанном выше. Если оно есть, функция выдаст соответствующую вероятность. Если его нет в списке данных, он найдет вероятность для ["is", "sample"] и умножит ее на 0,4, опять же, если ее нет в списке, он будет искать ["sample"] и умножьте его вероятность на 0,4 * 0,4.
Пожалуйста, предложите мне, как я могу это реализовать.
Я ценю все предложения. Я проверил некоторые ответы, но все еще не смог их реализовать.
Спасибо, Адитья.