距离方法
1、文本的表示
11、VSM表示
12、词向量表示
13、迁移方法
2、距离计算方法
21、欧氏距离 (L 2 范数)、曼哈顿距离 (L 1 范数)、 明氏距离
22、汉明距离
23、Jaccard相似系数、 Jaccard距离( 1-Jaccard相似系数)
24、余弦距离
25、皮尔森相关系数
25、编辑距离
场景举例:
1)计算 Query 和文档的相关度、2)问答系统中计算问题和答案的相似度、3)广告系统中计算 Query 和广告词的匹配程度、4)推荐系统中 要给某个用户推荐某件物品,计算这件物品和这个用户兴趣的相似度
更多地,判断两个query表达的意思是否相同也可以看作属于文本相似度的范畴。
相似度一定是指两个东西(姑且分别用 P 和 Q 表示)的相似程度,而这两个东西可以是任何形式的,例如文本、、声音等等。最终要计算相似度,那必须把这些东西抽象成数学形式,说白了 ,就是怎么用数字把 这些 东西表示出来, 一 般会表示成向量或者矩阵。那如果表示成了向量, 计算相似度就可以使用大家在数学课上学的知识了。
这里希望可以比较清晰全面地介绍一下文本相似度的计算方法,目前来说,大致分为距离、hash、深度学习三种方法。
这些所谓的距离其实都是一些 固定 的公式而己,关键在于如何应用。实际应用中可以使用tf-idf、word2vec、LDA等方法实现相似度的距离计算。
很多相似度的第一步其实都是文本的表示问题,即把文本用数字的形式表示出来,这一步目前主要有 VSM(vector space model) ,和 词向量表示 两种方式。
这种方法其实灵活性较大,可以基于分词,对于中文基于字符或n-grams的表示也有一定效果。
1) tf-idf/bow表示 :在给定文档集合C和词典D的条件下,将某篇文档通过词袋模型表示成一个个的词,而后根据 TF-IDF 为每个词计算出一个实数值;
由于词典D的大小为M,因此 将这篇文档转化成一个M维向量 ,如果词典中某个词未出现在文档中,则这个词的在向量中对应的元素为0,若某个词出现在文档中,则这个词在向量中 对应的元素值为这个词的tf-idf值 。这样,就把文档表示成向量了,而这就是 向量空间模型(vector space model) 。从这里也可看出:向量空间模型并没有catch住词(term)与词(term)之间的关系,它假设各个term之间是相互独立的。
而有了文档向量,就可以计算文档之间的相似度了。
这种表示方法与词典大小相关,往往会使文本的表示比较稀疏且高维,可以通过PCA缓解这一问题。
2) 主题模型表示 :实际上VSM可以作为一种文本表示的思想:把对文本内容的处理简化为向量空间中的向量运算,并且它以空间上的相似度表达语义的相似度。
在这个角度,使用LDA,LSA等主题模型同样可以完成文本的VSM表示:将文本表示为topic的向量空间。
这种方法维度可自定义(topic数),且不稀疏,但是可能存在文本对之间距离相似度分布空间密集的情况导致效果不佳。
这种方法一般直接将文本分词后 将词向量相加除以句子长度就可得到 。也可以使用如 smooth inverse frequency的加权方法 将词向量加权:每个词嵌入都由a/(a + p(w))进行加权,其中a的值经常被设置为001,而p(w)是词语在语料中预计出现的频率。
一般来说word2vec的词向量方法 强于glove方法 ,而对于word2vec,cbow方法强于skip-gram(具体原因并不复杂,感兴趣可以从训练方法角度思考一下~)
更多地,上述文本表示方法其实会损失或无法捕捉到语义信息,通过bert、elmo等预训练方法的表示更加靠谱,也可以用于无监督的文本相似度计算。
欧氏距离:
曼哈顿距离:
表示两个(相同长度)字对应位不同的数量,我们以d(x,y)表示两个字x,y之间的汉明距离。对两个字符串进行异或运算,并统计结果为1的个数,那么这个数就是汉明距离。
(1)雅各相似系数:
两个集合A和B的交集元素在A,B的并集中所占的比例,称为两个集合的杰卡德相似系数,用符号J(A,B)表示。
杰卡德相似系数是衡量两个集合的相似度一种指标。
实际使用中,可以用去重与不去重两种方式计算,更多地,可以转换为交集的tf-idf值之和除以并集的tf-idf值之和
(2) 杰卡德距离
与杰卡德相似系数相反的概念是杰卡德距离(Jaccard distance)。
杰卡德距离可用如下公式表示:
杰卡德距离用两个集合中不同元素占所有元素的比例来衡量两个集合的区分度。
夹角余弦取值范围为[-1,1]。夹角余弦越大表示两个向量的夹角越小,夹角余弦越小表示两向量的夹角越大。当两个向量的方向重合时夹角余弦取最大值1,当两个向量的方向完全相反夹角余弦取最小值-1。文本的相似度一般取绝对值。
皮尔森相关系数在推荐系统用的较多,它的公式如下 :
指两个字符串,由一个变成另一个所需的最少的编辑次数,这个编 就包括替换、插入、删除操作。
文本相似度的计算一般使用VSM/cbow+cos距离/欧式距离,或jaccard距离
Dice 系数可以计算两个字符串的相似度:Dice(s1,s2)=2comm(s1,s2)/(leng(s1)+leng(s2))。
https://blogcsdnnet/weixin_43526820/article/details/89883640spm=1001201430015501
我正好是做记录文档匹配的,提供一个最简单的思路吧,计算两个向量的余弦或者jaccard相似度。即是比较两个向量相同的部分与总数之比,计算两个向量的编辑距离jaro距离或者仿射距离即是一个向量转换为另一个向量所需的最小插入删除更新等编辑操作次数,算出相似度之后,可以直接根据相似度判断是否相似,也可以利用knn分类器等分类方法判断相似与否,用deeplearning的话:短文本:拿word2vec开始,然后上面套CNN(如果n-gram更重要),或者LSTM做短文本的embedding,然后算两个文档在embeddingspace里的相似度。或者拿李航老师的Arc-II直接学word2vec之后的matching。
http://wwwcnblogscom/tracer-dhy/p/5808323html
皮尔森相关系数只能获取现行关系,spearman 单调关系。
http://www360doccom/content/16/0805/11/35571684_580944889shtml
1 使用更快的算法:sklearn中的cosine_similarity函数使用的是基于npdot和nplinalgnorm的实现方式,如果需要更快的计算速度,可以考虑使用在numexpr和scipy包中实现的算法,例如:
```
import numexpr as ne
def cosine_similarity(X, Y):
x_norm = neevaluate('sqrt(sum(X2, axis=1))')
y_norm = neevaluate('sqrt(sum(Y2, axis=1))')
numerator = neevaluate('X @ YT')
denominator = neevaluate('outer(x_norm, y_norm)')
return numerator / denominator
```
2 使用较小的矩阵或者降维:如果计算的矩阵较大,可以考虑使用PCA或者其他降维技术将矩阵的维度降低,从而加快计算速度。
3 利用并行化计算:如果计算的矩阵较大,可以考虑使用分布式系统或者并行化计算框架,例如dask或者Apache Spark,从而加速计算过程。
4 选择合适的硬件:选择高性能计算硬件,例如GPU,可以加速计算过程。可以使用例如PyTorch或TensorFlow等框架中的GPU加速功能。
欢迎分享,转载请注明来源:浪漫分享网
评论列表(0条)