轉載請說明出處:http://www.cnblogs.com/KingKou/p/4121373.html
1.簡介
Wordnet是一個由普林斯頓大學認識科學實驗室在心理學教授喬治·A·米勒的指導下建立和維護的大型的英語詞典,WordNet的開發有兩個目的:
1.它既是一個字典,又是一個辭典,它比單純的辭典或詞典都更加易於使用。
2.支持自動的文本分析以及人工智能應用。
在WordNet中,名詞,動詞,形容詞和副詞各自被組織成一個同義詞的網絡,每個同義詞集合都代表一個基本的語義概念,並且這些集合之間也由各種關系連
接。(一個多義詞將出現在它的每個意思的同義詞集合中)。
2.使用
2.1 直接調用
直接使用wn.exe程序,命令行格式如下:
Wn [單詞] [options] [search_option]
Options:
-h:會在顯示結果前面顯示幫助信息
-g:顯示同義詞相關的文本注釋,一般是釋義+例句
-a:在每一種sense前,顯示字典撰寫者的文件信息
-o:顯示同義詞的偏移量
-s:顯示所有同義詞的單詞編號
-l:顯示wordnet的版權、版本、許可證信息
-n#:只查找單詞的第#個釋義的信息
-over:顯示單詞的所以釋義的整體信息
search_option:
-syns (n | v | a | r ):顯示單詞的同義詞和直接上位詞的同義詞集。同義詞以使用頻率排序。括號里的是對應的詞性(名詞,動詞,形容詞,副詞)
-simsv:顯示動詞的同義詞和包含單詞的直接上位詞的同義詞集合。同義詞按照語義相似度分組
-ants (n | v | a | r ):顯示單詞的反義詞集
-faml (n | v | a | r ):顯示單詞是否常見,和一詞多義信息
-hype (n | v ):遞歸地顯示單詞上位詞樹。(單詞 IS A KIND OF _____ relation)
-hypo (n | v ):顯示直接下位詞(_____ IS A KIND OF 單詞 relation)
-tree (n | v ):遞歸顯示單詞的下位詞樹
-coor (n | v ):顯示每個同義詞的直接上位詞及上位詞的直接上位詞
-deri (n | v ):顯示派生名詞和動詞之間的聯系形式。如goodness
-domn (n | v | a | r ):顯示單詞所屬的類,如good的副詞
-domt (n | v | a | r ):顯示所有被分在單詞所在領域的所有成員
-subsn:顯示實體的部件關系。HAS SUBSTANCE關系(tree)
-partn:顯示部分關系,比如頭的部分是耳朵,臉,鼻子,之類的。HAS PART關系
-membn:顯示成員關系,比如people有成員citizen。HAS MEMBER關系
-meron:顯示上面三個全部信息
-hmern:顯示成員樹。這是一個遞歸樹,會顯示單詞的所有成員和他的上位詞(people)
-sprtn:顯示包含單詞的實體(PART OF關系)
-smemn:顯示包含這個單詞為成員的實體,MEMBER OF關系
-ssubn:顯示包含這個單詞為部件關系的實體,SUBSTANCE OF關系
-holon:顯示所有上述三個關系
-hholn:遞歸顯示part of關系
-entav:顯示蘊含關系,通常是動詞(push)
-framv:顯示示例
-causv:導致關系
-pert (a | r ):pertainyms
-attr (n | a ):名詞形容詞的相互顯示
-grep (n | v | a | r ):顯示包含單詞的詞
2.2 nltk接口調用
Nltk中也帶有wordnet,但是調用方式有所不同,調用方式如下:
from nltk.corpus import wordnet as wn
首先,是我們常用同義詞的調用:
wn.synsets('motorcar')
結果:[Synset('car.n.01')]
因為'motorcar'只有一個意思,所以結果只有一個,那就是’car’作為名詞的第一種釋義。
我們也可以這樣調用,獲取單詞指定詞性、釋義的同義詞集:
>>> wn.synset('car.n.01').lemma_names
結果:
['car', 'auto', 'automobile', 'machine', 'motorcar']
如果我們不知道單詞第I個釋義的意思,我們可以調用definition查看,以便更精確地使用。
>>> wn.synset('car.n.01').definition
結果:
'a motor vehicle with four wheels; usually propelled by an internal combustion engine(內燃機)'
我們還可以調用examples查看具體例句:
>>> wn.synset('car.n.01').examples
結果:
['he needs a car to get to work']
在語言學中,有一個重要的任務,就是消歧,我們使用lemma(詞條),可以獲得一對一的同義詞配對。
>>> wn.synset('car.n.01').lemmas ①
結果:
[Lemma('car.n.01.car'), Lemma('car.n.01.auto'), Lemma('car.n.01.automobile'),
Lemma('car.n.01.machine'), Lemma('car.n.01.motorcar')]
① 這是所有的詞條,結果和上面直接查看同義詞的是一樣的
>>> wn.lemma('car.n.01.automobile') ②
結果:
Lemma('car.n.01.automobile')
② 我們可以判斷特定兩個詞是否滿足要求
>>> wn.lemma('car.n.01.automobile').synset ③
結果:
Synset('car.n.01')
③ 獲取詞條對應的同義詞
>>> wn.lemma('car.n.01.automobile').name ④
結果:
'automobile'
④ 獲取詞條的名字
通過上面,我們可以獲得一種獲得同義詞的方法:
>>> wn.synsets('car')
[Synset('car.n.01'), Synset('car.n.02'), Synset('car.n.03'), Synset('car.n.04'),
Synset('cable_car.n.01')]
>>> for synset in wn.synsets('car'):
... print synset.lemma_names
...
['car', 'auto', 'automobile', 'machine', 'motorcar']
['car', 'railcar', 'railway_car', 'railroad_car']
['car', 'gondola']
['car', 'elevator_car']
['cable_car', 'car']
把得到的結果合並區set()即可獲得單詞的同義詞。
另外一種獲得同義詞,或者說是同類詞的方法,就是上位詞和下位詞。比如’car’:
>>> motorcar = wn.synset('car.n.01')
>>> types_of_motorcar = motorcar.hyponyms()
>>> types_of_motorcar[26]
Synset('ambulance.n.01')
>>> sorted([lemma.name for synset in types_of_motorcar for lemma in synset.lemmas])
['Model_T', 'S.U.V.', 'SUV', 'Stanley_Steamer', 'ambulance', 'beach_waggon',
'beach_wagon', 'bus', 'cab', 'compact', 'compact_car', 'convertible',
'coupe', 'cruiser', 'electric', 'electric_automobile', 'electric_car',
'estate_car', 'gas_guzzler', 'hack', 'hardtop', 'hatchback', 'heap',
'horseless_carriage', 'hot-rod', 'hot_rod', 'jalopy', 'jeep', 'landrover',
'limo', 'limousine', 'loaner', 'minicar', 'minivan', 'pace_car', 'patrol_car',
'phaeton', 'police_car', 'police_cruiser', 'prowl_car', 'race_car', 'racer',
'racing_car', 'roadster', 'runabout', 'saloon', 'secondhand_car', 'sedan',
'sport_car', 'sport_utility', 'sport_utility_vehicle', 'sports_car', 'squad_car',
'station_waggon', 'station_wagon', 'stock_car', 'subcompact', 'subcompact_car',
'taxi', 'taxicab', 'tourer', 'touring_car', 'two-seater', 'used-car', 'waggon',
'wagon']
在調用wordnet的exe程序時,我們知道有從屬關系,成員關系,蘊含關系之類的,在nltk,它們是這樣的:
>>> wn.synset('tree.n.01').part_meronyms() 【部分】
[Synset('burl.n.02'), Synset('crown.n.07'), Synset('stump.n.01'),
Synset('trunk.n.01'), Synset('limb.n.02')]
>>> wn.synset('tree.n.01').substance_meronyms() 【實質】
[Synset('heartwood.n.01'), Synset('sapwood.n.01')]
>>> wn.synset('tree.n.01').member_holonyms() 【成員】
[Synset('forest.n.01')]
>>> wn.synset('mint.n.04').part_holonyms()
[Synset('mint.n.02')]
>>> wn.synset('mint.n.04').substance_holonyms()
[Synset('mint.n.05')]
下面是蘊含關系:
>>> wn.synset('walk.v.01').entailments()
[Synset('step.v.01')]
>>> wn.synset('eat.v.01').entailments()
[Synset('swallow.v.01'), Synset('chew.v.01')]
>>> wn.synset('tease.v.03').entailments()
[Synset('arouse.v.07'), Synset('disappoint.v.01')]
相對來說,個人感覺反義詞做的就比較簡陋:
>>>wn.lemma('supply.n.02.supply').antonyms()
[Lemma('demand.n.02.demand')]
Nltk有個功能,能根據內部的關系樹,計算兩個詞之間的相似度:
>>>lim=wn.synset('limousine.n.1')
>>>amb=wn.synset('ambulance.n.1')
>>>lim.lowest_common_hypernyms(amb)
[Synset('car.n.01')]
我們可以看出,“'limousine(豪華轎車)”和“'ambulance(救護車)”的共同點(也就是公共上位詞)是“car”。此外,我們還可以得到他們的相似度:
>>>lim.path_similarity(amb)
0.3333333333333333
還可以看他們的最近舉例,舉例越近,相似度越高:
>>>lim.shortest_path_distance(amb)
2
上面列舉了NLTK的一些常用的命令,基本上wordnet中的命令,在NLTK都包括了,還有一些,比如offset等,有需要的時候可以參考鏈接1。
參考鏈接:
- nltk官方文檔:
http://www.nltk.org/api/nltk.corpus.reader.html#module-nltk.corpus.reader.wordnet
- wordnet