手把手教你NLTK WordNet使用方法


最近看了WordNet,0基礎入門,簡單記下筆記。因為本身不是學自然語言處理的,好多名詞不是特別清楚,現有的博客讀的暈乎乎,所以重新寫了這個,理清思路。除了行文中提到的鏈接,其他幾個有用的參考鏈接如下:

wordnet的安裝

wordnet的官網地址為:https://wordnet.princeton.edu/,可以在線使用和查詢。此外,在python中wordnet是nltk的一個組件,安裝方法如下:

pip install nltk

在python中下載和import wordnet組件如下:

>>> import nltk
>>> nltk.download('wordnet')
>>> from nltk.corpus import wordnet as wn

由於牆的問題,下載過程中可能會報錯,可以從網盤(指路,這個博客有鏈接https://blog.csdn.net/RainyD4y/article/details/106970593)下載后放在相應位置。放在那個位置呢?你可以隨便你運行一個wordnet命令,系統就會把路徑print出來,隨便選擇一個把下載下來的nltk_data文件夾或wordnet.zip放在對應位置就好。

>>> from nltk.corpus import wordnet as wn
>>> ws.synsets('published')
LookupError:
**********************************************************************
 Resource wordnet not found.
 Please use the NLTK Downloader to obtain the resource:
 >>> nltk.download('wordnet')
Attemp to load corpora/wordnet.zip/wordnet/ Searched
in: - 'C:\\Users\\...\\nltk_data' - 'C:\\nltk_data' - 'C:\\Users\\...\\Anaconda3\\nltk_data' - 'C:\\Users\\...\\Anaconda3\\lib\\nltk_data' - 'C:\\Users\\...\\AppData\\Roaming\\nltk_data' **********************************************************************

單詞、詞集和詞條

由於一個單詞(‘dog’)可以有很多個含義(synset,如‘dog.n.01’,或者叫詞集),wordnet中某一單詞的具體含義表示方法為:單詞.詞性.詞義序號

  • 詞性:包含NOUN,VERB,ADJ,ADV等,實際使用一個小寫字母表示:n, v, a
  • 詞義序號:一個單詞在同一個詞性下也可能有多種含義,為每一個含義都分配一個序號

 

 詞集是單詞的一個含義(一個含義可能由很多單詞表示),我們用synsets指令查看dog的所有同義詞集(pos值可以為——NOUN,VERB,ADJ,ADV…)

>>> wn.synsets("car",pos=wn.NOUN)
[Synset( "car.n.01" ), Synset("car.n.02"), Synset("car.n.03"), Synset("car.n.04"), Synset ("cable_car.n.01")]

其中,"car.n.01"表示car在名詞中的第一個含義。每個意思的具體含義可以按如下方法查看

>>> for synset in wn.synsets("car"):
 ...     print(synset.definition())

同時,一個含義可能對應了多個單詞,因而可以找到含義對應的多個詞條(lemma,某含義所對應的具體一個單詞),可以用以下方法查詢詞集對應的多個詞條(同義詞)

>>> wn.synset('dog.n.01').lemma_names( )
['dog', 'domestic_dog', 'Canis_familiaris']
>>> wn.synset('dog.n.01').lemmas( )
[Lemma('dog.n.01.dog'),
 Lemma('dog.n.01.domestic_dog'), 
 Lemma('dog.n.01.Canis_familiaris')]

詞集(synset)之間的關系

對於名詞,WordNet認為詞集(含義)之間呈樹形結構,因而詞集有上位詞與下位詞,查看方法為

>>> dog = wn.synset('dog.n.01')     # 創建詞集對象
>>> dog.hypernyms()                 # 上位詞集(父類)
[Synset('canine.n.02'), Synset('domestic_animal.n.01')]
>>> dog.hyponyms()                  # 下位詞集(子類)
[Synset('basenji.n.01'), Synset('corgi.n.01'), ...]

WordNet提供了兩個詞集之間的相似度(0~1,越大相似度越高)

>>> dog = wn.synset('dog.n.01')
>>> cat = wn.synset('cat.n.01')
>>> dog.path_similarity(cat)
0.2

由於是樹狀結構可以查看他們的最低共同祖先

>>> dog.lowest_common_hypernyms(cat)
[Synset('carnivore.n.01')]

對於動詞,詞之間的關系主要表現為蘊含關系,例如:

>>> wn.synset('walk.v.01').entailments()#走路蘊含着抬腳
[Synset('step.v.01')]

對於形容詞和副詞,他們沒有被組織成分類體系,也不能用path_distance查看相似度。形容詞和副詞最有用的關系是similar to

>>> beau.similar_tos()
[Synset('beauteous.s.01'), Synset('bonny.s.01'), Synset('dishy.s.01'), Synset('exquisite.s.04'), Synset('fine-looking.s.01'), Synset('glorious.s.03'), Synset('
gorgeous.s.01'), Synset('lovely.s.01'), Synset('picturesque.s.01'), Synset('pretty-pretty.s.01'), Synset('pretty.s.01'), Synset('pulchritudinous.s.01'), Synset('ravishing.s.01'), Synset('scenic.s.01'), Synset('stunning.s.04')]

其他詞集之間的關系還有,部分、實質、集合等關系,示例如下。由於這些關系不是(NLP門外漢)最常用的,也不太好理解,不展開描述,具體關系的含義可以參考:https://blog.csdn.net/sinat_22581761/article/details/78577618

>>> wn.synset('tree.n.01').part_meronyms()        #tree的部件(條目-部件)
[Synset('burl.n.02'), Synset('crown.n.07'), Synset('limb.n.02'), Synset('stump.n.01'), Synset('trunk.n.01')]
>>> wn.synset('tree.n.01').substance_meronyms()  #tree的實質(條目-實質)
[Synset('heartwood.n.01'), Synset('sapwood.n.01')]
>>> wn.synset('tree.n.01').member_holonyms()    #tree集合是森林
[Synset('forest.n.01')]
>>> wn.synset('burl.n.02').part_holonyms()     #由上邊第一行代碼的輸出結果可知'burl.n.02'是'tree.n.01'的一個部件,因此burl的整體是tree無疑
[Synset('tree.n.01')]
>>> wn.synset('heartwood.n.01').substance_holonyms()#同理,heartwood是tree的一個實質,其整體也是tree無疑
[Synset('tree.n.01')]    

詞條(lemma)之間的關系

詞條之間的關系即同義詞/反義詞,同義詞查詢上文已經介紹過,反義詞查詢方法為

>>> wn.lemma('hot.a.01.hot').antonyms()
[Lemma('cold.a.01.cold')]

 

介紹完啦,撒花!就這么簡單!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM