Неправильный расчет вероятности в контекстно-свободной грамматике (NLTK, Python 3)

У меня проблема с отображением наиболее вероятной структуры избирательного округа некоторого предложения с использованием вероятностной грамматики NLTK.

Вот моя фраза "Ich sah den Tiger under der Felse"

Вот мой код:

from nltk import PCFG
tiger_grammar = PCFG.fromstring("""
S -> NP VP [1.0]
NP -> ART NN [0.25] | PPER [0.5] | NP PP [0.25]
VP -> VVFIN NP [0.75] | VVFIN NP PP [0.25]
PP -> APPR NP [1.0]
APPR -> 'unter' [1.0]
PPER -> 'Ich' [1.0]
VVFIN -> 'sah' [1.0]
NN -> 'Tiger' [0.5] | 'Felse' [0.5]
ART -> 'den' [0.5] | 'der' [0.5]
""")
viterbi_parser = nltk.ViterbiParser(tiger_grammar)
trees = viterbi_parser.parse(['Ich', 'sah', 'den', 'Tiger', 'unter', 'der', 'Felse'])
for t in trees:
    print(t)

Вот что я получаю:

(S
  (NP (PPER Ich))
  (VP
    (VVFIN sah)
    (NP (ART den) (NN Tiger))
    (PP (APPR unter) (NP (ART der) (NN Felse))))) (p=0.000488281)

Но желаемый результат:

(S
  (NP (PPER Ich))
  (VP
    (VVFIN sah)
    (NP
      (NP (ART den) (NN Tiger))
      (PP (APPR unter) (NP (ART der) (NN Felse))))))

(Я не добавил здесь вероятность, но она тоже должна отображаться)

Согласно грамматике вероятность образования VP из VVFIN и NP выше, чем из VVFIN, NP и PP. Но парсер показывает вторую структуру.

Что я делаю не так?

Был бы признателен за предложения!


person Gavrk    schedule 14.03.2020    source источник


Ответы (1)


Просто потому, что желаемый результат имеет меньшую вероятность, чем результат, который вы получили. Мы можем рассчитать вероятность желаемого результата:

S -> NP VP       1.0

NP -> PPER       0.5
PPER -> Ich      1.0

VP -> VVFIN NP   0.75
VVFIN -> sah     1.0
NP -> NP PP      0.25

NP -> ART NN     0.25
ART -> den       0.5
NN -> Tiger      0.5

PP -> APPR NP    1.0
APPR -> unter    1.0

NP -> ART NN     0.25
ART -> der       0.5
NN -> Felse      0.5

При перемножении получается вероятность 0.0003662109375, что определенно меньше полученного вами результата 0.000488281.

person Richard Nemeth    schedule 14.03.2020
comment
Спасибо! Я изменил строку NP -> ART NN [0.05] | PPER [0.05] | NP PP [0.9] и получил p=0,0000263671875 против p=0,000001953125. Теперь все правильно - person Gavrk; 14.03.2020