2

我知道WordNet有域名層次結構:例如sport->足球。獲取指定詞的WordNet域名

1)是否有可能列出所有相關的單詞,例如,'sport-> football'子域?

Response: goalkeeper, forward, penalty, ball, field, stadium, referee and so on. 

2)獲取給定單詞的域名,例如, '守門員'?

Need something like [sport->football; sport->hockey] or [football;hockey] or just 'football'. 

它用於文檔分類任務。

回答

6

共發現有上位詞/下位詞層次,但是這是不是你想要的這裏,因爲你 可以看到,當你仰望門將

from nltk.corpus import wordnet 
s = wordnet.synsets('goalkeeper')[0] 
s.hypernym_paths() 

結果之一是:

[Synset('entity.n.01'), 
Synset('physical_entity.n.01'), 
Synset('causal_agent.n.01'), 
Synset('person.n.01'), 
Synset('contestant.n.01'), 
Synset('athlete.n.01'), 
Synset('soccer_player.n.01'), 
Synset('goalkeeper.n.01')] 

有兩種方法稱爲usage_domains()topic_domains(),但它們返回大多數單詞的空列表:

s = wordnet.synsets('football')[0] 
s.topic_domains() 
>>> [] 
s.usage_domains() 
>>> [] 

The WordNet Domains project然而,可能是你在找什麼。它提供了一個文本文件,其中包含Princeton WordNet 2.0 synsets與其相應域之間的映射。您必須註冊您的電子郵件地址才能訪問數據。 然後你可以用anydbm模塊對應於您的WordNet的版本(他們提供了2.0和3.2)的文件中讀取,例如:

import anydbm 
fh = open('wn-domains-2.0-20050210', 'r') 
dbdomains = anydbm.open('dbdomains', 'c') 
for line in fh: 
    offset, domain = line.split('\t') 
    dbdomains[offset[:-2]] = domain 
fh.close() 

然後,您可以用同義詞集的偏移屬性找出其域。也許你必須在開頭添加一個零:

dbdomains.get('0' + str(wordnet.synsets('travel_guidebook')[0].offset)) 
>>> 'linguistics\n' 
+0

謝謝Suzana! ((( – gmlvsv

+0

我已經添加了一個代碼示例到我的答案。 –

+1

我得到了這個版本的WordNet領域爲我的WordNet 2.0和複製您的WordNet域名代碼是完全正確的,但是'dbdomains.get(whatever)'返回'None'對於每個'whatever'我已經試過了,它是給定的形式。'dbdomains'確實有看起來像是看起來看上去很奇妙的鍵/域對(99330精確地說),但似乎沒有WordNet抵消與領先0對應任何這些密鑰。任何見解? – James