2015-07-17 5 views
1

Для конкретных целей я должен использовать Wordnet 1.6 вместо текущей версии, реализованной в пакете nltk. Затем я загрузил старую версию here и попытался запустить простой фрагмент кода, используя французский вариант.Как использовать языковой параметр в synsets (nltk), если вы загружаете wordnet вручную?

from collections import defaultdict 
import nltk 
#nltk.download() 
import os 
import sys 
from nltk.corpus import WordNetCorpusReader 

cwd = os.getcwd() 
nltk.data.path.append(cwd) 
wordnet16_dir="wordnet-1.6/" 
wn16_path = "{0}/dict".format(wordnet16_dir) 
wn = WordNetCorpusReader(os.path.abspath("{0}/{1}".format(cwd, wn16_path)), nltk.data.find(wn16_path)) 

senses=wn.synsets('gouvernement',lang=u'fre') 

Кажется, что WordNet я вручную скачал не могу быть связан с файлами модуля NLTK дела с иностранными языками, то ошибка, я получаю следующее:

Traceback (most recent call last): 
File "C:/Users/Stephanie/Test/temp.py", line 16, in <module> 
senses=wn.synsets('gouvernement',lang=u'fre') 
File "C:\Python27\lib\site-packages\nltk\corpus\reader\wordnet.py", line 1419, in synsets 
self._load_lang_data(lang) 
File "C:\Python27\lib\site-packages\nltk\corpus\reader\wordnet.py", line 1064, in _load_lang_data 
if lang not in self.langs(): 
File "C:\Python27\lib\site-packages\nltk\corpus\reader\wordnet.py", line 1088, in langs 
fileids = self._omw_reader.fileids() 
AttributeError: 'FileSystemPathPointer' object has no attribute 'fileids' 

Использования английского слова Безразлично «т генерировать какую-либо ошибку (так что это не то, что я не сработал словарь хорошо):

senses=wn.synsets('government') 
print senses 

[Synset('government.n.01'), Synset('government.n.02'), Synset('government.n.03'), Synset('politics.n.02')] 

Если я использую версию Wordnet загруженную с модулем NLTK не имеет никакого пр oblem используя французский (так что это не проблема синтаксиса с дополнительным аргументом)

from nltk.corpus import wordnet as wn 
senses=wn.synsets('gouvernement',lang=u'fre') 
print senses 
[Synset('government.n.02'), Synset('opinion.n.05'), Synset('government.n.03'), Synset('rule.n.01'), Synset('politics.n.02'), Synset('government.n.01'), Synset('regulation.n.03'), Synset('reign.n.03')] 

Но, как уточнено, я действительно должен использовать старую версию. Я предполагаю, что это может быть проблемой пути. Я пытался прочитать код функции WordNetCorpusReader, но я совершенно новый с python. На самом деле я не вижу, до какой степени проблема, за исключением того, что он не находит специальный файл.

Необходимый файл, предположительно, wn-data-fre.tab, который находится в \ nltk_data \ corpora \ omw \ fre. Я уверен, что мне нужно изменить файл с версией, совместимой с wordnet 1.6, но все же, почему функция WordNetCorpusReader не может ее найти?

+0

Ошибка заключается в 'если Ланг не self.langs():' блок. Может быть, в WordNet 1.6 нет «свободного» языка? Или, может быть, это было «fr»? Вы должны посмотреть на файлы данных ... – clemtoy

+0

@clemtoy, это тоже не работает с fr, мне трудно понять, что в wordnet 1.6 нет французского языка, тогда как домен wn построен на нем и имеет домены на французском языке , Моя проблема в том, что я плохо разбираюсь в архитектуре файлов, это язык, связанный с версией wordnet или другим файлом, в каталоге wordnet 1.6 нет .tab, но это не значит, что они должны быть там? –

+0

