word2vec相似度计算_短文相似度匹配

v2-eb423d5e17b4620bc0cdadcb9c8701ac_1440w.jpg?source=172ae18b

一、原始落后的VSM

网上搜索关键词“短文本 相似度”,出来的结果基本上都是以BOW(Bag of words)的VSM方案,大致流程如下:

分词 —> 提取关键词 —> 计算tf或if-idf,以向量的形式替换原文本 —> 文本相似度的问题转变为计算向量相似度

一开始这样的一个思路,很清晰明了,而且网上相应的资料也很多,然后就开搞吧。

1、把所有短文本去掉标点符号,用jieba分词分好词,去除停用词,得到分好的文本;

2、按一定规则抽取特征词汇,作为后期向量的每一维;

3、用sklearn库中的原生方法CountVectorizer、TfidfVectorizer等得到矩阵;

4、每个短文本计算对应得到的向量,采用K-Means聚类的方法进行非监督学习。

文本分类的大致思路基本上就如上所述,具体的细节调整就视实际情况而定。然而,想法是美好的,现实是残酷的,全部分好词的文本,抽取的特征词较多,即向量的维度较大,且向量是稀疏的,在使用K-Means时,会出现有个别cluster下的文本数量特别大;

经过多次尝试之后,对CountVectorizer生成的词频矩阵使用LDA进行降维,即使用topic对文本进行建模,向量的维度是各个topic,每个维度的值就是该文本和该topic的近似度,该向量并不是稀疏的,一定程度上避免了稀疏性导致的两文本很难匹配上的问题,实际的测试结果也证明,LDA可以解决上述个别cluster下文本数量异常大的问题,相比于PCA降维效果更好。

解决了一个问题后,就是要改进以提高分类的精确度。由于短文本的先天性特征词数量少的原因,所以,首先要解决的就是提升短文本的信息量;最开始是想到的是近义词替换,网上找到现成的近义词词典,把相近的词都替换为一个,增大短文本之间有重叠部分的概率,但是由于现成的近义词词典的局限性,对于当前项目适配性不是很好,所以测试结果一般。

而后看到短文本扩充的方法,根据现有短文本的词汇去找出关联的几个词,填充的现有的短文本中去,增大文本的信息量;word2vec,网上很多例子都是用word2vec寻找某个词的关联词,所以我把近义词替换改为了使用word2vec寻找关联词,但是实际结果也是一般,因为插入新词之后,同时也会引入更多的噪声,收效甚微。

头疼。。。

二、Word Embedding --- OMG!!!

最后,终于开窍了,发现之前使用Word2vec相当于绕了一圈,使用word2vec计算出的词向量找关联词,还不如直接使用词向量,

然后,网上一搜,发现word embedding,原来如此,得到短文本每个词的词向量,然后做最简单的均值处理,得到文本向量,然后用文本向量去和其他文本求相似度,效果秒杀之前的所有好嘛!!!终于可以睡个安稳觉了

相比于之前的方案,简单高效,直接用语料库训练处model,然后使用该model计算出短文本中各个词的词向量,然后求一个equal weighted的mean值,删代码删的我都肉疼==!

Word2vec使用的是gensim中的,还挺方便,不过大家也可以自己用tensorflow或keras自己写一个网络来训练;具体的准确度还取决于语料库的大小。

现在有一个更快的库就是fasttext,GitHub上有pre-trained的各语言的model,大家可以直接拿来用。

---------2019.03.22更新---------

上文中对各个词向量求equal weighted的mean值,是最简单的方案;如果有需求可以加上权重,但是情况就很复杂了,比如根据不同的词性来定相应的权重;但是这样引出的麻烦点就是数据量达到一定的级别之后,满足不了产线的效率要求了。

两两求相似度,那么就会引出笛卡尔积的数据量巨幅膨胀的问题,解决的方向就是缩小两两相似度的范围。

方案一:对于得到的文本向量,先做一次粗略的K-means聚类;然后再在每个cluster内部去做相似度的计算。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值