如果手动加载wordnet,如何在synsets(nltk)中使用语言选项?

时间:2015-07-17 14:26:35

标签: python path nlp nltk wordnet

出于特定目的,我必须使用Wordnet 1.6而不是nltk包中实现的当前版本。然后我下载了旧版本here并尝试使用french选项运行一个简单的代码提取。

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')]

如果我使用装有nltk模块的当前版本的Wordnet,我在使用法语时没有任何问题(因此它不是可选参数的语法问题)

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功能无法找到它?

1 个答案:

答案 0 :(得分:4)

简答

语言参数没有WordNet 1.6。通过NLTK加载不同的WordNet时无法使用lang='fre'

长答案

lang=...参数是使用Open Multilingual 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

由于您在初始化{{1}时已将wn-data-fre.tab设置为nltk_data/corpora/omw/,因此omw无法在omw_reader中找到wn16_path的主要原因} object,请参阅https://github.com/nltk/nltk/blob/develop/nltk/corpus/reader/wordnet.py#L1006

然后在加载法语数据时,找不到WordNetCorpusReader。 (请参阅https://github.com/nltk/nltk/blob/develop/nltk/corpus/reader/wordnet.py#L1419https://github.com/nltk/nltk/blob/develop/nltk/corpus/reader/wordnet.py#L1070

你可以尝试做的是这个加载2个WordNet实例:

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