2011-11-10 7 views

Odpowiedz

11

Dla NTLK 3.2.3 lub nowszego, zobacz odpowiedź donners45.

Dla starszych wersjach NLTK:

Nie ma wbudowanej metody w NLTK ale można użyć to:

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

Następnie można pickle słownika i załadować go ilekroć Potrzebujesz tego.

Dla wersji NLTK przed do 3,0, wymienić linię

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

z

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

ponieważ przed NLTK 3,0 offset się atrybut a nie metody.

+3

Ciekawe, to rzuca kluczową błąd z NLTK 3,0 – duhaime

+5

'offset' jest teraz metoda. Spróbuj zamiast tego: 'offsets_dict = {s.offset(): s dla s we wn.all_synsets()}' – Omer

+0

* "Nie ma wbudowanej metody w NLTK" * - jest teraz! Zobacz odpowiedź donners45; ten jest przestarzały. –

1

Poza używaniem NLTK, inną opcją byłoby użycie pliku .tab z Open Multilingual WordNethttp://compling.hss.ntu.edu.sg/omw/ dla WordNet Princeton. Zwykle stosowany przepis poniżej, aby uzyskać dostęp wordnet jak słownik z przesunięciem jako klucz i ; wyznaczone ciągi jako wartości:

# 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') 
12

Od NLTK 3.2.3, jest to metoda publiczna na ten sposób:

wordnet.synset_from_pos_and_offset(pos, offset) 

We wcześniejszych wersjach można użyć:

wordnet._synset_from_pos_and_offset(pos, offset) 

zwraca synset opartą na jego POS i offest ID. Myślę, że ta metoda jest dostępna tylko w NLTK 3.0, ale nie jestem pewien.

Przykład:

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

Można użyć of2ss(), np

from nltk.corpus import wordnet as wn 
syn = wn.of2ss('01580050a') 

powróci Synset('necessary.a.01')