2021-05-10

《数字媒体技术基础》第二次作业

摘要:

  本次实验采用的是Bag of words模型来计算句子对的相似度。

  使用python2进行编程,程序分为两个部分:GUI和相似度计算。

  • GUI部分的实现思路是:用文字提示用户需要输入两个句子在两个输入框中,读取用户在两输入框中输入的句子对,当用户点击“开始计算相似度”button时,调用相似度计算函数。
  • 相似度计算函数的实现思路是:先将句子分解成不带标点符号的短句,然后调用NLTK库中的word_tokenize函数将输入的句子对中的各个单词提取出来,然后构建词典,词典包括句子对中出现的单词及标点符号;接下来对词典中的元素建立数字映射,以便用向量来表示句子;用词典中的元素在句子中出现的频率来构建句子的向量;得到两个句子的向量表示之后,以两向量余弦相似度作为两句子的相似度,计算并输出。

所使用技术的描述:

Bag of Words

  Bag of Words模型,也叫词袋,是信息检索领域常用的文档表示方法。在表示一个文档时,Bag of Words最明显的一个特征是忽略词语的顺序和语法,仅仅将句子看作是词语的一个组合。文档中每个单词的出现都是独立的,不依赖文档中其他单词是否出现。换句话说就是,文档中任何一个位置出现的任何单词都不受该文档语义影响而是独立选择的。
下面用例子来解释Bag of Words模型:

  • Sentence1:Mike likes to play football.
  • Sentence2:Jack likes to play basketball.
    基于上面两个文档来构造词典:
    Dictionary = {1:“Mike”,2:“likes”,3:“to”,4:“play”,5:“football”,6:“Jack”,7:“basketball”,8:“.”}
    可以看到,这个词典一共有8个单词,所以上面两个文档可以用一个8维的向量来表示:
  • Sentence1:[1,1,1,1,1,0,0,1]
  • Sentence2:[0,1,1,1,0,1,1,1]
    向量中的一个元素代表着词典中该对应的单词在文档中出现的次数。

  从Bag of Words的应用过程我们可以发现:Bag of Words在乎的是一个词语在文档中出现频率而忽略词语在文档中出现的顺序,这将导致BOW模型的局限性。

  当然词袋模型还可以用在图像的特征描述上。大致过程:将图像分割成一个个patch,并对每个patch的中心点计算SIFT特征。这样一来,每一个图像由很多个patch来表示,而每一个patch用一个特征向量来表示。使用SIFT算法提取图像中的局部不变特征的话,一幅图像就有可能会有许许多多个patch。使用K-means算法,将得到的patch的中心点的SIFT特征聚为k个类,由此得到了词典。通常来说一个图像可以提取出成千上万个SIFT向量,每个SIFT向量是128维的,对这些SIFT向量做聚类可以减少计算量,将相似的patch合并,取聚类中心为代表构造出单词表。


核心算法代码分析:

Python NLTK库中的word_tokenize函数
  • NLTK:NLTK(natural language toolkit),自然语言处理工具包,是NLP领域中最常用的一个python库。
  • Word_tokenize函数:如果输入参数为文本,则对文本按句子进行分割,如果输入参数为句子,则对句子进行分词。
Gensim库(用于从原始的非结构化文本中无监督地学习文本隐层的主题向量表达):

基本概念:

  • Corpus:一组原始文本的集合,用于无监督地训练文本主题的隐层结构。语料中不需要人工标注的附加信息。在Gensim中,Corpus通常是一个可迭代的对象(比如列表)。每一次迭代返回一个可用于表达文本对象的稀疏向量。
  • 向量(Vector):由一组文特征构成的列表。是一段文本在Gensim中的内部表达。

函数:

  • Corpora.Dictionary(list):利用传入的列表构造一个词典
  • Dictionary.doc2bow():主要用于实现BOW模型。将输入的列表转换成向量形式。

详细的代码解释:

在这里插入图片描述


实验结果分析:

先运行整个程序:
在这里插入图片描述

测试用例1:

  • Sentence1:Mike likes to play football.

  • Sentence2:Jack likes to play basketball.

    输出情况:
    在这里插入图片描述

测试用例2:

  • Sentence1:I love you.

  • Sentence2:I like you.

    输出情况:
    在这里插入图片描述

测试用例3:

  • Sentence1:What are you treying to say?

  • Sentence2:Gow strong are youe glasses?

    输出情况:
    在这里插入图片描述

测试用例4:

  • Sentence1:I am not available.

  • Sentence2:I am busy.

    输出情况:

在这里插入图片描述

测试用例5:

  • Sentence1:all out

  • Sentence2:all over

    输出情况:

在这里插入图片描述

测试用例6:

  • Sentence1:It is a good day!

  • Sentence2:What a good day!

    输出情况:
    在这里插入图片描述

测试用例7:

  • Sentence1:It is a good day!

  • Sentence2:What a bad day!

    输出情况:
    在这里插入图片描述

测试用例8:

  • Sentence1:It is a good day!
  • Sentence2:What a good weather!
    输出情况:

在这里插入图片描述

测试用例9:

  • Sentence1:It is a good day!

  • Sentence2:It is a bad boy!

    输出情况:
    在这里插入图片描述

测试用例10:

  • Sentence1:I like this!

  • Sentence2:I enjoy this!

    输出情况:

在这里插入图片描述

总结:

  从上面实验过程以及实验结果我们可以看出Bag of Words模型在句子相似度上的使用的局限性是很大的,忽略词语的顺序是它的最大特点也是最大的缺点。我们不难发现有时候虽然两个句子重复地词语很多但表达的意思会是截然不同的,然而在Bag of words模型中,这种情况下两个句子相似度会很高,所以这样子的结果是没有意义的,甚至于说是错误的。
但是在某些情况下,依靠词语进行计算相似度可以对许多句子进行分类。例如测试用例1:

  • Sentence1:Mike likes to play football.
  • Sentence2:Jack likes to play basketball.

这个句子对的相似度很高,我们就可以把他们归为一类。这与现实是对应的,因为这一句子对都是表达爱好的,所以将Bag of Words用在文档分类可能会更合适些。

  在词典处理上比较好的点是引入向量的概念,我们知道计算机更擅长于做矩阵运算工作,在做句子相似度时,将每个文档转化为对应于词典的向量计算机的计算效率更高,而且更有利于处理大规模的文档的分类。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值