育儿哪个网站做的好,做网站有兼职的吗,久久建筑网能否下载资料,html个人博客完整代码一、余弦相似
一、 余弦相似概述
余弦相似性通过测量两个向量的夹角的余弦值来度量它们之间的相似性。0度角的余弦值是1#xff0c;而其他任何角度的余弦值都不大于1#xff1b;并且其最小值是-1。
从而两个向量之间的角度的余弦值确定两个向量是否大致指向相同的方向。结…
一、余弦相似
一、 余弦相似概述
余弦相似性通过测量两个向量的夹角的余弦值来度量它们之间的相似性。0度角的余弦值是1而其他任何角度的余弦值都不大于1并且其最小值是-1。
从而两个向量之间的角度的余弦值确定两个向量是否大致指向相同的方向。结果是与向量的长度无关的仅仅与向量的指向方向相关。余弦相似度通常用于正空间因此给出的值为-1到1之间。
例如在信息检索中每个词项被赋予不同的维度而一个维度由一个向量表示其各个维度上的值对应于该词项在文档中出现的频率。余弦相似度因此可以给出两篇文档在其主题方面的相似度。另外它通常用于文本挖掘中的文件比较在数据挖掘领域中会用到它来度量集群内部的凝聚力。
二、 余弦相似应用场景
原创文章检测通过文本相似可以检测公众号文章、论文等是否存在抄袭
垃圾邮件识别如“诚聘淘宝兼职”、“诚聘打字员”、“文章代写”、“增值税发票”等这样的小广告满天飞作为网站或者APP的风控不可能简单的加几个关键字就能进行屏蔽的一般常用的方法就是标注一部分典型的广告文本与它相似度高的就进行屏蔽。
内容推荐系统在腾讯新闻、微博、头条、知乎等每一篇文章、帖子的下面都有一个推荐阅读那就是根据一定算法计算出来的相似文章。
冗余新闻过滤我们每天接触过量的信息信息之间存在大量的重复相似度可以帮我们删除这些重复内容比如大量相似新闻的过滤筛选。
可用于文本相似的方法非常多比如基于字符的杰卡德相似、编辑距离相似、最长公共子串等基于距离的相似也很多比如汉明距离、欧几里得距离等。本文介绍的是余弦距离相似比较简单可以作为风控领域文本相似的入门。
废话不多说先看一个案例我们用三句话作为例子我从自己的邮箱里面扒出来的垃圾邮件具体步骤如下。
三、 计算文本余弦相似
第一步分词。 A句子有/发票/加/薇/45357 B句子有/发票/加/微/45357 C句子正规/ 增值税/ 发票 第二步列出所有的词所有词的长度作为向量长度 有发票加薇微45357正规增值税 第三步计算词频 A句子有 1发票 1加 1薇 1微 045357 1正规 0增值税 0 B句子有 1发票 1加 1薇 0微 145357 1正规 0增值税 0 C句子有 0发票 1加 0薇 0微 045357 0正规 1增值税 1 第四步写出词频向量。 A句子[1, 1, 1, 1, 0, 1, 0 ,0] B句子[1, 1, 1, 0, 1, 1, 0 ,0] C句子[0, 1, 0, 0, 0, 0, 1 ,1] 到这里问题就变成了如何计算这两个向量的相似程度。我们可以把它们想象成空间中的两条线段都是从原点0, 0, ...出发指向不同的方向。两条线段之间形成一个夹角如果夹角为0度意味着方向相同、线段重合如果夹角为90度意味着形成直角方向完全不相似如果夹角为180度意味着方向正好相反。因此我们可以通过夹角的大小来判断向量的相似程度。夹角越小就代表越相似。
以二维空间为例上图的a和b是两个向量我们要计算它们的夹角θ。根据初中知识余弦定理告诉我们可以用下面的公式求得 假定a向量是[x1, y1]b向量是[x2, y2]那么可以将余弦定理改写成下面的形式 数学家已经证明余弦的这种计算方法对n维向量也成立假定A和B是两个n维向量A是 [A1, A2, ..., An] B是 [B1, B2, ..., Bn] 则A与B的夹角θ的余弦等于 使用这个公式我们就可以得到句子A与句子B的夹角的余弦。 下面我们用Python代码计算看看
import numpy as npA np.array([1, 1, 1, 1, 0, 1, 0 ,0])B np.array([1, 1, 1, 0, 1, 1, 0 ,0])C np.array([0, 1, 0, 0, 0, 0, 1 ,1])#定义相似计算函数def cos_simi(x,y): num x.dot(y.T) denom np.linalg.norm(x) * np.linalg.norm(y) return num / denomcos_simi(A,B)0.7999999999999998cos_simi(A,C)0.2581988897471611cos_simi(B,C)0.2581988897471611 [有/发票/加/薇/45357] 和 [有/发票/加/微/45357] 只有一个字的差异相似度0.80
[有/发票/加/薇/45357] 和 [正规/ 增值税/ 发票] 只有一个词相同相似度0.2581结果符合我们的感知。到此我们就学会了计算两个句子的相似度 四、完整版代码
# 输入A,B两段语句判断相似度import jieba
from collections import Counterdef preprocess_data(text):数据预处理函数分词并去除停用词# 使用结巴分词对文本进行分词words jieba.cut(text)# 去除停用词这里只列举了几个示例停用词实际应用中需要根据具体需求添加更多停用词stopwords [的, 了, 和, 是, 就, 而, 及, 与, 或]filtered_words [word for word in words if word not in stopwords]return filtered_wordsdef extract_features(words):特征提取函数使用词袋模型features Counter(words)return str(features)def cosine_similarity(features1, features2):余弦相似度计算函数numerator sum(features1[word] * features2[word] for word in set(features1) set(features2))denominator ((sum(features1[word] ** 2 for word in features1) ** 0.5) * (sum(features2[word] ** 2 for word in features2) ** 0.5))if not denominator:return 0.0else:return round(numerator / float(denominator), 3)def check_duplicate(content, input_text, threshold0.7):查重函数判断当前文本是否与已有文本重复# 对当前文本进行预处理和特征提取words preprocess_data(content)features extract_features(words)# 在此模拟已有文本的特征existing_features extract_features(preprocess_data(input_text))similarity cosine_similarity(eval(features), eval(existing_features))# 根据设定的相似度阈值来判断是否重复if similarity threshold:return similarityelse:return similaritysimilarity check_duplicate(我是你的人,我是你的情人)
print(similarity,similarity)二、杰卡德相似
杰卡德相似是比较常见的文本相似计算方法文本分词后的交集比上并集公式如下 但在风控的实际业务中有很多场景存在大规模的重复文本片段比如
S1 模具硅胶 翻模硅胶 指纹签到手指摸 指纹假膜 模具硅胶 液态硅胶 半透明硅胶 指模自制 指纹识别硅胶 打卡指纹透明膜 指纹膜 指纹 胶膜 手机指纹打卡假膜 指纹打卡机指纹胶膜 指纹识别贴打卡 diy硅胶模具材料 指纹打卡 指纹打卡道具 指纹打卡假膜人脸 指纹识别膜 硅胶 硅胶模具diy 模型制作材料 指模 液体硅胶 考勤指纹胶 指纹打卡假膜科密 指纹打卡假膜 硅橡胶 指纹胶膜制作 打卡 翻模硅胶材料 食品级硅胶 打卡考勤指纹 指模具考勤 翻模硅胶 diy 指纹打卡膜 指纹打卡假膜 打卡机指纹识别膜 指纹制作 diy液体材料 指纹制作工具 指模具 手指打卡 手办工具 签到指纹胶膜制作 模具硅胶翻模 翻模硅胶 指纹识别胶打卡 硅胶 硅胶打卡 打卡指纹胶膜 指纹识别膜套
S2 指纹打卡假膜科密 指纹签到手指摸 指纹识别膜 硅胶 指模具 手指打卡 指纹打卡膜 指纹打卡假膜人脸 打卡考勤指纹 指模具考勤 指纹打卡机指纹胶膜 指纹制作工具 指纹打卡 指纹识别套 硅胶 硅橡胶 指模 diy硅胶模具材料 指纹制作 指纹识别硅胶 指模自制 打卡指纹胶膜 指纹打卡假膜 指纹打卡道具 手机指纹打卡假膜 指纹假膜 指纹膜 指纹打卡假膜 硅橡胶 打卡机指纹识别膜 指纹识别模具 硅胶 指纹识别膜套 硅胶模具diy 打卡指纹透明膜 上班 打卡指纹透明膜 指纹识别胶打卡 硅胶 指纹识别打卡膜假手指 硅胶 考勤指纹胶 硅胶打卡 指纹胶膜制作 打卡 签到指纹胶膜制作 指纹 胶膜 指纹识别贴打卡abcdedf
使用杰卡德相似计算相似度0.7647在S2中加入abcdedf干扰字符串后相似度 0.6964
使用新加权算法计算相似度0.7305 在S2中加入abcdedf干扰字符串后相似度 0.7252
可见第二种算法针对这种无序的词组计算相似度抗干扰能力要比传统的方法强很多能够更稳点的计算类似的多来源文本的相似性。
具体的计算逻辑如下只计算了top20 除了上面的案例还有下面的各种场景都存在大量重复的文本集合我们需要有一种专门的方法来进行计算。
两个商家店铺所有商品名称集合一般一个店铺商品都有差不多
百度推广者的竞价词集合基本会穷举所有相关的搜索词
... ...
淘宝商家的推广词集合
我写了个函数实现也不知道叫啥就是一种加权的杰卡德相似。
S1 模具硅胶 翻模硅胶 指纹签到手指摸 指纹假膜 模具硅胶 液态硅胶 半透明硅胶 指模自制 指纹识别硅胶 打卡指纹透明膜 指纹膜 指纹 胶膜 手机指纹打卡假膜 指纹打卡机指纹胶膜 指纹识别贴打卡 diy硅胶模具材料 指纹打卡 指纹打卡道具 指纹打卡假膜人脸 指纹识别膜 硅胶 硅胶模具diy 模型制作材料 指模 液体硅胶 考勤指纹胶 指纹打卡假膜科密 指纹打卡假膜 硅橡胶 指纹胶膜制作 打卡 翻模硅胶材料 食品级硅胶 打卡考勤指纹 指模具考勤 翻模硅胶 diy 指纹打卡膜 指纹打卡假膜 打卡机指纹识别膜 指纹制作 diy液体材料 指纹制作工具 指模具 手指打卡 手办工具 签到指纹胶膜制作 模具硅胶翻模 翻模硅胶 指纹识别胶打卡 硅胶 硅胶打卡 打卡指纹胶膜 指纹识别膜套S2 指纹打卡假膜科密 指纹签到手指摸 指纹识别膜 硅胶 指模具 手指打卡 指纹打卡膜 指纹打卡假膜人脸 打卡考勤指纹 指模具考勤 指纹打卡机指纹胶膜 指纹制作工具 指纹打卡 指纹识别套 硅胶 硅橡胶 指模 diy硅胶模具材料 指纹制作 指纹识别硅胶 指模自制 打卡指纹胶膜 指纹打卡假膜 指纹打卡道具 手机指纹打卡假膜 指纹假膜 指纹膜 指纹打卡假膜 硅橡胶 打卡机指纹识别膜 指纹识别模具 硅胶 指纹识别膜套 硅胶模具diy 打卡指纹透明膜 上班 打卡指纹透明膜 指纹识别胶打卡 硅胶 指纹识别打卡膜假手指 硅胶 考勤指纹胶 硅胶打卡 指纹胶膜制作 打卡 签到指纹胶膜制作 指纹 胶膜 指纹识别贴打卡 abcdedf
from collections import Counter
class Similarty(): def __init__(self,S1,S2,topn):self.S1 S1self.S2 S2self.topn topn 标准杰卡德 def normal_jaccard(self):return len(set(self.S1)set(self.S2))/len(set(self.S1) | set(self.S2)) 加权杰卡德 def weight_jaccard(self): if self.S1 is not None and self.S2 is not None:sim_0 self.S1.replace( ,)sim_1 self.S2.replace( ,)collect0 Counter(dict(Counter(sim_0).most_common(self.topn)))collect1 Counter(dict(Counter(sim_1).most_common(self.topn))) jiao collect0 collect1bing collect0 | collect1 sim float(sum(jiao.values()))/float(sum(bing.values())) return(sim) else:return 0.0sim Similarty(S1,S2,50)#初始化
sim.normal_jaccard()
0.6964285714285714
sim.weight_jaccard()
0.7252396166134185
我这里为了简单仅仅分字进行的相似计算大家也可以自然语言分词计算也可以N-gram后计算稳定性会进一步加强。
好了本期内容分享到此了希望对你有启发。
有什么需求可以联系我。
下面是一些计算的案例 原文链接在此鸣谢小伍哥https://mp.weixin.qq.com/s?__bizMzA4OTAwMjY2Nwmid2650188043idx2sn2fd5d3e143050092ebbee5969a153852chksm88238ecfbf5407d9a0a31ba2d892f87214e7225becf25ec4c209a66e4283aa2c08b990bfb73cscene21#wechat_redirect