Вероятность биграмма

У меня есть Корпус Моби Дика, и мне нужно рассчитать вероятность биграммы ноги из слоновой кости. Я знаю, что эта команда дает мне список всех биграмм

bigrams = [w1+" "+w2 for w1,w2 in zip(words[:-1], words[1:])]

Но как мне получить вероятность только двух слов?


person Sere    schedule 13.07.2020    source источник
comment
Не могли бы вы уточнить, что вы подразумеваете под вероятностью двух слов. Обычно биграммы в NLK рассчитываются как условные вероятности. то есть P(W[n] | W[n-1]) это то, что вы пытаетесь сделать, или что-то еще?   -  person Mark    schedule 13.07.2020
comment
Да, именно так. Как мне написать это в коде, когда мне нужно взять это из корпуса?   -  person Sere    schedule 13.07.2020


Ответы (1)


Вы можете подсчитать все биграммы и подсчитать конкретную биграмму, которую вы ищете. Вероятность появления биграммы P(bigram) равна их частному. Условная вероятность того, что слово [1] даст слово [0] P (w [1] | w [0]), является отношением количества вхождений биграммы к количеству w [0]. Например, глядя на биграмму ('some', 'text'):

s = 'this is some text about some text but not some other stuff'.split()

bigrams = [(s1, s2) for s1, s2 in zip(s, s[1:])]

# [('this', 'is'),
#  ('is', 'some'),
# ('some', 'text'),
# ('text', 'about'),
# ...

number_of_bigrams = len(bigrams)
# 11

# how many times 'some' occurs 
some_count = s.count('some')
# 3

# how many times bigram occurs
bg_count = bigrams.count(('some', 'text'))
# 2

# probabily of 'text' given 'some' P(bigram | some)
# i.e. you found `some`, what's the probability that its' makes the bigram:
bg_count/some_count
# 0.666

# probabilty of bigram in text P(some text)
# i.e. pick a bigram at random, what's the probability it's your bigram:
bg_count/number_of_bigrams
# 0.181818
person Mark    schedule 13.07.2020
comment
Привет, Марк, Ваш ответ имеет смысл (и я проголосовал за него), но почему P(w2/w1) = count(w2,w1)/count(w1)?? нигде не могу найти ответ - person hargun3045; 23.04.2021