您的位置:首页 > 编程语言 > Python开发

Python自然语言处理第二章-2.5 WordNet(II)——wordnet的层次结构

2017-11-19 19:54 477 查看

WordNet(II)——wordnet的层次结构

本节知识结构图

下位词集

上位词集

词集的路径

特别注意:

部分方法在书中出现时,方法名后面并没有括号,但是笔者在方法名后加了括号( )后才输出预期的结果,否则会输出其他信息,比如:

>>> wn.synset('car.n.01').hypernyms()#有括号,输出预期结果
[Synset('motor_vehicle.n.01')]
>>> wn.synset('car.n.01').hypernyms#无括号,输出了其他信息
<bound method Synset.hypernyms of Synset('car.n.01')>
>>>


一、本节知识结构

结合下图,学习找到一个词集的上位词集和下位词集的方法(函数):



motorcar=wn.synset('car.n.01')


二、下位词集hyponyms()

0. 首先获得一个词集(简洁起见引入变量motorcar)

>>> motorcar=wn.synset('car.n.01')
>>> motorcar
Synset('car.n.01')


1.下位词集hyponyms()

该方法是由一个词集调用的:

>>> motorcar.hyponyms()
[Synset('ambulance.n.01'), Synset('beach_wagon.n.01'), Synset('bus.n.04'), Synse
t('cab.n.03'), Synset('compact.n.03'), Synset('convertible.n.01'), Synset('coupe
.n.01'), Synset('cruiser.n.01'), Synset('electric.n.01'), Synset('gas_guzzler.n.
01'), Synset('hardtop.n.01'), Synset('hatchback.n.01'), Synset('horseless_carria
ge.n.01'), Synset('hot_rod.n.01'), Synset('jeep.n.01'), Synset('limousine.n.01')
, Synset('loaner.n.02'), Synset('minicar.n.01'), Synset('minivan.n.01'), Synset(
'model_t.n.01'), Synset('pace_car.n.01'), Synset('racer.n.02'), Synset('roadster
.n.01'), Synset('sedan.n.01'), Synset('sport_utility.n.01'), Synset('sports_car.
n.01'), Synset('stanley_steamer.n.01'), Synset('stock_car.n.01'), Synset('subcom
pact.n.01'), Synset('touring_car.n.01'), Synset('used-car.n.01')]


其实该输出结果是一个列表,要查看其中的某个词集,可以对motorcar.hyponyms()使用索引操作:

>>> type(motorcar.hyponyms())#查看类型
<type 'list'>
>>> motorcar.hyponyms()[0]#索引操作
Synset('ambulance.n.01')


2. 另对书中p74页的一个链表推导式进行分析:

>>> types_of_motorcar =motorcar.hyponyms()
>>>sorted([lemma.name() for synset in types_of_motorcar for lemma in synset.lem
mas()])
[u'Model_T', u'S.U.V.', u'SUV', u'Stanley_Steamer', u'ambulance', u'beach_waggon
', u'beach_wagon', u'bus', u'cab', u'compact', u'compact_car', u'convertible', u
'coupe', u'cruiser', u'electric', u'electric_automobile', u'electric_car', u'est
ate_car', u'gas_guzzler', u'hack', u'hardtop', u'hatchback', u'heap', u'horseles
s_carriage', u'hot-rod', u'hot_rod', u'jalopy', u'jeep', u'landrover', u'limo',
u'limousine', u'loaner', u'minicar', u'minivan', u'pace_car', u'patrol_car', u'p
haeton', u'police_car', u'police_cruiser', u'prowl_car', u'race_car', u'racer',
u'racing_car', u'roadster', u'runabout', u'saloon', u'secondhand_car', u'sedan',
u'sport_car', u'sport_utility', u'sport_utility_vehicle', u'sports_car', u'squa
d_car', u'station_waggon', u'station_wagon', u'stock_car', u'subcompact', u'subc
ompact_car', u'taxi', u'taxicab', u'tourer', u'touring_car', u'two-seater', u'us
ed-car', u'waggon', u'wagon']
>>>




对于该链表的分析,可以按照图中1,2,3,4的顺序分析,以后遇到类似的长的链表,就可以如此类似地“拆开”分析。

三、上位词集hypernyms()

1. 获取上位词hypernyms()

该方法也是由一个词集调用的:

>>> motorcar.hypernyms()
[Synset('motor_vehicle.n.01')]


仔细分析上段代码输出结果与下段代码输出结果的区别:

>>> motorcar.hypernyms()[0]
Synset('motor_vehicle.n.0
b4ed
1')


其实前者的输出结果也是一个词集列表(有一层中括号),是可以进行索引操作的,后者的结果没有中括号,是该列表的第一个值(一个词集),也是唯一一个,但不排除有的词有多个上位词。

2. 查看类型

>>> type(motorcar.hypernyms())#查看类型
<type 'list'>
>>> type(motorcar.hypernyms()[0])#查看类型
<class 'nltk.corpus.reader.wordnet.Synset'>
>>>


四、词集的路径hypernym_paths()

词集的路径,顾名思义,就是追溯词集的上位词集的上位词集的上位词集······,而这就自然而然的形成了“路径”。这里用到的函数(方法)自然和获取上位词集的函数(方法)——hypernyms()有些渊源,很显然获取路径的函数命名与求上位词的函数命名都有hypernym的字符,注意到这些,对梳理和记忆很有帮助。

1. 获取词集的路径

该方法由一个词集调用:

>>> paths= wn.synset('car.n.01').hypernym_paths()
#或者paths=motorcar.hypernym_paths()


输出结果其实一个嵌套列表,因为一条路径便是paths的一个值,而一条路径也是由一个列表存放的

>>> type(paths)
<type 'list'>
>>> type(paths[0])
<type 'list'>


可以(使用索引)进一步查看路径的细节paths[1],paths[0]:

>>> paths[1]
[Synset('entity.n.01'), Synset('physical_entity.n.01'), Synset('object.n.01'), S
ynset('whole.n.02'), Synset('artifact.n.01'), Synset('instrumentality.n.03'), Sy
nset('conveyance.n.03'), Synset('vehicle.n.01'), Synset('wheeled_vehicle.n.01'),
Synset('self-propelled_vehicle.n.01'), Synset('motor_vehicle.n.01'), Synset('ca
r.n.01')]
>>> paths[0]
[Synset('entity.n.01'), Synset('physical_entity.n.01'), Synset('object.n.01'), S
ynset('whole.n.02'), Synset('artifact.n.01'), Synset('instrumentality.n.03'), Sy
nset('container.n.01'), Synset('wheeled_vehicle.n.01'), Synset('self-propelled_v
ehicle.n.01'), Synset('motor_vehicle.n.01'), Synset('car.n.01')]
>>>


多学一点:取得第一条路径中的所有词集的“名字”,并以列表的形式输出

>>> [synset.name() for synset in paths[0]]
[u'entity.n.01', u'physical_entity.n.01', u'object.n.01', u'whole.n.02', u'artifact.n.01', u'instrumentality.n.03', u'container.n.01', u'wheeled_vehicle.n.01',u'self-propelled_vehicle.n.01', u'motor_vehicle.n.01', u'car.n.01']


2. 获取根上位词集root_hypernyms()

最笼统的上位:

>>> motorcar.root_hypernyms()
[Synset('entity.n.01')]


在做本章课后题时,返回来将这节的内容再看了一遍,重新梳理了思路,得到进一步的理解,觉得可以整理下来分享,如有错误,欢迎大家指正~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息