2015-11-05 8 views
3

NLTK предоставляет функции для печати всех слов в корпусе Brown (или Gutenberg). Но эквивалентная функция, похоже, не работает в Wordnet.Как распечатать все содержимое Wordnet (желательно с помощью NLTK)?

Есть ли способ сделать это через NLTK? Если этого не произойдет, как это сделать?

Это работает:

from nltk.corpus import brown as b 
print b.words() 

Это вызывает AttributeError:

from nltk.corpus import wordnet as wn 
print wn.words() 

ответ

8

Для wordnet это ресурсы для определения слова, поэтому элементы в ресурсе индексируются чувствами (aka synsets).

перебрать synsets:

>>> from nltk.corpus import wordnet as wn 
>>> for ss in wn.all_synsets(): 
...  print ss 
...  print ss.definition() 
...  break 
... 
Synset('able.a.01') 
(usually followed by `to') having the necessary means or skill or know-how or authority to do something 

Для каждого synset (смысл/концепции), есть список слов, прикрепленных к нему, называется lemmas: леммы каноническая («корень») форма которые мы используем при проверке словаря.

Чтобы получить полный список чешуй в WordNet, используя один-лайнер:

>>> lemmas_in_wordnet = set(chain(*[ss.lemma_names() for ss in wn.all_synsets()])) 

Интересно, что wn.words() также вернет все lemma_names:

>>> lemmas_in_words = set(i for i in wn.words()) 
>>> len(lemmas_in_wordnet) 
148730 
>>> len(lemmas_in_words) 
147306 

Но странно там уже некоторые расхождения по отношению к общему количеству слов, собранных с использованием wn.words().

«Печать полного содержания» из WordNet в текст, кажется, что-то слишком амбициозными, потому что wordnet структурировано вроде иерархического графа, с synsets соединенных друг с другом, и каждый synset имеет свои собственные свойства/атрибуты. Вот почему файлы wordnet не сохраняются просто как один текстовый файл.

Чтобы увидеть, что synset содержит:

>>> first_synset = next(wn.all_synsets()) 
>>> dir(first_synset) 
['__class__', '__delattr__', '__dict__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', '__unicode__', '__weakref__', '_all_hypernyms', '_definition', '_examples', '_frame_ids', '_hypernyms', '_instance_hypernyms', '_iter_hypernym_lists', '_lemma_names', '_lemma_pointers', '_lemmas', '_lexname', '_max_depth', '_min_depth', '_name', '_needs_root', '_offset', '_pointers', '_pos', '_related', '_shortest_hypernym_paths', '_wordnet_corpus_reader', 'also_sees', 'attributes', 'causes', 'closure', 'common_hypernyms', 'definition', 'entailments', 'examples', 'frame_ids', 'hypernym_distances', 'hypernym_paths', 'hypernyms', 'hyponyms', 'instance_hypernyms', 'instance_hyponyms', 'jcn_similarity', 'lch_similarity', 'lemma_names', 'lemmas', 'lexname', 'lin_similarity', 'lowest_common_hypernyms', 'max_depth', 'member_holonyms', 'member_meronyms', 'min_depth', 'name', 'offset', 'part_holonyms', 'part_meronyms', 'path_similarity', 'pos', 'region_domains', 'res_similarity', 'root_hypernyms', 'shortest_path_distance', 'similar_tos', 'substance_holonyms', 'substance_meronyms', 'topic_domains', 'tree', 'unicode_repr', 'usage_domains', 'verb_groups', 'wup_similarity'] 

Переход через эту howto будет полезно знать, как получить доступ к необходимой информации в WordNet: http://www.nltk.org/howto/wordnet.html

+0

Я использую NLTK 3.0.3 и 'lemmas_in_words = set (i для i в wn.words())' дает мне: AttributeError: объект WordNetCorpusReader не имеет атрибутов 'words' – zadrozny

+0

Обновить его к NLTK 3.1 'pip install -U nltk' =) – alvas

+1

Спасибо. Это сделал трюк. Кстати, я вижу, ты был в НТУ. Я посетил TW в этом году в течение нескольких месяцев и очень понравился. – zadrozny

1

Пожалуйста, попробуйте следующее:

for word in wn.words(): 
    print word 

Это должно работать, потому что wn.words() на самом деле это итератор, который генерирует последовательность строк, а не список строк, таких как b.words. Цикл for заставляет итератор генерировать слова по одному.

+0

у меня есть: AttributeError: ' Объект WordNetCorpusReader 'не имеет атрибутных слов' – zadrozny

+0

Хммм ... попробуйте следующие две строки кода и посмотрите, получаете ли вы те же ответы, что и я: wn.words Out [10]: <связанный метод WordNetCorpusReader.words of > wn.words() Out [11]: <словарь-клавишатор на 0x1128cae68> –

+0

Нет, извините. Какой NLTK вы используете? Я на 3.0.4 – zadrozny

0
from nltk.corpus import wordnet as wn 
synonyms=[] 
for word in wn.words(): 
    print (word,end=":") 
    for syn in wn.synsets(word): 
     for l in syn.lemmas(): 
     synonyms.append(l.name()) 
    print(set(synonyms),end="\n") 
    synonyms.clear() 
+2

небольшое объяснение было бы неплохо! – Vaibhav

+0

Это будет генерировать вывод синонимов всех слов в synset – Raveena

+2

Пожалуйста, отредактируйте ваш вопрос с подробностями. Ответы только с кодом в них, как правило, помечены для удаления, так как они «низкого качества». – Graham