Нахождение совпадения из списка данных. Реализация алгоритма Stupid Backoff - PullRequest
2 голосов
/ 13 апреля 2020

Я пытался реализовать алгоритм 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.

Пожалуйста, предложите мне, как я могу это реализовать.

Я ценю все предложения. Я проверил некоторые ответы, но все еще не смог их реализовать.

Спасибо, Адитья.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...