自然语言20.1 WordNet介绍和使用 _

 

欢迎关注博主主页,学习python视频资源,还有大量免费python经典文章

 

 

sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频教程)

https://study.163.com/course/introduction.htm?courseId=1005269003&utm_campaign=commission&utm_source=cp-400000000398149&utm_medium=share

 

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/

 

 

 

 

 

转载于:https://www.cnblogs.com/webRobot/p/6094311.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值