推荐系统技术 --- 文本相似性计算(模型化 上)

1. 前言

推荐系统分为两种,一种是基于用户的,根据某个用户的特性推荐一些东西,还有一种是根据内容,推荐一些相似的内容,或者是两种的结合,任何推荐系统,仔细分析下来,都属于这两种情况的组合。

今天我们说一下基于内容推荐中的一个分支,也是使用得比较多的内容推荐方式,那就是基于文本相似性的推荐,我们说文本相似性的计算,文本相似性应用范围是比较广的:

  • 普通的阅读文章,底下的相关文章推荐可以用

  • 论文查重也可以用

  • 过滤相似度很高的新闻,或者网页去重

本系列我们会写三篇。

  • 前两篇是模型化,分为上和下,这两篇是重点,开篇会用说人话的方式说说计算文本相似性的一些思想和套路,对文本相似性有个感性的了解,然后会把人话变成数学化的东西,只有数学化了才能计算,才有计算机能做的文本相似性,当然不会出现大量数学公式,只会有一些数学概念。

  • 第三篇是工程化,这篇是非重点,会介绍一下相关的工程的工具包或者代码片段,相当于局部实战吧,没有理解第一篇说的直接看这篇没什么含义。

2. 直观理解

假如我们有以下这么些篇文档

  • 用Golang写一个搜索引擎

  • 搜索引擎的实现

  • 推荐系统的技术要点

  • 常用的推荐算法总结

  • 广告系统是一个搜索引擎和推荐引擎的组合

  • 计算广告中都有哪些数学原理

有个一个小朋友,他叫小明,但是他还在上学前班,你让他来说这些文章中哪几篇比较相似,他现在字都认不全,更别说理解这些文章中的概念了,如果他特别聪明,那么他很可能说1和5比较相似,因为都有个长得一样的东西一个搜索引擎

又过了一些年,小明已经读初中了,你再让他来看哪几篇比较相似,他可能会告诉你1和2比较相似,然后和5也比较相似,因为他现在已经学会了主谓宾定状补的语法,知道第一条的主要表述的是搜索引擎,第二篇主要表述的也是搜索引擎,第五篇虽然主要不是说的搜索引擎,但宾语的定语也是搜索引擎,也是相关的。所以会给出1和2相似,5和他们也比较相似。

再过一些年,小明已经大学毕业了,学的就是计算机专业,这时候你再来看,他会给出6个都比较相似,因为他已经知道了搜索,推荐,广告三个领域的基础技术都差不多,如果对一个感兴趣,那么对另外的主题也会比较感兴趣,只不过相似性有高有低而已。

上面的三个阶段,实际上也是文本相似性计算发展的三个阶段,从最开始的字面的匹配相似,到第二阶段的词汇的匹配相似,再到第三阶段的语义的相似,我们一个一个来说说每个阶段使用的数学方法和原理,每个阶段都会有数学原理,但我们对数学公式不做深入讨论,感兴趣的可以自己查阅具体的数学原理。

下面,我们再用计算机和数学的思想来看看计算机如何在上述三个阶段中进行文本相似性的计算的。

4. 前期准备

在开始三个阶段之前,我们先准备一些必要的知识。

4.1 分词

分词也叫切词,因为文档的最小单位是词,所以我们默认都是讨论分词过的情况,为了方便,我们把每个词都分配一个唯一id,我们叫这个词的token。后面出现token这个概念,就是表示切词后的唯一id

4.2 词袋模型

维基百科解释 :Bag-of-words model是个在自然语言处理和信息检索下被简化的表达模型。此模型下,像是句子或是文件这样的文字可以用一个袋子装着这些词的方式表现,这种表现方式不考虑文法以及词的顺序。

通俗的说就是把一个文档分词得到的一堆token放到一个袋子里,用这个袋子来表示这个文档,这是一种简化的文本描述方法。

5. 学前班阶段

学前班阶段也叫直接计算相似的阶段,我们其实不关心这篇文章到底讲什么,用计算机的理解就是,分词完成以后,我们找到一种方法,来计算各个token集合之间的相似性就行了。

5.1 JaccardSimilarity方法

分词以后,我们得到的一堆token,按照学前班的小明的思想,找到两两之间相似性即可,JaccardSimilarity方法可以满足这个条件,JaccardSimilarity说起来非常简单,容易实现,实际上就是两个集合的交集除以两个集合的并集,所得的就是两个集合的相似度,直观的看就是下面这个图。

数学表达式是:

很明显,我们可以很容易的把上面的那几个文档两两进行上述计算,然后得到每两个文档的相似性,再一排,就知道每个文档和其他每个文档的相似性了。

即便新来一个文档,按照上面的公式计算一下,就知道它和每个文档的相似性了,完全没有难度,当然,你会发现算出来真的就像个学前班的学生弄出来的,完全没有可用性。

6. 初中阶段

学前班阶段实在是太Low了,我们看看初中阶段都出现了一些什么新东西?

6.1 数学化

要将表达意思的文本变成可计算相似度的东西,首先,必须将文本数字化,并且数字化以后还能保留文本的一些基本信息,只有数字化以后才有可计算性,只有保留了基本信息,这个可计算性才有可信度。

