如何根据偏移ID获取WordNet同义词集?

21

我有一个WordNet词汇集(synset)的偏移量(例如id="n#05576222")。使用Python,如何通过这个偏移量获取词汇集?

4个回答

29

从NLTK 3.2.3版本开始,有一个公开的方法可以做到这一点:

wordnet.synset_from_pos_and_offset(pos, offset)

在早期版本中,您可以使用:

wordnet._synset_from_pos_and_offset(pos, offset)

根据词性和偏移ID返回一个同义词集。我认为这种方法仅适用于NLTK 3.0,但我不确定。

示例:

from nltk.corpus import wordnet as wn
wn.synset_from_pos_and_offset('n',4543158)
>> Synset('wagon.n.01')

1
这个解决方案需要一个pos标签,而Suzana的解决方案则不需要。有人能解释一下为什么在使用wn.synset_from_pos_and_offset()时需要pos标签吗? - Daniel Loureiro
我也对上面的内容很好奇! - vsocrates

14

对于NTLK 3.2.3或更新版本,请参见donners45的答案。

对于旧版本的NLTK:

NLTK中没有内置方法,但您可以使用以下方法:

from nltk.corpus import wordnet

syns = list(wordnet.all_synsets())
offsets_list = [(s.offset(), s) for s in syns]
offsets_dict = dict(offsets_list)

offsets_dict[14204095]
>>> Synset('heatstroke.n.01')

您可以将该字典进行pickling,以便在需要时加载。

对于版本低于3.0的NLTK,请替换该行

offsets_list = [(s.offset(), s) for s in syns]

使用

offsets_list = [(s.offset, s) for s in syns]

在 NLTK 3.0 之前,offset 是一个属性而不是一个方法。


7
offset现在是一个方法。请尝试使用以下代码代替:offsets_dict = {s.offset(): s for s in wn.all_synsets()} - Omer
“在NLTK中没有内置的方法” - 现在有了!请查看donners45的答案;这个已经过时了。 - Mark Amery

7
你可以使用 of2ss(),例如:
from nltk.corpus import wordnet as wn
syn = wn.of2ss('01580050a')

will return Synset('necessary.a.01')


1
除了使用NLTK之外,另一个选择是使用来自普林斯顿词网的.tab文件,这个.tab文件可以从开放式多语言词网http://compling.hss.ntu.edu.sg/omw/中获取。通常,我会使用以下方法将WordNet作为字典进行访问,其中偏移量为键,以;分隔的字符串为值:
# Gets first instance of matching key given a value and a dictionary.    
def getKey(dic, value):
  return [k for k,v.split(";") in dic.items() if v in value]

# Read Open Multi WN's .tab file
def readWNfile(wnfile, option="ss"):
  reader = codecs.open(wnfile, "r", "utf8").readlines()
  wn = {}
  for l in reader:
    if l[0] == "#": continue
    if option=="ss":
      k = l.split("\t")[0] #ss as key
      v = l.split("\t")[2][:-1] #word
    else:
      v = l.split("\t")[0] #ss as value
      k = l.split("\t")[2][:-1] #word as key
    try:
      temp = wn[k]
      wn[k] = temp + ";" + v
    except KeyError:
      wn[k] = v  
  return wn

princetonWN = readWNfile('wn-data-eng.tab')
offset = "n#05576222"
offset = offset.split('#')[1]+'-'+ offset.split('#')[0]

print princetonWN.split(";")
print getKey('heatstroke')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接