Аналіз задачі:
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'])
Пробуємо розв'язати задачу.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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] |
Немає коментарів:
Дописати коментар