1.1-自然语言的分布式表示-同义词词典

1同义词词典

  1. 想让计算机理解自然语言,就必须要让他理解每一个单词的含义是什么。 最朴素的方法就是词典的方法,就像我们在学习汉字的时候会拥有一本词典,但遇到不会的不认识的单词的时候,我们去查这个词典里面给我们的解释。 那么在这样语言处理方面的话,就是同义词词典。

1.1同义词词典的构成

  1. 同义词词典的构成:

    1. 由于不同的单词可以表示相同或者相近的含义,因此在同义词词典中,我们将相同含义或者相近含义的单词归到一个组, 我们用一些标识符来标识每一个组,这样只要在同一个组内,他们都是表示相同或者相近的含义

    2. 比如下图中,这些单词都是可以表示汽车,他们是同义词

      在这里插入图片描述

    3. 目前为止,我们只是把相同的词归到了同一个组,他们之间不具有层次关系,只是表示他们的含义相近或者相同

1.2单词网络

  1. 单词网络

    1. 在自然语言中,我们有上位词、下位词的概念,以及整体和部分的关系, 单词网络就是用来描述这种层次关系的

    2. 例如,下图中汽车只是机动车的一种,卡车也是一种机动车,所以机动车是汽车的上位词,即机动车代表着更加广泛的一个概念; 同理汽车也包含很多种,比如说小轿车SUV等等;这就构成了具有层次关系的单词网络,如下图所示

      在这里插入图片描述

    3. 上图只是描述了机动车这一个简单概念, 因此他看起来像是一个树结构, 如果将所有的概念都放在一起构成一个单词网络,他将演化成一个图结构

    4. 基于这样的一个图结构,我们可以利用图的相关理论知识让计算机能够理解不同单词之间的联系以及相关程度(例如计算不同节点之间的路径长度)

1.3同义词词典之WordNet

  1. 使用WordNet需要使用nltk
  2. nltk是一个自然语言处理工具包, 里面封装了一些方法,可以用来进行词性标注、句法分析等自然语言处理任务;
  3. 详见:nlp/word_net.py

1.3.1环境准备

  1. 创建一个虚拟环境,以便与其他的环境相分隔,不影响其他的项目

  2. conda create -n nlp_1 pip python=3.8
    
  3. 安装nltk包

  4. pip install nltk
    

1.3.2查看同义词

  • 涉及的语句为:

    • from nltk.corpus import wordnet
      print(wordnet.synsets('car')) # 查看某个单词的同义词簇
      print(wordnet.synset('car.n.01'))
      
  1. 初次运行wordnet.synsets()语句的时候,会报下图所示的错误。这是因为我们使用的是一个同义词词典,但是目前这个同义词词典还没有被下载到本地电脑。

    在这里插入图片描述

  2. 因此按照错误提示,我们进入到命令行。执行错误提示中的代码,把这个同义词词典先下载下来。

    在这里插入图片描述

  3. 然后执行print(wordnet.synsets('car'))语句就不会报错了;下图就是从同义词词典中返回的与car这个单词相同或者相近的同义词组。

    1. 返回的结果是一个列表,列表中包含五个元素
    2. 由于一个单词可能有多个含义,因此在返回的结果当中,每个元素都代表着一个含义所对应的那个组别。组别的名称称之为标题词;例如第一个元素表示car作为名词的第01个含义,这个组别的标题词为car.n.01;以此类推;

    在这里插入图片描述

  4. 在自然语言处理这本书中,也给出了标题词的每个部分的含义:

    在这里插入图片描述

  5. 在调用函数时,我们发现除了上面这个函数以外,还有一个函数名:wordnet.synset();它们的区别如下图所示:

    在这里插入图片描述

  6. 因此,结合上面返回的标题词列表,我们就可以使用wordnet.synset()来查看具体的某一个标题词对应的单词的具体含义;这里可以使用封装好的definition函数:

    1. car=wordnet.synset('car.n.01') # Synset 对象
      print(car.definition())
      
    2. 在这里插入图片描述

  7. 查看某个同义词簇中包含的具体单词有哪些

    1. print(car.lemma_names())
      
    2. 在这里插入图片描述

1.3.3查看单词网络

  1. 使用Synset 对象的hypernym_paths()方法来获取当前单词的上位词路径:

    1. print(car.hypernym_paths()[0])
      
    2. 这个函数hypernym_paths()返回一个列表,列表中的每个元素也是一个列表,表示一种上位词路径;由于单词网络是错综复杂的,因此这个函数的返回值有多个。

    3. car.n.01这个同义词簇的第一个上位词路径如下图所示(注意:路径是从最上位的单词出发,到当前词):

      在这里插入图片描述

1.3.4计算单词之间的相似度

  1. 使用Synset 对象的path_similarity()方法计算不同的同义词簇之间的相似度,该函数的参数如下:

    1. 注意传入的是另一个同义词簇的Synset 对象,而不是标题词字符串

    在这里插入图片描述

  2. 分别计算car.n.01和dog.n.01、car.n.02的相似度:

    1. dog=wordnet.synset('dog.n.01')
      print(car.path_similarity(dog))
      
      car2=wordnet.synset('car.n.02')
      print('car.path_similarity(car2):',car.path_similarity(car2))
      

      在这里插入图片描述

  3. 可以看到,car与dog的相似度很低,而与car.n.02的相似度较高,因为毕竟car.n.01car.n.02都是可以通过wordnet.synsets('car')查询到,说明他们的含义是相近的;

  4. 书上简单介绍了这个相似度函数的计算原理,即两个同义词簇所在的上位词的路径,公共的部分越多,就越相似。

    在这里插入图片描述

1.4 同义词词典的缺点

  1. 新词不断出现,语言的含义也会随着时间的变化而变化; 在使用同义词词典的过程当中,我们也知道在使用之前我们需要先把同义词词典下载到本地,这意味着我们需要事先构建好同义词词典,那么当新词或者词的含义发生变化时,我们需要人为的去维护这个同义词词典,这个维护成本是非常高的;
  2. 同义词词典只是单纯的将含义相同或者相近的单词分到一个组, 但是即使在同一个组,不同的单词可能用法不一样,在含义上可能也有细微的差别, 仅使用同义词词典,无法让计算机理解这些细微的差别。
  • 20
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值