工作过程中,常常其他业务的同学问到:某两个词的相似度是多少?某两个句子的相似度是多少?某两个文档之间的相似度是多少?在本文中,我们讨论一下jaccard与cosine在文本相似度上的差异,以及他们适用的场景。在介绍二者的异同之前呢,我们首先介绍一下,jaccard相似度和cosine相似度的定义。

(想直接看结论的,请关注文末的加粗部分)

Jaccard相似度

Jaccard相似度的定义很简单,两个句子词汇的交集size除以两个句子词汇的并集size。举个例子来说:句子1: AI is our friend and it has been friendly.

句子2: AI and humans have always been friendly.

为了计算Jaccard相似度,我们首先使用英文nlp中常用的技术Lemmatization,用词根替换那些具有相同词根的词汇。在上面的例子中,friend和friendly具有相同的词根,have和has具有相同的词根。我们可以画出两个句子词汇的交集与并集情况,如图所示:

对于上面两个句子,其Jaccard相似度为5/(5+3+2)=0.5,即两个句子词汇的交集5个词汇,并集10个词汇。

def get_jaccard_sim(str1, str2):

a = set(str1.split())

b = set(str2.split())

c = a.intersection(b)

return float(len(c)) / (len(a) + len(b) - len(c))

值得注意的是,句子1中包含了两个friend,但这并不影响我们计算相似度,但这会影响cosine相似度。先让我们回忆一下cosine相似度的定义,公式如下。

cosine相似度是通过计算两个向量之间的夹角,来评价两个向量的相似度。

既然cosine相似度是使用向量计算的,我们就要先将句子文本转换为相应的向量。将句子转换为向量的方式有很多,最简单的一种就是使用bag of words计算的TF(term frequency)和TF-IDF(term frenquency-inverse document frequency)。哪一钟转换方法更好呢?实际上,两个方法各有各的应用场景。当我们要大概估计文本相似度时,使用TF就可以了。当我们使用文本相似度进行检索的类似场景时(如搜索引擎中的query relevence的计算),此时TF-IDF更好一些。

当然,我们也可以使用word2vec或者使用自定义的词向量来讲句子转换成向量。这里简单介绍一下tf-idf和word embedding的异同: - 1. tf/tf-idf为每一个词汇计算得到一个数字,而word embedding将词汇表示成向量 - 2. tf/tf-idf在文本分类的任务中表现更好一些,而word embedding的方法更适用于来判断上下文的语义信息(这可能是由word embedding的计算方法决定的)。

对于如何计算cosine similarity,我们还是试用上面的例子:句子1: AI is our friend and it has been friendly.

句子2: AI and humans have always been friendly.

计算cosine similarity的过程,分位以下几个步骤:

第一步

使用bag of words的方式计算term frequency,下图展示了word frequency的统计结果。

第二步

term frequency的问题在于,较长的句子里的词汇term frequency会更高一些。为了解决这个问题,我们可以使用归一化的方法(Normlization,如L2-norm)来去掉句子长度的影响。操作如下:首先对各个词汇的frequency平方求和,然后再开方。如果使用L2-norm,那么句子1的值为3.3166,而句子2的值为2.6458。用每一个词的term frquency除以这些norm的值,就可以得到如下结果:

第三步

上一步中,我们将句子向量的模归一化为1,就可以受用点乘的方法计算得到cosine相似度: Cosine Similarity = (0.3020.378) + (0.6030.378) + (0.3020.378) + (0.3020.378) + (0.302*0.378) = 0.684

所以两个句子的cosine相似度为0.684,而Jaccard相似度的结果是0.5。计算cosine相似度的python代码如下:

from collections import Counter

from sklearn.feature_extraction.text import CountVectorizer

from sklearn.metrics.pairwise import cosine_similarity

def get_cosine_sim(*strs):

vectors = [t for t in get_vectors(*strs)]

return cosine_similarity(vectors)

def get_vectors(*strs):

text = [t for t in strs]

vectorizer = CountVectorizer(text)

vectorizer.fit(text)

return vectorizer.transform(text).toarray()

总结一下,Jaccard和cosine相似度的区别是什么呢?应该有以下几点:

- Jaccard使用的是集合操作,句子的向量长度由两个句子中unique的词汇数目决定,而cosine相似度使用的向量大小由词向量的维度决定。

- 上面的结论意味着什么呢?假设friend这个词汇在句子1中重复了非常多次,cosine相似度会发生变化,而Jaccard相似度的值不会变。让我们做个简单的计算,若句子1中的friend一词重复50次,cosine相似度会降为0.4,而Jaccard相似度保持0.5不变。

- 基于上述的结论,Jaccard相似度适用于什么场景呢?假设某个业务场景的文本包含了很多重复性的词汇,而这些重复是否与我们想做的任务关系不大,那么在分析文本相似度时,使用Jaccard计算相似度即可,因为对于Jaccard相似度来说,重复不会产生影响;假设这种重复对我们想做的任务影响很大,那么就要使用cosine相似度。

最后,这里列举了两个具体的应用场景,供大家思考。仅仅对Jaccard和cosine相似度来说:

1. 在京东、天猫的商品搜索栏,使用什么相似度最好呢?

2. 对语音转写文本的相似度,哪个更好呢?

如果觉得文章对您有帮助,可以关注本人的微信公众号:机器学习小知识

