热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:Python3自然语言处理——WordNet

本文由编程笔记#小编为大家整理,主要介绍了Python3自然语言处理——WordNet相关的知识,希望对你有一定的参考价值。1.WordNet介绍WordNet
本文由编程笔记#小编为大家整理,主要介绍了Python3自然语言处理——WordNet相关的知识,希望对你有一定的参考价值。


1.WordNet介绍

WordNet 是面向语义的英语词典,类似于传统辞典,但具有更丰富的结构。NLTK 中包括英语 WordNet,共有 155,287 个词和 117,659 个同义词集合。我们将以寻找同义词和它们在 WordNet 中如何访问开始。










>>> from nltk.corpus import wordnet as wn>>> box='box'>>> box_synsets=wn.synsets(box)>>> box_synsets[Synset('box.n.01'), Synset('box.n.02'), Synset('box.n.03'), Synset('corner.n.08'), Synset('box.n.05'), Synset('box.n.06'), Synset('box.n.07'), Synset('box.n.08'), Synset('box.n.09'), Synset('box.n.10'), Synset('box.v.01'), Synset('box.v.02'), Synset('box.v.03')]

从输出可以看出,列表中包含13个synset,说明单词“box”存在着13种不同的含义。根据书上的代码来获得每个含义的定义、相关词条近义词、每个含义在句子中的示例:











>>> wn.synset('box.n.01').lemma_names'box.n.01')>>>> wn.synset('box.n.01').definition'box.n.01')>>>> wn.synset('box.n.01').examples'box.n.01')>

我们可以看见Python3的输出与书上Python2的输出有所差别,不能直接显示我们想看的内容。在Python3中,我们可以添加for循环,迭代已经获得的Synsets列表并执行相关操作:










for synset in box_synsets: print(synset) print(synset.definition()) print(synset.lemma_names()) print(synset.examples())

结果如下:

























































Synset('box.n.01')a (usually rectangular) container; may have a lid['box']['he rummaged through a box of spare parts']Synset('box.n.02')private area in a theater or grandstand where a small group can watch the performance['box', 'loge']['the royal box was empty']Synset('box.n.03')the quantity contained in a box['box', 'boxful']['he gave her a box of chocolates']Synset('corner.n.08')a predicament from which a skillful or graceful escape is impossible['corner', 'box']['his lying got him into a tight corner']Synset('box.n.05')a rectangular drawing['box']['the flowchart contained many boxes']Synset('box.n.06')evergreen shrubs or small trees['box', 'boxwood'][]Synset('box.n.07')any one of several designated areas on a ball field where the batter or catcher or coaches are positioned['box']["the umpire warned the batter to stay in the batter's box"]Synset('box.n.08')the driver's seat on a coach['box', 'box_seat']['an armed guard sat in the box with the driver']Synset('box.n.09')separate partitioned area in a public place for a few people['box']['the sentry stayed in his box to avoid the cold']Synset('box.n.10')a blow with the hand (usually on the ear)['box']['I gave him a good box on the ear']Synset('box.v.01')put into a box['box', 'package']['box the gift, please']Synset('box.v.02')hit with the fist['box']["I'll box your ears!"]Synset('box.v.03')engage in a boxing match['box'][]

用这种方法,我们可以成功打印出单词box包含的13个含义的定义、词条和例句。


2.上位词与下位词

下位词(hyponym)与通用词(比如bat)相比较具有更具体的含义。更具体的含义指板球棒、棒球棒、食肉蝙蝠、壁球拍等等。这些下位词使我们在沟通中想要表达的含义更加具体。与下位词相反,上位词(hypernym)是更具有一般性的形式或词,包含相同的概念。就之前的例子而言,bat是一个更通用的词,它可能表示棍棒、棒、手工品、哺乳动物、动物或生物体。我们可以继续将它泛化成物质实体、生物或物体来作为bat这个词的上位词。为了探讨上位词和下位词的概念,我们选择同义词集bed.n.01(bed的第一个词义)和woman.n.01(woman的第一个词义)作为范例。在本节我们将介绍上位词和下位词的用法和含义。








from nltk.corpus import wordnet as wnbed=wn.synset('bed.n.01')woman=wn.synset('woman.n.01')

上位词






print(woman.hypernyms())

结果如下:






[Synset('adult.n.01'), Synset('female.n.02')]

woman隶属于WordNet数据库层次结构中的adult和female类别。

现在我们打印从根节点到woman.n.01节点的路径:










woman_paths=woman.hypernym_paths()for idx,path in enumerate(woman_paths): print('\n\nHypernym Path:',idx+1) for synset in path: print(synset.name(),',',end='')

结果如下:
















Hypernym Path: 1entity.n.01 ,physical_entity.n.01 ,causal_agent.n.01 ,person.n.01 ,adult.n.01 ,woman.n.01 ,
Hypernym Path: 2entity.n.01 ,physical_entity.n.01 ,object.n.01 ,whole.n.02 ,living_thing.n.01 ,organism.n.01 ,person.n.01 ,adult.n.01 ,woman.n.01 ,
Hypernym Path: 3entity.n.01 ,physical_entity.n.01 ,causal_agent.n.01 ,person.n.01 ,female.n.02 ,woman.n.01 ,
Hypernym Path: 4entity.n.01 ,physical_entity.n.01 ,object.n.01 ,whole.n.02 ,living_thing.n.01 ,organism.n.01 ,person.n.01 ,female.n.02 ,woman.n.01 ,

