Ich habe einen WordNet-Synset-Offset (zum Beispiel id="n#05576222"
). Wie kann ich angesichts dieses Offsets das Synset mit Python ermitteln?
Antworten
Zu viele Anzeigen?Seit NLTK 3.2.3 gibt es eine öffentliche Methode, um dies zu tun:
wordnet.synset_from_pos_and_offset(pos, offset)
In früheren Versionen können Sie das verwenden:
wordnet._synset_from_pos_and_offset(pos, offset)
Dies gibt ein Synset auf der Grundlage seiner POS- und Offest-ID zurück. Ich glaube, diese Methode ist nur in NLTK 3.0 verfügbar, aber ich bin mir nicht sicher.
Beispiel:
from nltk.corpus import wordnet as wn
wn.synset_from_pos_and_offset('n',4543158)
>> Synset('wagon.n.01')
Für NTLK 3.2.3 oder neuere Versionen lesen Sie bitte die Antwort von donners45.
Für ältere Versionen von NLTK:
Es gibt keine eingebaute Methode im NLTK, aber Sie könnten diese verwenden:
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')
Sie können das Wörterbuch dann speichern und bei Bedarf laden.
Für NLTK-Versionen vor 3.0 ersetzen Sie die Zeile
offsets_list = [(s.offset(), s) for s in syns]
と
offsets_list = [(s.offset, s) for s in syns]
seit vor NLTK 3.0 offset
ein Attribut statt einer Methode war.
Eine andere Möglichkeit als die Verwendung von NLTK wäre die Verwendung der .tab-Datei aus dem Open Multilingual WordNet
http://compling.hss.ntu.edu.sg/omw/ für das Princeton WordNet. Normalerweise habe ich das folgende Rezept verwendet, um auf das WordNet als Wörterbuch mit Offset als Schlüssel und ;
abgegrenzte Zeichenketten als Werte:
# 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')