基于编辑距离来判断词语相似度方法(scala版)
词语相似性比较,最容易想到的就是编辑距离,也叫做Levenshtein Distance算法。在Python中是有现成的模块可以帮助做这个的,不过代码也很简单,我这边就用scala实现了一版。
编辑距离
编辑距离是指一个字符串改编成另一个字符串的最短距离,它描述了两个字符串的相近程度。比如:
son -> sun ,只需要把o改成u即可,编辑距离为1
xing -> long,需要把x改成l,i改成o,编辑距离为2
o->long,需要在前面加上l,在后面加上ng,编辑距离为3
因此所有修改,移动,删除,新增都算是一次编辑操作。
算法很简单:
初始化
| - | x | i | n | g |
|---|---|---|---|---|
| - | 0 | 1 | 2 | 3 |
| l | 1 | 0 | 0 | 0 |
| o | 2 | 0 | 0 | 0 |
| n | 3 | 0 | 0 | 0 |
| g | 4 | 0 | 0 | 0 |
挨个计算值
某个位置的值,等于它
- 左边的值+1,
- 右边的值+1,
- 左上角的值不同时加1;相同时加0
上面三个数的最小值
| - | x | i | n | g |
|---|---|---|---|---|
| - | 0 | 1 | 2 | 3 |
| l | 1 | 1 | 0 | 0 |
| o | 2 | 0 | 0 | 0 |
| n | 3 | 0 | 0 | 0 |
| g | 4 | 0 | 0 | 0 |
一直计算到右下角的值
| - | x | i | n | g |
|---|---|---|---|---|
| - | 0 | 1 | 2 | 3 |
| l | 1 | 1 | 2 | 3 |
| o | 2 | 2 | 2 | 3 |
| n | 3 | 3 | 3 | 2 |
| g | 4 | 4 | 4 | 3 |
Breeze
在python中有numpy可以做矩阵的各种操作,在scala中可以使用breeze,spark mllib底层也是基于它实现的。
文档参考:
https://github.com/scalanlp/breeze/wiki/Quickstart
常用的操作有:
创建为0的的矩阵:
DenseMatrix.zeros[Int](s1_length, s2_length)
breeze另一个很好用的地方就是默认支持修改,在scala中很多集合默认都是不可变的,比如Array,很烦~
算法实现
def editDist(s1:String, s2:String):Int ={
val s1_length = s1.length+1
val s2_length = s2.length+1
val matrix = DenseMatrix.zeros[Int](s1_length, s2_length)
for(i <- 1.until(s1_length)){
matrix(i,0) = matrix(i-1, 0) + 1
}
for(j <- 1.until(s2_length)){
matrix(0,j) = matrix(0, j-1) + 1
}
var cost = 0
for(j <- 1.until(s2_length)){
for(i <- 1.until(s1_length)){
if(s1.charAt(i-1)==s2.charAt(j-1)){
cost = 0
}else{
cost = 1
}
matrix(i,j)=math.min(math.min(matrix(i-1,j)+1,matrix(i,j-1)+1),matrix(i-1,j-1)+cost)
}
}
matrix(s1_length-1,s2_length-1)
}
应用的场景
这种词语之间的编辑距离主要应用在两个文本判断是否相近,比如我输入一个词,想要查找到数据库里面跟他最匹配的词。比如阿迪想要匹配到阿迪达斯,或者结账买单匹配到节帐埋单等等。不过在耐克nike跟nike耐克这种场景下就不适合了...
后续会介绍n-gram来计算相似性的方法,比较适合这种场景。
基于编辑距离来判断词语相似度方法(scala版)的更多相关文章
- 基于MATLAB的多项式数据拟合方法研究-毕业论文
摘要:本论文先介绍了多项式数据拟合的相关背景,以及对整个课题做了一个完整的认识.接下来对拟合模型,多项式数学原理进行了详细的讲解,通过对文献的阅读以及自己的知识积累对原理有了一个系统的认识.介绍多项式 ...
- 基于Three.js的360X180度全景图预览插件
基于Three.js的360X180度全景图预览插件 时间 2015-08-12 10:01:10 HTML5中国 原文 http://www.html5cn.org/article-8621-1 ...
- java环境中基于jvm的两大语言:scala,groovy
一.java环境中基于jvm的两大语言:scala,groovy 可以在java项目里混编这两种语言: scala:静态语言,多范式语言,糅合了面向对象.面向过程:可以与java和net互操作:融汇了 ...
- 基于查表的整数霍夫变换方法实现(matlab)
暂时先用matlab把算法弄一下,这是基于查表的整数霍夫变换方法实现及解释. 接着再实现FPGA的霍夫变换. 霍夫变换原理和算法这里不多说,可参考以下链接: http://blog.csdn.net/ ...
- 使用基于Apache Spark的随机森林方法预测贷款风险
使用基于Apache Spark的随机森林方法预测贷款风险 原文:Predicting Loan Credit Risk using Apache Spark Machine Learning R ...
- 基于redis的处理session的方法
一个基于redis的处理session的方法,如下. <?php class Session_custom { private $redis; // redis实例 private $prefi ...
- 基于Deep Learning 的视频识别方法概览
深度学习在最近十来年特别火,几乎是带动AI浪潮的最大贡献者.互联网视频在最近几年也特别火,短视频.视频直播等各种新型UGC模式牢牢抓住了用户的消费心里,成为互联网吸金的又一利器.当这两个火碰在一起,会 ...
- C# 7.0 新特性1: 基于Tuple的“多”返回值方法
本文基于Roslyn项目中的Issue:#347 展开讨论. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# 7.0 新特性3: ...
- 基于git命令的代码统计方法
基于git命令的代码统计方法 没什么好说的,基于git log命令,使用前提是安装了git ...... .统计所有人代码量 统计所有人代码增删量,拷贝如下命令,直接在git bash等终端,git项 ...
随机推荐
- CCF-201312-2-ISBN号码
问题描述 试题编号: 201312-2 试题名称: ISBN号码 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包 ...
- 简介CentOS与 Ubuntu的不同
1.关于登录用户 centos可以使用root登录 ubuntu不能使用root登录 centos普通用户默认不能通过sudo取得root权限执行命令, ubuntu可以,centos需要sudo时 ...
- Asp.Net下,基于Jquery的Ajax二级联动
最近做一个项目,要求实现二级联动效果.背景为:通过学院的选择,联动出专业选项.起初想直接用微软的控件实现Ajax效果,但是DropDownList控件会自动触发PostBack,在后台根本就不好控制, ...
- 在学java继承中
看到一片个人认为的好博客,http://www.cnblogs.com/dolphin0520/p/3803432.html ;这一节看的比较慢,加油,就是干: 分类不好意思分到Java中,嘿嘿还 ...
- 大数据学习系列之三 ----- HBase Java Api 图文详解
版权声明: 作者:虚无境 博客园出处:http://www.cnblogs.com/xuwujing CSDN出处:http://blog.csdn.net/qazwsxpcm 个人博客出处:http ...
- oracle 恢复数据到某个时间点
delete from tablename;insert into tablename select * from tablename as of timestamp to_timestamp('20 ...
- javascript设计模式——装饰者模式
前面的话 在程序开发中,许多时候都并不希望某个类天生就非常庞大,一次性包含许多职责.那么可以使用装饰者模式.装饰者模式可以动态地给某个对象添加一些额外的职责,而不会影响从这个类中派生的其他对象.本文将 ...
- 浏览器抓包(post)
谁能想到我写的第一个wp竟然是个web题??? 以Geek2017_Buy me a Tesla 为例 来看看题目 emmmm有理想还是很好的,火狐打开(事实证明FF对web题是最友好的) 能点的地方 ...
- webrtc视频数据render流程
- 如何在Raspberry Pi 3B中安装RASPBIAN
RASPBIAN简介 RASPBIAN是树莓派官方支持的基于Debian的Linux系统.RASPBIAN预装了很多常用的组件,使用起来十分方便. 官方有RASPBIAN STRETCH WITH D ...