![c5b6f0ba7c1a79b935e444aa88e2b843.png](https://i-blog.csdnimg.cn/blog_migrate/309f1744ef4d3ff312bdae036135b4c7.jpeg)
生活中,人们会产生大量的文本信息,而这些信息当中蕴含了巨大的信息,需要我们用一些技能去最大化的挖掘他的价值,从而反过来促进社会的发展,从而良性循环。
文本是一种高纬度的语义空间, 对其合理的分解,从而转换成数学问题, 利用向量进行计算,或者转换成分类问题进行求解, 或者转化成聚类问题。
在文本相似度这方面,现在主要的解决方案可以大致分为三大类。第一大类,给予关键词的传统方法。第二大类,将文本映射到向量空间,再利用余弦相似度。第三大类,利用深度学习的方法,进行特征embedding,比如基于用户点击数据的深度学习语义匹配模型DSSM, 基于卷积神经网络的ConvNet。
本文作为相似度的总结,对每一种都做简要概括。
基于关键字匹配,类似物理学两个铁球同时落地那个实验,所见见所得。说白了,就是把句子切分成多个小段文字,然后进行俩俩字符串比较。脑袋瓜转一下,当两个句子是完全成景象的,那么他们就完全不相似。
Jaccard 相似度,这个我们可以理解成,字重叠率,对与重叠部分与所有总和的比值,这个看起来要比上面的要合理些。
基于上面的传统方案,并不是太理想,之后,人们就转战到讲句子投影到向量空间的方法
还是先提一下基于公式计算来的吧。没错,那就是TF-IDF。这个不得不说,某次在中科院面试,竟然有被问到
问:你是如何构建句子的特征的?
答:利用tf-idf。。。。。。
问:这个怎么构建特征,它计算的是权重呀?
这个,这个作者当时还真碰到了,现场我还愣了一下,这面试官是果然是刚毕业的小硕一枚哈。
本质上IDF是一种试图抑制噪音的加权 ,并且单纯地认为文本频数小的单词就越重要,文本频数大的单词就越无用,显然这并不是完全正确的。IDF的简单结构并不能有效地反映单词的重要程度和特征词的分布情况,使其无法很好地完成对权值调整的功能,所以TFIDF法的精度并不是很高。
对于一想常用词,比如的,得,地,很是难搞。这不 word2vec出来了,这个我之前有博客。最早出现在Bengio等人在《A neural probabilistic language model》。Mikolov et al. (2013)提出的word2vec核心思想是认为词的意思可以从它频繁出现的上下文信息中体现《A word’s meaning is given by the words that frequently appear close-by》。
这个word2vec我不得不说,真实一个好的发明,虽然在18年之后,它变得不厉害了,但是依然很受程序小哥们的喜爱。因为他实在是太好了,完全可以把它当成一个词典,遇到不知道的单词,查表,就能搞定。
而它也并不是没有缺点,只是被优点完全掩盖了。但是我还是提一下它的不足,在进行语义表示的时候,是属于一对一的,但是,在生活中,一个人突然说苹果
,你能知道它说的指代什么吗?而且训练之后向量就不能改变,针对特定任务优化很难搞!
上面聊的都是表示,拿到向量,我们应该怎么计算呢?这个就多了,只要能衡量两个数字之间的差距,就可以了。比如欧式距离,曼哈顿距离,余弦相似度,问可夫斯基,汉明距离等等,实在是太多了。
当然了,还是当下已经是深度学习的天下,传统的方案也就慢慢的退出历史的舞台。这就像计算机的发展一样,从二进制表示到量子计算机的发展。
伪代码如下:
embedding|word2vec|elmo|glove|bert|gpt
lookup
conv|cnn|lstm|gru|rnn|
dense
这里只列举了一项工作中常会考虑的方案,当然这一部分还有好多算法实验,但是并不是所有的都需要,比如BM25公式更加复杂,而它也是面试常问的,个人观点,这个就没什么意思了,问这个,还不如问问它针对tf-idf做了那些改进,然后在工作中才会去优化它。
好了,今天就写这些吧,尽量通熟易懂!少一些公式,多一些大白话。