субота, 8 квітня 2017 р.

Задача №16a 8 розділ

Умова задачі: Write a program to find those verbs in the PP Attachment Corpus nltk.corpus.ppattach. Find any cases where the same verb exhibits two different attachments, but where  the  first noun, or  second noun, or preposition  stays unchanged (as we saw in our discussion of syntactic ambiguity in Section 8.2).

Аналіз задачі:
1. Переглядаємо формат корпуса PP Attachment Corpus.

The PP Attachment Corpus contains several files having the format:
sentence_id verb noun1 preposition noun2 attachment
For example:
42960 gives authority to administration V 
46742 gives inventors of microchip N
The PP attachment is to the verb phrase (V) or noun phrase (N), i.e.:
(VP gives (NP authority) (PP to administration)) (VP gives (NP inventors (PP of microchip)))
2. Аналізуємо приклад на сторінці 316.
# записи корпуса з частини 'training'
entries = nltk.corpus.ppattach.attachments('training')
# пустий словник по замовчуванню, значеннями записів якого будуть словники
table = nltk.defaultdict(lambda: nltk.defaultdict(set))
# заповнення словника за ключами які будуть містити іменник1-прийменник-іменник1
# а значеннями за цими ключами будуть словники з ключами attachment (V або N - до чого приєднується прийменниковий вираз) і значеннями - дієслово
for entry in entries:
...     key = entry.noun1 + '-' + entry.prep + '-' + entry.noun2
...     table[key][entry.attachment].add(entry.verb)

# перегляд словника і вивід на екран
for key in sorted(table):
...     if len(table[key]) > 1:
...         print key, 'N:', sorted(table[key]['N']), 'V:', sorted(table[key]['V'])


Пробуємо розв'язати задачу.
import nltk
entries = nltk.corpus.ppattach.attachments('training')
table = nltk.defaultdict(lambda: nltk.defaultdict(set))
for entry in entries:
# іменник1 прийменник іменник2
pphrase = entry.noun1 + '-' + entry.prep + '-' + entry.noun2
# ключ словник дієслово та перший іменник (при потребі може бути другий іменник чи #прийменник
key1 = entry.verb + '-' + entry.noun1
# заповнення словника - записи словника - словник з ключами V або N та значеннями #іменник1 прийменник іменник2
table[key1][entry.attachment].add(pphrase)
# отримання списку кортежів - задане дієслово, ключ словника, запис словника
# всі attachment для заданого дієслова з однаковим першим іменником і які можуть відноситися як до іменника так і для дієслова
att_list=[('give', verb_noun,table[verb_noun]) for verb_noun in table.keys()
if str(verb_noun).startswith('give') and len( table[verb_noun])>1]
view raw e.py hosted with ❤ by GitHub
В результаті отримуємо щось таке:
('give', 'gives-authority', defaultdict(, {'V': set(['authority-to-Department']), 'N': set(['authority-for-veto'])}))
('give', 'give-sets', defaultdict(, {'V': set(['sets-in-promotion']), 'N': set(['sets-of-Boy'])}))
('give', 'given-attractiveness', defaultdict(, {'V': set(['attractiveness-as-consolidation']), 'N': set(['attractiveness-of-flows'])}))


Для зручності переписуємо програмку з використанням функцій:
def diff_key(key):
# за допомогою key можна вибирати варіант побудови словника (за першим іменником, #прийменником, другим іменником)
table = nltk.defaultdict(lambda: nltk.defaultdict(set))
for entry in entries:
if key=="noun1":
key1 = entry.verb + '-' + entry.noun1
elif key=="noun2":
key1 = entry.verb + '-' + entry.noun2
else:
key1 = entry.verb + '-' + entry.prep
pphrase = entry.noun1 + '-' + entry.prep + '-' + entry.noun2
table[key1][entry.attachment].add(pphrase)
return table
def find_verb(verb):
# аргумент verb дозволяє отримати результати для будь-якого дієслова
return [(verb,w1[i]) for i in w1.keys() if str(i).startswith(verb) and len(w1[i])>1]
view raw s.py hosted with ❤ by GitHub

Немає коментарів:

Дописати коментар