@clemtoy, если быть точнее, файл, который ищет код, выглядит как wn-data-fre.tab, который находится в \ nltk_data \ corpora \ omw \ fre, а не в \ nltk_data \ wordnet, где текущая версия wordnet есть. Поэтому я подумал, что, возможно, файл не зависит от версии, но, может быть, я ошибаюсь (я уверен, что мне нужно изменить файл с версией, совместимой с wordnet 1.6, но оставшийся вопрос - где ее поставить?) –

ответ

1

Короткий ответ:

Там нет WordNet 1.6 с параметром языка. Невозможно использовать lang='fre' при загрузке другого WordNet через NLTK.


Длинный ответ:

Параметр lang=... является дополнением с использованием открытого многоязычного WordNet (OMW: http://compling.hss.ntu.edu.sg/omw/), которая связывает WordNet разных языков в Princeton WordNet версии 3.0. См. https://github.com/nltk/nltk/blob/develop/nltk/corpus/reader/wordnet.py#L1050.

Параметр lang=... вызывает функцию:

def langs(self): 
    ''' return a list of languages supported by Multilingual Wordnet ''' 
    import os 
    langs = [] 
    fileids = self._omw_reader.fileids() 
    for fileid in fileids: 
     file_name, file_extension = os.path.splitext(fileid) 
     if file_extension == '.tab': 
      langs.append(file_name.split('-')[-1]) 

    return langs 

Это выглядит для файла, см https://github.com/nltk/nltk/blob/develop/nltk/corpus/reader/wordnet.py#L1070:

f = self._omw_reader.open('{0:}/wn-data-{0:}.tab'.format(lang)) 

Так if lang == 'fre', то self._omw_reader = wn-data-fre.tab.

И главная причина, почему OMW не может найти wn-data-fre.tab в nltk_data/corpora/omw/, потому что вы установили omw_reader в wn16_path при инициализации WordNetCorpusReader объекта см https://github.com/nltk/nltk/blob/develop/nltk/corpus/reader/wordnet.py#L1006.

Тогда при загрузке французских данных не найдено self._omw_reader.open('{0:}/wn-data-{0:}.tab'.format(lang)).(См https://github.com/nltk/nltk/blob/develop/nltk/corpus/reader/wordnet.py#L1419 и https://github.com/nltk/nltk/blob/develop/nltk/corpus/reader/wordnet.py#L1070)


Что вы можете попытаться сделать эту нагрузку 2 экземпляра WordNet:

import os 
from nltk.corpus import wordnet as wn 
from nltk.corpus import WordNetCorpusReader 

cwd = os.getcwd() 
nltk.data.path.append(cwd) 
wordnet16_dir="wordnet-1.6/" 

wn16_path = "{0}/dict".format(wordnet16_dir) 
wn16 = WordNetCorpusReader(os.path.abspath("{0}/{1}".format(cwd, wn16_path)), nltk.data.find(wn16_path)) 

def synset2offset(ss): 
    return str(ss.offset()).zfill(8) + '-' + ss.pos() 


wn16_ids = [synset2offset(ss) for ss in wn16.all_synsets()] 
wn30_ids = [synset2offset(ss) for ss in wn.all_synsets()] 


senses30 = wn.synsets('gouvernement',lang=u'fre') 
senses16 = [ss for ss in wn.synsets('gouvernement',lang=u'fre') if synset2offset(ss) in wn16_ids] 
+0

Спасибо за ваш длинный ответ. Я подозревал проблему пути. Это может быть решено, хотя, поскольку указанный вами файл wn-data-fre.tab может быть преобразован в совместимый с wordnet1.6. Вопрос о пути слишком тонкий для моего уровня, поэтому я взял ваш код и заменил последнюю строку на: 'senses16 = [convert30to16 (ss) для ss в wn.synsets ('gouvernement', lang = u'fre ')] 'где я определил функцию convert30to16, используя доступные файлы сопоставления [здесь] (http://www.talp.upc.edu/index.php/technology/tools/45-textual-processing-tools/98-wordnet- отображения /). Еще раз спасибо ! –

 Смежные вопросы

  • Нет связанных вопросов^_^