Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
KL-LAB12(10).doc
Скачиваний:
22
Добавлен:
12.02.2016
Размер:
1.69 Mб
Скачать

Зважені граматики

Зважені граматики та імовірнісні алгоритми синтаксичного аналізу дозволяють частково вирішити проблеми неоднозначності результатів синтаксичного аналізу.

Перед розглядом цих питань, потрібно зрозуміти чому поняття граматичної правильності може мати градієнт. Розглянемо дієслово give. Це дієслово вимагає пряме доповнення (річ яка дається) і непряме доповнення (одержувач). Ці доповнення можуть вживатися в довільному порядку, як показано в наступних реченнях. В формі "prepositional dative", пряме доповнення вживається першим а непраме доповнення йде слідом.

(19)

a.

Kim gave a bone to the dog

b.

Kim gave the dog a bone

В формі "doubleobject"непряме доповнення вживається першим а пряме доповнення другим. В цьому випадку допускається довільний порядок.Однак,якщо непряме доповнення виражається займенником існує строга послідовність в конструкції з двох доповнень:

(20)

a.

Kim gives the heebie-jeebies to me (*prepositional dative)

b.

Kim gives me the heebie-jeebies (double object)

Використовуючи корпус Penn Treebank, можна перевірити всі випадки вживання конструкцій з двох доповнень ( prepositional dative та double object) разом з словом give, як показано в наступному прикладі.

 

def give(t):

return t.node == 'VP' and len(t) > 2 and t[1].node == 'NP'\

and (t[2].node == 'PP-DTV' or t[2].node == 'NP')\

and ('give' in t[0].leaves() or 'gave' in t[0].leaves())

def sent(t):

return ' '.join(token for token in t.leaves() if token[0] not in '*-0')

def print_node(t, width):

output = "%s %s: %s / %s: %s" %\

(sent(t[0]), t[1].node, sent(t[1]), t[2].node, sent(t[2]))

if len(output) > width:

output = output[:width] + "..."

print output

 

>>> for tree in nltk.corpus.treebank.parsed_sents():

... for t in tree.subtrees(give):

... print_node(t, 72)

gave NP: the chefs / NP: a standing ovation

give NP: advertisers / NP: discounts for maintaining or increasing ad sp...

give NP: it / PP-DTV: to the politicians

gave NP: them / NP: similar help

give NP: them / NP:

give NP: only French history questions / PP-DTV: to students in a Europe...

give NP: federal judges / NP: a raise

give NP: consumers / NP: the straight scoop on the U.S. waste crisis

gave NP: Mitsui / NP: access to a high-tech medical product

give NP: Mitsubishi / NP: a window on the U.S. glass industry

give NP: much thought / PP-DTV: to the rates she was receiving , nor to ...

give NP: your Foster Savings Institution / NP: the gift of hope and free...

give NP: market operators / NP: the authority to suspend trading in futu...

gave NP: quick approval / PP-DTV: to $ 3.18 billion in supplemental appr...

give NP: the Transportation Department / NP: up to 50 days to review any...

give NP: the president / NP: such power

give NP: me / NP: the heebie-jeebies

give NP: holders / NP: the right , but not the obligation , to buy a cal...

gave NP: Mr. Thomas / NP: only a `` qualified '' rating , rather than ``...

give NP: the president / NP: line-item veto power

Результати вказують на строгу тенденцію, що коротше доповнення йде першим.

Імовірнісна клнтекстно вільна граматика (PCFG) це звичайна контекстно–вільна граматикадо кожного правила якої додана її імовірність. Така граматика дозволяє генерувати таку саму кількість дерев розбору для тексту, як і звичайна граматика та встановлює імовірність для кожного з розборів.Імовірність дерева розбору на основіPCFGце добуток імовірностей правил , які були використані при його побудові..

Найпростіший спосіб визначити PCFGце використати спеціальне форматування стрічки, яка містить зважені правила, де вага (імовірність) вказується в квадратних дужках, як показано у наступному прикладі.

 

grammar = nltk.parse_pcfg("""

S -> NP VP [1.0]

VP -> TV NP [0.4]

VP -> IV [0.3]

VP -> DatV NP NP [0.3]

TV -> 'saw' [1.0]

IV -> 'ate' [1.0]

DatV -> 'gave' [1.0]

NP -> 'telescopes' [0.8]

NP -> 'Jack' [0.2]

""")

 

>>> print grammar

Grammar with 9 productions (start state = S)

S -> NP VP [1.0]

VP -> TV NP [0.4]

VP -> IV [0.3]

VP -> DatV NP NP [0.3]

TV -> 'saw' [1.0]

IV -> 'ate' [1.0]

DatV -> 'gave' [1.0]

NP -> 'telescopes' [0.8]

NP -> 'Jack' [0.2]

Деколи зручно поєднати декілька правил у одну стрічку,наприклад,VP -> TV NP [0.4] | IV [0.3] | DatV NP NP [0.3] і це дозволяє легко перевірити що в PCFGграматиках для всіх правил з однаковою лівою стороною сумарна імовірність повинна дорівнювати одиниці. Дерево розбору побудоване з використанням такої граматики також буде містити імовірність:

 

>>> viterbi_parser = nltk.ViterbiParser(grammar)

>>> print viterbi_parser.parse(['Jack', 'saw', 'telescopes'])

(S (NP Jack) (VP (TV saw) (NP telescopes))) (p=0.064)

Тепер коли, для кожного дерева розбору встановлена його імовірність, велика кількість таких дерев вже не має такого значення оскільки синтаксичний аналізатор може вибрати найбільш імовірні з них.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]