如上所述,woman.n.01有两个上位词,即adult和female。我们还可以再输出中显示在WordNet数据库层次结构中从实体根节点到woman的四条不同路径。

下位词

以下两行代码将获取同义词bed.n.01的下位词并打印:







types_of_beds=bed.hyponyms()print('Types of beds(Hyponyms):\n',types_of_beds)

结果如下:







Types of beds(Hyponyms): [Synset('berth.n.03'), Synset('built-in_bed.n.01'), Synset('bunk.n.03'), Synset('bunk_bed.n.01'), Synset('cot.n.03'), Synset('couch.n.03'), Synset('deathbed.n.02'), Synset('double_bed.n.01'), Synset('four-poster.n.01'), Synset('hammock.n.02'), Synset('marriage_bed.n.01'), Synset('murphy_bed.n.01'), Synset('plank-bed.n.01'), Synset('platform_bed.n.01'), Synset('sickbed.n.01'), Synset('single_bed.n.01'), Synset('sleigh_bed.n.01'), Synset('trundle_bed.n.01'), Synset('twin_bed.n.01'), Synset('water_bed.n.01')]

在WordNet中,这些是单词词义bed.n.01的下位词或更具体的术语。

我们还可以打印出对我们来说更有意义的实际单词或词条(lemma):






print(sorted(set(lemma.name()for synset in types_of_beds for lemma in synset.lemmas())))

结果如下:






['Murphy_bed', 'berth', 'built-in_bed', 'built_in_bed', 'bunk', 'bunk_bed', 'camp_bed', 'cot', 'couch', 'deathbed', 'double_bed', 'four-poster', 'hammock', 'marriage_bed', 'plank-bed', 'platform_bed', 'sack', 'sickbed', 'single_bed', 'sleigh_bed', 'truckle', 'truckle_bed', 'trundle', 'trundle_bed', 'twin_bed', 'water_bed']

bed.n.01同义词词集有20个下位词,它们的含义更加具体且明确。由于几乎没有歧义,在层次结构中,下位词通常与叶子结点或非常接近叶子的结点相对应。


3.平均多义性

多义性意味着一个单词或短语有许多种可能的含义。正如之前看到的那样,英语是一种多歧义的语言,对层级结构中的大多数单词来说,通常包含一种以上的含义。我们必须根据WordNet中所有单词特定的语言特性来计算平均多义性。我们会展示如何计算一个单词在某种词性(POS)下的多义性,对于其余3类词性的多义性计算,你只需要修改相应程序即可。我们会在实例中提供足够的提示,让你更容易掌握。下面我们来看看单独计算名词的平均多义性的实例。

我们用n表示名词,对其进行初始化:







from nltk.corpus import wordnet as wntype='n'

该实例最重要的代码行如下:






synsets=wn.all_synsets(type)

这个API返回WordNet数据库中名词类型的所有同义词集。同样,如果将词性改为动词、副词或形容词,API将返回相应类型的所有单词。

把每个同义词集的所有词条合并成一个可以进一步处理的大列表。添加如下代码:









lemmas=[]for synset in synsets: for lemma in synset.lemmas(): lemmas.append(lemma.name())

这段代码非常直观,用一个嵌套的for循环迭代同义词集(synsets)列表和每个同义词集(synset)中的词条(lemmas)列表,并将它们添加到词条(lemmas)大列表中。

虽然这个大列表包含了所有词条,但仍存在一个问题。它是一个列表,所以有一些重复的内容,我们需要删除重复项,我们可以将一个列表转换成一个集合,就可以自动删除其中重复的内容:






lemmas=set(lemmas)

下面就可以计算WordNet数据库中所有词条含义的数量的总和:








count=0for lemma in lemmas: count=count+len(wn.synsets(lemma,type))

我们把重点放在wn.synsets API(lemma,type)上。这个API的输入是一个单词/词条(作为第一个参数)及其所属的词性,返回该单词/词条的所有含义。需要注意的是,输出取决于你提供的词性类别,因为它仅返回给定词性下的所有含义。现在已有平均多义性计算所需的所有数值,接下来只需要计算并打印出结果:








print('Total distinct lemmas:',len(lemmas))print('Total senses:',count)print('Average polysemy:',count/len(lemmas))

结果如下:








Total distinct lemmas: 119034Total senses: 152763Average polysemy: 1.2833560159282222

关于如何计算其他单词词性的平均多义性。正如实例所示,名词表示为n。类似地,动词表示为v,副词表示为r,形容词表示为a。


推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • JavaWeb中读取文件资源的路径问题及解决方法
    在JavaWeb开发中,读取文件资源的路径是一个常见的问题。本文介绍了使用绝对路径和相对路径两种方法来解决这个问题,并给出了相应的代码示例。同时,还讨论了使用绝对路径的优缺点,以及如何正确使用相对路径来读取文件。通过本文的学习,读者可以掌握在JavaWeb中正确找到和读取文件资源的方法。 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • 1Lock与ReadWriteLock1.1LockpublicinterfaceLock{voidlock();voidlockInterruptibl ... [详细]
  • 求解连通树的最小长度及优化
    本文介绍了求解连通树的最小长度的方法,并通过四边形不等式进行了优化。具体方法为使用状态转移方程求解树的最小长度,并通过四边形不等式进行优化。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
author-avatar
牛氏学道_246
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有