word2vec相似度计算_算法编程—解决文本相似度问题的海明距离和文本embedding算法...

在前几篇文章中,主要介绍了基于动态规划法的算法来解两个文本的相似度问题,但它们有具有一定缺陷,对文本的刻画还是不够精准和灵活。本文介绍基于文本embedding的算法,这种算法在工业界都有较广泛的应用。

48187500113ca5870eb35d04adb7c3f4.png

一. 基于向量空间模型

向量空间模型简称VSM,大致步骤是:

  1. 对文本进行分词,并根据分词结果提取特征,例如最简单的onehot特征。
  2. 用提取的特征表示文本,比如一篇文档可以表示为onehot的特征向量。
  3. 根据向量结合欧式距离或余弦夹角计算相似度。

这样做主要有两个问题:

  1. 文本的向量一般会比较长,在计算向量时性能太差。
  2. 无法刻画深层语义信息,例如一个词可能是另一个词的近义词,但向量空间模型会完全当成两个词。

那么,为了改进这些缺点,有如下的算法。

二. SimHash算法与海明距离

这种算法在之前的文章中我有详细介绍过,而且有具体代码实现。对于像google和百度这样大的搜索引擎,每天要处理的网页量非常多,比如爬虫获取的网页为了防止重复,会对网页进行判重处理。对于上亿的数据VSM无能为力,而google提出了SimHash算法和基于海明距离的相似度计算,大大减少了计算量。

那么,SimHash算法的具体是怎么实现的呢? 它的步骤如下

1. 输入一个N维的文本特征向量V,每个特征具有一定权重。2. 初始化一个C维的向量Q,初始值均为0,C位二进制签名S为0。3. 对于向量V的每个特征,使用hash算法计算出一个C位的散列值H。4. 对任意i属于[1, C],若H第i位为1,则Q的第i维加该特征的权重,否则减。5. 若最终Q的第i维元素大于0,则S的第i维为1,否则为0。6. 最终这个C维的二进制签名S就是该文本的二进制签名。

算法流程用流程图表示如下

399936e2982705375ee89035c8f04673.png

这样就相当于通过SimHash算法对一篇文档进行了签名,得到一个二进制串。那么下一步就需要利用这个二进制串进行相似度的计算了,但如果两两进行计算再判重,这个时间复杂度也太高了。

对于爬虫系统来说,我们抓取了一个新网页,只需要判断这个网页在已有网页里面有没有特别相似的网页就可以了,如果有,说明网页重复了,如果没有则将新抓取的网页加入系统。下面通过海明距离来计算相似度。

两个二进制串的海明距离是两个二进制串异或后1的个数

例如10101011和10001101,它们的异或后1的个数为3,那么海明距离就是3。根据经验,对于64位的二进制串来说,海明距离在3以内可以判定为重复了。

若将一个64位的二进制串划分为4块,每块16位,如果两个二进制串海明距离小于等于3,则至少有一个16位是完全相同的,具体是这4块的哪一块相同,需要枚举4次。

SimHash算法通常用于长文本的判重,而对于短文本来说,通过深度学习模型进行embedding更合适。

三. 基于embedding的算法

可以利用google的word2vec算法,跑出词向量,再通过其它算法来求句子与句子的相似度。还有篇论文《From Word Embeddings To Document Distances》专门介绍这个,就是利用word2vec的结果来求句子与句子的相似度。

这里我再介绍一种比较简单的方法,也是利用word2vec的词向量来计算句子与句子的相似度。方法如下

1.选出一个词库,比如50万个词基本足够了。

2.用word2vec跑出所有词的向量。

3.对于每一个句子,构造一个20万维的向量,向量的每一维是该维对应的词和该句子中每一个词的相似度的最大值。

4.这样就构造出句子的向量,由于句子不会太长,20万维的向量大部分位置的值为0,所以解是稀疏的,在计算上也没有什么挑战。

另外还有doc2vec的方法,是借鉴了word2vec算法的思路实现的。在Python的gensim包里面已经实现了doc2vec模型,可以直接使用,感兴趣的同学可以看一下。

文本相似度计算的相关算法大概就介绍完了,如何对本问题感兴趣的可以参考之前的几篇文章,希望能得到大家的关注,后续还有更多算法和编程相关的文章。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值