Spark:HanLP+Word2Vec+LSH实现文本推荐(kotlin)

Spark:HanLP+Word2Vec+LSH实现文本推荐(kotlin)

文本推荐的基本流程就是首先对目标本文进行关键词提取,接着把关键词转成词向量,再计算词向量的相似性进行推荐。这三个步骤都有现成的模型和算法来实现,本文介绍的就是基于spark用hanlp+word2vec+lsh实现文本推荐。

下面先介绍每个步骤所用的模型和算法。

1.HanLP:提取中文文本的关键词

1.HanLP是一系列模型与算法组成的NLP工具包,目标是普及自然语言处理在生产环境中的应用。

2.HanLP工具包功能非常丰富,中文分词,词性标注,命名实体识别,关键词提取,自动摘要,短语提取,拼音转换,简繁转换,文本推荐.

3.这些功能的很多都是基于机器学习深度学习的模型,只不过已经训练好,我们直接调用即可

4.附上HanLP github链接: https://github.com/hankcs/HanLP

2.Word2Vec:把提取后的关键词转成词向量

1.Word2Vec是Google开源的一款用于词向量计算的工具,该工具得到的训练结果——词向量(word embedding),可以很好地度量词与词之间的相似性。

2.word2vec算法的背后其实是一个浅层神经网络,另外word2vec是一个计算word vector的开源工具并不是一个算法或者模型,可以理解为动词形式 “把word 转成 vector”,背后是word vector的CBoW模型和Skip-gram模型做了转换工作。

3.Word2Vec的发展历程以及内部算法其实算比较比较复杂,如果展开来讲可能一篇博客都讲不完,笔者也不能完全理解,简而言之,word2vec背后是一个神经网络模型用来预测目标语句出现的概率返回词库中的向量,然后计算输入向量和返回向量的相似度再归一化。Word2Vec主要用于机器翻译和推荐系统领域。

4.这里贴上一份比较详细的word2vec介绍的文章 https://www.cnblogs.com/guoyaohua/p/9240336.html

3.LSH:将向量进行哈希分桶,使得原语义上相似的文本大概率被哈希到同一个桶中,同个桶内的文本可以认为是大概率是相似的

LSH:局部敏感哈希算法,是一种针对海量高维数据的快速最近邻查找算法,主要有如下用法

1.近似重复的检测: LSH 通常用于对大量文档,网页和其他文件进行去重处理。
2.全基因组的相关研究:生物学家经常使用 LSH 在基因组数据库中鉴定相似的基因表达。
3.大规模的图片搜索: Google 使用 LSH 和 PageRank 来构建他们的图片搜索技术VisualRank。
4.音频/视频指纹识别:在多媒体技术中,LSH 被广泛用于 A/V 数据的指纹识别。

在推荐系统等应用中,经常会遇到的一个问题就是面临着海量的高维数据,查找最近邻。如果使用线性查找对于高维数据计算量和耗时都是灾难性的。为了解决这样的问题,出现了一种特殊的hash函数,使得2个相似度很高的数据以较高的概率映射成同一个hash值,而令2个相似度很低的数据以极低的概率映射成同一个hash值。我们把这样的函数,叫做LSH(局部敏感哈希),注意是这样的函数不是一种。

LSH中的哈希函数的数学定义

我们将这样的一族hash函数 H={h:S→U} 称为是(r1,r2,p1,p2)敏感的,如果对于任意H中的函数h,满足以下2个条件:
1.如果d(O1,O2)<r1d(O1,O2)<r1,那么Pr[h(O1)=h(O2)]≥p1Pr[h(O1)=h(O2)]≥p1
2.如果d(O1,O2)>r2d(O1,O2)>r2,那么Pr[h(O1)=h(O2)]≤p2
其中,O1,O2∈S,表示两个具有多维属性的数据对象,d(O1,O2)为2个对象的相异程度,也就是1 - 相似度

为了避免陷入数学漩涡,概括一下就是,LSH的哈希函数必须满足这样一个功能,当两个目标值足够相似时,映射为同一hash值的概率足够大,而足够不相似时,映射为同一hash值的概率足够小。

针对不同的相似度测量方法,局部敏感哈希的算法也不同,我们主要看看在两种最常用的相似度下,两种不同的LSH(spark也支持这两种模型)

1.使用Jaccard系数度量数据相似度时的min-hash ,对应spark的MinHashLSH

2.使用欧氏距离度量数据相似度时的P-stable hash,对应spark的BucketedRandomProjectionLSH

两种方法都是将高维数据降维到低维数据,且在一定程度上还能保持原数据的相似度不变,LSH的哈希相似度不变性也是概率性的不是确定性的,好在LSH的设计能够通过相应的参数控制出现这种错误的概率,这也是LSH为什么被广泛应用的原因

min-hash (通过度量Jaccard系数)

Jaccard系数主要用来解决的是非对称二元属性相似度的度量问题,常用的场景是度量2个集合之间的相似度,就是2个集合的交集比2个集合的并集(很容易理解吧)

下面我们来简单举个例子理解min-hash的原理

假设有4个文档,每个文档有相应的词项{w1,w2,…,w7},若某个文档存在这个词项,则标为1,否则标0.那么我们就可以得到如下矩阵1
矩阵1
接着我们进行一个随机的行置换可以得到如下矩阵2
矩阵2
可以确定的是,对这个矩阵按行进行多次置换,每次置换之后,统计每一列(其实对应的就是每个文档)第一个不为0的位置(行号),这样每次统计的结果能构成一个与文档数等大的向量,这个向量,我们称之为签名向量。比如文档1的签名向量 [1,2,1,2],文档2的签名向量 [1,1,2,1]

min-hash的思想就是如果两个文档足够相似,那也就是说这两个文档中有很多元素是共有的,换句话说,这样置换之后统计出来的签名向量,这些文档所对应的签名向量的相应的元素,值相同的概率就很高。概括一下就是如果两个文档相似,那么分词后含有的词项应该交集很多,那么进行随机置换后文档所在列的第一个不为0的位置很大概率是相同的,能理解吧

通过多次置换,求取向量,构建了一组hash函数。也就是最终得到了一个签名矩阵. 为了控制相似度与映射概率之间的关系,我们需要按下面的操作进行,一共三步

(1) 将signature matrix水平分割成一些区块(记为band),每个band包含了signature matrix中的r行。需要注意的是,同一列的每个band都是属于同一个文档的。

在这里插入图片描述
(2) 对每个band计算hash值,hash函数没有特殊要求,MD5,SHA1等等均可。但需要将这些hash值做处理,使之成为事先设定好的hash桶的tag,然后把这些band“扔”进hash桶中。如下图所示。
在这里插入图片描述
(3) 如果某两个文档的同一水平方向上的band,映射成了同一hash值(如果你选的hash函数比较安全,抗碰撞性好,那这基本说明这两个band是一样的),我们就将这两个文档映射到同一个hash bucket中,也就是认为这两个文档是足够相近的。

其中bands 和 rows 就是可以调节的两个参数,通过调节b和r两个参数可以得到一个很好的效果。

P-stable hash

不同的相似度判别方法,对应着不同的LSH,那对于最常见的Lp范数下的欧几里得空间,应该用怎样的LSH呢

P-stable hash涉及到p稳定分布的概念,这里不说数学自行百度,概括一下,p稳定分布一个重要的应用,就是可以估计给定向量vv在欧式空间下的p范数的长度,也就是||v||p||v||p。

p-stable 分布LSH函数族构造

1.将空间中的一条直线分成长度为r的,等长的若干段

2.通过一种映射函数(也就是我们要用的hash函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值