首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果手动加载wordnet,如何在synset (nltk)中使用语言选项?

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

Stack Overflow用户
提问于 2015-07-17 14:26:34
回答 1查看 5.6K关注 0票数 5

为了特定的目的,我必须使用Wordnet1.6,而不是在nltk包中实现的当前版本。然后我下载了旧版本的这里,并尝试使用法语选项运行一个简单的代码摘录。

代码语言:javascript
复制
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模块的文件,我得到的错误如下:

代码语言:javascript
复制
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'

使用英语单词不会产生任何错误(并不是因为我没有很好地加载字典):

代码语言:javascript
复制
senses=wn.synsets('government')
print senses

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

如果我使用用nltk模块加载的Wordnet的当前版本,我使用法语没有任何问题(所以它不是可选参数的语法问题)。

代码语言:javascript
复制
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找不到它呢?

EN

回答 1

Stack Overflow用户

发布于 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=...参数调用函数:

代码语言:javascript
复制
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

代码语言:javascript
复制
 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#L1419https://github.com/nltk/nltk/blob/develop/nltk/corpus/reader/wordnet.py#L1070)

您可以尝试做的是加载WordNet的两个实例:

代码语言:javascript
复制
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]
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31478152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档