У меня есть сдвиг синхронизации WordNet (например, id="n#05576222"
). Учитывая это смещение, как я могу получить синхронизацию с помощью Python?
Как получить синтаксис WordNet с учетом идентификатора смещения?
Ответ 1
Как и в случае с NLTK 3.2.3, существует общедоступный метод для этого:
wordnet.synset_from_pos_and_offset(pos, offset)
В более ранних версиях вы можете использовать:
wordnet._synset_from_pos_and_offset(pos, offset)
Это возвращает синхронизацию на основе POS и идентификатора offest. Я думаю, что этот метод доступен только в NLTK 3.0, но я не уверен.
Пример:
from nltk.corpus import wordnet as wn
wn._synset_from_pos_and_offset('n',4543158)
>> Synset('wagon.n.01')
Ответ 2
Для 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')
Затем вы можете рассортировать словарь и загружать его, когда вам это нужно.
Для версий NLTK до 3.0 замените строку
offsets_list = [(s.offset(), s) for s in syns]
с
offsets_list = [(s.offset, s) for s in syns]
так как до NLTK 3.0 offset
был атрибутом вместо метода.
Ответ 3
Помимо использования NLTK, другой вариант заключается в использовании файла .tab из Open Multilingual WordNet
http://compling.hss.ntu.edu.sg/omw/ для Princeton WordNet. Обычно я использовал рецепт ниже для доступа к 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 .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')
Ответ 4
Вы можете использовать of2ss()
, например:
from nltk.corpus import wordnet as wn
syn = wn.of2ss('01580050a')
вернется
Synset('necessary.a.01')