线性代数给我们提供了一个数学工具叫向量,向量看上去特别简单,就是一串数字,别看它看上去非常简单,但却是非常强大的数学工具,有多强大呢?我们从侧面来说说,我们知道无论哪个编程语言,都有一个最基本的数据结构,是内嵌在语言中的,那就是数组,而数组就是向量,数组有多强大不用我说了吧?谁敢说他没用过?它都已经强大到我们感觉不到他的强大了,就像空气一样,重要到我们不觉得他重要了(北京除外,呵呵)。

如果我们能将一个文本变成一个向量,那么我们就将一篇复杂的文章变成了一个可以用数组描述的数学概念了。

啰嗦了这么多,如果有一个向量了会怎么样?再往上一步,线性代数还给了我们一个概念,就是空间,任何向量都可以表示为某一个空间上的一个点。

所以说,先有了文本,文本变成了向量,再有了空间,向量变成了空间的点,那么我们通过求两个点之间的距离,就求得了两个文档的相似性。

至此,数学化完成了,文本相似性的计算就变成了空间中两个点的距离的计算,就像下图一样。

6.2 向量化

6.2.1 最简单的向量化

我们先来看看如何进行向量化,前期准备部分我们已经说了,每个词都可以表示为一个唯一的token,那么最简单的向量化,我们拿这个token来向量化,比如下面两个文档,每个词用一个id表示(搜索引擎这个词重复出现了,所以id一样,都是5)

用/Golang/写/一个/搜索引擎/1,2,3,4,5
搜索引擎/的/实现/5,6,7

这两个向量不一样长,不好映射到同一个空间中,于是我们这么处理一下,编号1到7为所有的token,用数组的下标表示,如果这个编号上有词,那么设为1,否则设为0,这样一来,两个文档向量化以后就变成了

用Golang写一个搜索引擎  ===>  [1,1,1,1,1,0,0]
搜索引擎的实现          ===>  [0,0,0,0,1,1,1]

这样,两个文档就都向量化了,虽然这种向量化是最简单的,但不管怎样,我们至少把文本变成了数学符号了。

6.2.2 TF-IDF向量化

文本处理中,还有一种非常常见的向量化方法,就是TF-IDF方法,关于TF-IDF方法,可以参见我之前的一篇文章,已经说得比较清楚了,这里就不赘述了,可以点击链接打开看。

总之,通过TF-IDF的向量化方法,我们可以将每个词向量化成一个表示权重的小数,而不是上面的0,1向量了,它已经带有了文本的信息了,通过TF-IDF计算,两个文档向量化以后就变成了下面这样

用Golang写一个搜索引擎  ===>  [0.5, 0.8, 0.2, 0.15, 0.9, 0,   0]
搜索引擎的实现          ===>  [0,   0,   0,   0,    0.8, 0.4, 0.3]

这样向量化以后,每个词都带上了TF-IDF信息了,而TF-IDF的作用就是保留词在文档中的权重信息,这就相当于保留了文本的信息,于是我们通过token的概念和TF-IDF方法,就把一个文本向量化了,并且向量化完了以后还保留了文本本身的信息,每一个向量就是一个前面提到的词袋。

6.3 向量空间模型

向量化完了以后,需要提供一个空间来进行计算,我们把这个叫做向量空间(VSM),这没啥好说的,比如向量是一个二维向量,那么空间就是一个平面,如果是个三维向量,那么空间就是一个立体空间,上文中的向量是一个7维向量,那么空间就是一个七维空间了。

这样,每一篇文档向量化以后都是一个7维向量,都可以表述为这个向量空间中的一个点了。

6.4 向量相似度计算

有了向量空间和向量本身了,计算两个向量的相似度就简单了,一般有两种方法

6.4.1 欧式距离

不是说每个向量就是这个空间中的一个点么?那么相似性就是直接计算这两个点的欧式距离,欧式距离公式初中就学了哦

把上面那两个向量用这个距离公式一带入,就求出两篇文档的相似度了。

6.4.2 余弦相似度距离

除了欧式距离,还有一种方法求相似度,就是求两个向量之间的夹角,这个叫余弦相似性,这也是初中数学的内容,不过初中我们学的是二维向量,如果是N维呢?是一样的,假设两个向量是A和B,那么公式是,n表示维度

照样带入,就能求出两个文档相似度了。

7. 中学毕业

至此,文本相似性计算的最基本的概念和模型都介绍完了,中学已经毕业了,你可以按照上面的方法自己试着计算计算文档的相似性,应该不会太离谱,后面一篇会介绍一些更加高级的东西,但是整体的思想不会有太大的变化,还是向量化文档,然后计算向量间的相似度来表述为文本之间的相似度。

这篇我们看到的东西都还是浅层的文本相似性计算,但是其实一个TF-IDF向量化模型,一个余弦相似性夹角计算已经可以处理一大部分的文本相似性计算了,而且效果还凑合吧,但后面出来的各种语义模型才是文本推荐的未来。


欢迎关注我的公众号,主要聊聊搜索,推荐,广告技术,还有瞎扯。。文章会在这里首先发出来:)扫描或者搜索微信号XJJ267或者搜索西加加语言就行

03-05 23:21