自然語言20.1 WordNet介紹和使用


 python金融風控評分卡模型和數據分析微專業(博主親自錄制視頻):http://dwz.date/b9vv


 

 

Wordnet是一個詞典。每個詞語(word)可能有多個不同的語義,對應不同的sense。而每個不同的語義(sense)又可能對應多個詞,如topic和subject在某些情況下是同義的,一個sense中的多個消除了多義性的詞語叫做lemma。例如,“publish”是一個word,它可能有多個sense:

次數可以用來判斷高頻詞的權重

1. (39) print, publish -- (put into print; "The newspaper published the news of the royal couple's divorce"; "These news should not be printed")

2. (14) publish, bring out, put out, issue, release -- (prepare and issue for public distribution or sale; "publish a magazine or newspaper")

3. (4) publish, write -- (have (one's written work) issued for publication; "How many books did Georges Simenon write?"; "She published 25 books during her long career")

 

在第一個sense中,print和publish都是lemma。Sense 1括號內的數字39表示publish以sense 1在某外部語料中出現的次數。顯然,publish大多數時候以sense 1出現,很少以sense 3出現。

 

WordNet的具體用法

NLTK是Python的一個自然語言處理工具,其中提供了訪問wordnet各種功能的函數。下面簡單列舉一些常用功能:

 

得到wordnet本身:

from nltk.corpus import wordnet

 

獲得一個詞的所有sense,包括詞語的各種變形的sense:

wordnet.synsets('published')

[Synset('print.v.01'),

 Synset('publish.v.02'),

 Synset('publish.v.03'),

 Synset('published.a.01'),

 Synset('promulgated.s.01')]

 

得到synset的詞性:

>>> related.pos

's'

 

得到一個sense的所有lemma:

>>> wordnet.synsets('publish')[0].lemmas

[Lemma('print.v.01.print'), Lemma('print.v.01.publish')]

 

得到Lemma出現的次數:試驗失敗

>>> wordnet.synsets('publish')[0].lemmas[1].count()

39

 

在wordnet中,名詞和動詞被組織成了完整的層次式分類體系,因此可以通過計算兩個sense在分類樹中的距離,這個距離反應了它們的語義相似度:

>>> x = wordnet.synsets('recommended')[-1]

>>> y = wordnet.synsets('suggested')[-1]

>>> x.shortest_path_distance(y)

0

 

形容詞和副詞的相似度計算方法:

形容詞和副詞沒有被組織成分類體系,所以不能用path_distance。

>>> a = wordnet.synsets('beautiful')[0]

>>> b = wordnet.synsets('good')[0]

>>> a.shortest_path_distance(b)

-1

形容詞和副詞最有用的關系是similar to。

>>> a = wordnet.synsets('glorious')[0]

>>> a.similar_tos()

[Synset('incandescent.s.02'),

 Synset('divine.s.06'),

……]

 

 

 

http://www.tuicool.com/articles/zqIvAr

WordNet是面向語義的英語詞典,類似於傳統字典。它是NLTK語料庫的一部分,可以被這樣調用:

 

更簡潔的寫法:

1 .單詞

查看一個單詞的同義詞集用synsets(); 它有一個參數pos,可以指定查找的詞性。這里得到的同義詞集是同義詞集的集合,即里面不是單純的詞,是同義詞的集合.

注:

  •  一個synset(同義詞集:指意義相同的詞條的集合)被一個三元組描述:(單詞.詞性.序號)。這里的’dog.n.01’指:dog的第一個名詞意思;’chase.v.01’指:chase的第一個動詞意思
  •  pos可為:NOUN、VERB、ADJ、ADV…

2 .同義詞集

:一些關系的獲得只能通過Lemmas,比如反義詞:

3. Similarity

synset1.path_similarity(synset2): 是基於上位詞層次結構中相互連接的概念之間的最短路徑在0-1范圍的打分(兩者之間沒有路徑就返回-1)。同義詞集與自身比較將返回1

參考:

http://nltk.googlecode.com/svn/trunk/doc/howto/wordnet.html

python 自然語言處理

 

 

 

轉載請說明出處:http://www.cnblogs.com/KingKou/p/4121373.html

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

 

  在調用wordnetexe程序時,我們知道有從屬關系,成員關系,蘊含關系之類的,在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

 

參考鏈接:

  1. nltk官方文檔:

               http://www.nltk.org/api/nltk.corpus.reader.html#module-nltk.corpus.reader.wordnet

  1. wordnet

               http://wordnet.princeton.edu/

 

 

 python機器學習生物信息學系列課(博主錄制)http://dwz.date/b9vw


免責聲明!

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



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