一文讲述常见的文本相似度计算方法
云栖号资讯:【点击查看更多行业资讯】
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!
前言
在自然语言处理中,我们经常需要判定两个东西是否相似。
比如,在微博的热点话题推荐那里,我们需要比较微博之间的相似度,让相似度高的微博聚集在一起形成一个簇,提出一个主题。
在问答系统中,比如说人工客服,我们需要提前准备好问题和一些答案,让用户输入的问题与题库中的问题进行相似度的比较,最后输出答案。
在推荐系统中,我们需要提取一个用户的所有物品,在根据这个物品找到对应的用户群,比较两个用户之间的相似性,在进行相应的推荐(协同过滤)。
在对语料进行预处理的时候,我们需要给予文本的相似度,把相似度高的重复主题过滤掉。
总之,相似度是一种非常有用的工具,可以帮助我们解决很多问题。
任务目标
一般来说,是比较两个物体(商品,文本)之间的相似度。这里的相似度是一个抽象的值,它可以抽象成估计的百分比。
在推荐工程中,计算相似度是为了给用户推送一定量的物品。即把所有的相似度排序,然后选出最高的那几个物品。
人是很容易判断出物品的相似度的,人们会在心里有一个考量。那么程序如何判断呢?
如果是文本分析,它首先就要用到分词技术,然后去掉不必要的词(语气词,连接词)。然后对词给一个抽象的量表示权重,最后在用一些方法去统计出整体的相似度。
如果是其他的,可能首先也需要进行数据清洗的工作,留下那些关键的能够表示物体特征的部分,对这些部分定权值,再去估计整体。
- 相似度计算关键组件
相似度计算方法有2个关键组件:
- 表示模型
- 度量方法
前者负责将物体表示为计算机可以计算的数值向量,也就是提供特征。
后者负责基于前面得到的数值向量计算物体之间的相似度。
- 距离的度量方式
欧几里得距离
使用python计算欧式距离:
distance = numpy.linalg.norm(vec1 - vec2)
相似度为:
similarity = 1.0/(1.0 + np.linalg.norm(dataA - dataB))
余弦距离
余弦距离的计算方式:
与欧氏距离的区别:
欧氏距离能够体现个体数值特征的绝对差异,所以更多的用于需要从维度的数值大小中体现差异的分析,如使用用户行为指标分析用户价值的相似度或差异。
余弦距离更多的是从方向上区分差异,而对绝对的数值不敏感,更多的用于使用用户对内容评分来区分兴趣的相似度和差异,同时修正了用户间可能存在的度量标准不统一的问题(因为余弦距离对绝对数值不敏感)
Jacard相似度
distance = 1 / similarity
思想非常简单,两个集合共有的元素越多,二者越相似。
- 汉明距离
两个字码中不同位值的数目称为汉明距离。
- Hamming distance = 0 (ai = bi)
- Hamming distance = 1 (ai != bi)
最后统计相加。
- 最小编辑距离
最小编辑距离是一种经典的距离计算方法,用来度量字符串之间的差异。它认为,将字符串A不断修改(增删改)、直至成为字符串B,所需要的修改次数代表了字符串A和B的差异大小。当然了,将A修改为B的方案非常多,选哪一种呢?我们可以用动态规划找到修改次数最小的方案,然后用对应的次数来表示A和B的距离。
【云栖号在线课堂】每天都有产品技术专家分享!
课程地址:https://yqh.aliyun.com/zhibo立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK
原文发布时间:2020-03-17
本文作者:LU_ZHAO
本文来自:“AI科技大本营公众号”,了解相关信息可以关注“AI科技大本营”
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
前端工程师眼中的Docker
前端工程师眼中的Docker笔者最近在整理Node.js操作各数据库的方法,却不料遇到一个很棘手的问题:很多数据库,都需要同时下载Server端和Client端,并进行相应的配置,着实是麻烦。那有没有方法可以省去这些步骤呢? 答案肯定是有的,这就是今天要介绍的主题 ——Docker。 Docker 概述那Docker是什么呢? 通俗地讲,当我们部署代码到生产服务器时,第一次都需要先进行环境配置,比如你有100台机器,你就要手动配置100台服务器的环境,这样难保不会出错。Docker则将软件服务制作成标准化的模板,也就是镜像,从而实现快捷部署。每次部署新机器,只需要拉取相关镜像,即可一键完成。 Docker官方提供了很多标准镜像,涵盖MySQL、MongoDB、Node.js等常见开源软件。此外,开发者也可以在已有镜像的基础上,打造属于自己的定制化镜像。 接下来以MySQL为例,快速入坑Docker。 镜像和镜像库那么如何获取镜像呢? Docker镜像一般存储在镜像库(registry) 中。Docker Hub和Docker Cloud是公共镜像库,任何人均可使用。Docker默认使用...
- 下一篇
如何快速高效率地学习Go语言
如何快速高效率地学习Go语言要想快速高效率地掌握Go语言,关键是要通过不断写代码去训练,熟能生巧。方法是没问题的,但具体的路径呢?就像开车,能不能给个导航?我希望这篇文章能起到一个导航的作用,这里提供的路径,应该对很多人都适合。当然每个人的具体情况不同,因此路径会有差异。你可以对这个路径进行剪裁,得到最适合自己的。 目标(快速,高效率):短时间和高效率是这里的关键词。其实只要你每天用Go来编写程序,时间一长,也就掌握了,它不需要任何技巧,大智若愚,实际上是一个不错的办法。但如果你想最快地掌握Go语言,还是需要一些技巧的。 我以前也曾经学过一段Go,大概花了2周,基本的会了,但远远没有达到掌握的程度。后来因为有其他事情就放下了。现在回想起来,当时方法不对,效果也不好。后来用我现在要讲的方法,在不到2个月的时间完全掌握了Go语言。这也得益于我以前对Java比较熟。 最终结果(掌握Go语言):什么叫完全掌握Go语言?下面是我的标准: 对语言本身已掌握,可以直接在键盘上敲程序给你一个项目,你大致有思路应该怎么做,知道要从那下手而且能比较顺畅地做出来。其中#2又包括两点: 2.1. 熟悉常用的架...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Red5直播服务器,属于Java语言的直播服务器
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS关闭SELinux安全模块
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7