为了特定的目的,我必须使用Wordnet1.6,而不是在nltk包中实现的当前版本。然后我下载了旧版本的这里,并尝试使用法语选项运行一个简单的代码摘录。
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 fre.tab,它位于\nltk_data\corpora\omw\fre中。我很确定我必须用兼容Wordnet1.6的版本来修改文件,但是为什么函数WordNetCorpusReader找不到它呢?
发布于 2015-07-17 18:40:40
简短回答:
没有带有语言参数的WordNet 1.6。在通过NLTK加载不同的lang='fre'时,无法使用WordNet。
长答案:
lang=...参数是使用开放多语言WordNet (OMW:http://compling.hss.ntu.edu.sg/omw/)添加的,它将不同语言的wordnet链接到普林斯顿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。
并且,由于在初始化wn-data-fre.tab对象时将omw_reader设置为wn16_path,所以omw无法在nltk_data/corpora/omw/中找到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)
您可以尝试做的是加载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]https://stackoverflow.com/questions/31478152
复制相似问题