python余弦相似度文本分类_Jaccard与cosine文本相似度的异同相关推荐

  1. R语言构建文本分类模型并使用LIME进行模型解释实战:文本数据预处理、构建词袋模型、构建xgboost文本分类模型、基于文本训练数据以及模型构建LIME解释器解释多个测试语料的预测结果并可视化

    R语言构建文本分类模型并使用LIME进行模型解释实战:文本数据预处理.构建词袋模型.构建xgboost文本分类模型.基于文本训练数据以及模型构建LIME解释器解释多个测试语料的预测结果并可视化 目录

  2. jaccard相似度_Jaccard与cosine文本相似度的异同

    工作过程中,常常其他业务的同学问到:某两个词的相似度是多少?某两个句子的相似度是多少?某两个文档之间的相似度是多少?在本文中,我们讨论一下jaccard与cosine在文本相似度上的差异,以及他们适用 ...

  3. python 文本分类卡方检验_中文文本分类:你需要了解的10项关键内容

    文本分类指的是计算机通过算法对输入的文本按照一定的类目体系进行自动化归类的过程.在人工智能浪潮席卷全球的今天,文本分类技术已经被广泛地应用在文本审核.广告过滤.情感分析和反黄识别等NLP领域.本文从达 ...

  4. 深度学习文本分类在支付宝投诉文本模型上的应用

    摘要: 小蚂蚁说: 随着深度学习的快速发展,以及在图像.语音领域取得的不错成果,基于深度学习的自然语言处理技术也日益受到人们的关注.计算机是怎么理解人类的语言的呢? 传统机器学习的应用,常常是利用上述 ...

  5. NLP(新闻文本分类)——基于机器学习的文本分类

    文本表示方法 在机器学习算法的训练过程中,假设给定NNN个样本,每个样本有MMM个特征,这样组成了N×MN×MN×M的样本矩阵,然后完成算法的训练和预测.同样的在计算机视觉中可以将图片的像素看作特征, ...

  6. 干货解析|深度学习文本分类在支付宝投诉文本模型上的应用

    小蚂蚁说: 随着深度学习的快速发展,以及在图像.语音领域取得的不错成果,基于深度学习的自然语言处理技术也日益受到人们的关注.计算机是怎么理解人类的语言的呢? 传统机器学习的应用,常常是利用上述人工总结 ...

  7. 文本分类模型_【文本分类】几个可作为Baseline的模型

    点击上方,选择星标或置顶,每天给你送干货! 阅读大概需要9分钟 跟随小博主,每天进步一丢丢 来自:AINLP 作者:老宋的茶书会 知乎专栏:NLP与深度学习 研究方向:自然语言处理 前言 最近,从Te ...

  8. 文本分类(1)-文本预处理

    在进行文本分类之前,需要对文本进行预处理.中文文本和英文文本预处理的方式有所差别. (1)英文文本预处理 文本预处理过程大致分为以下几点: 1.英文缩写替换 预处理过程中需要把英文缩写进行替换,如it ...

  9. 人工智能NLP自然语言之基础篇文本分类pytorch-transformers实现BERT文本分类bert

    一.数据集介绍 中文文本分类数据集 数据来源: 今日头条客户端 数据格式: 6554695793956094477_!_110_!_news_military_!_「欧洲第一陆军」法兰西帝国的欧陆霸权 ...

最新文章

  1. 1. Action 实现 ModelDriven 接口后的运行流程
  2. 50条超精辟的经典语录:哗众,可以取宠,也可以失宠!
  3. 【转】WebSocket API总结
  4. 学习JavaScript数据结构与算法-----pdf 分享
  5. Unity3D开发游戏世界天空盒
  6. 为前端而生的编辑器Brackets及配置推荐
  7. 每日算法系列【EOJ 3031】二进制倒置
  8. SharePoint 2007部署过程详细图解(上)— 前期环境搭建
  9. C语言的酒店客房管理系统
  10. 【英语语法入门】 第22讲 完成时
  11. linux 路由器 限速,Linux服务器限速WonderShaper使用方法 | 陌小九
  12. 1003【顺序结构】A+B 问题
  13. SDN与NFV技术在云数据中心的规模应用
  14. JAR包中的MANIFEST.MF文件详解以及编写规范
  15. 群晖nas免费内网穿透,实现外网异地远程访问
  16. Pycharm2018永久破解方法
  17. distill_bert和tiny_bert
  18. 图形学基础笔记III:图形管线中的多边形裁剪算法、Sutherland-Hodgman、Guard Band Clipping
  19. SAP SuccessFactors EC学习笔记(二)解码员工数据对象
  20. Android点击WebView中的图片查看大图

热门文章

  1. Python使用numpy包编写自定义函数计算均方误差(MSE、mean squared error)、评估回归模型和时间序列模型、解读MSE评估指标
  2. R语言ggplot2可视化绘制累积计数图(累加图,cumulative counts)
  3. python批量重命名指定目录下所有文件的后缀名
  4. 层次聚类定义、层次聚类过程可视化、簇间距离度量、BIRCH、两步聚类、BIRCH算法优缺点
  5. 通过交叉验证(Cross Validation)KFold绘制ROC曲线并选出最优模型进行模型评估、测试、包含分类指标、校准曲线、混淆矩阵等
  6. 机器学习的核心要素是什么?它们分别作了什么工作?
  7. 服务器安装使用rstudio-server
  8. vs怎么编译php文件,vscode怎么初始编译
  9. KDT 对比 DDT 小栗子
  10. 揭晓你所不了解的第三代测序技术