词语相似性比较,最容易想到的就是编辑距离,也叫做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)
}

应用的场景

这种词语之间的编辑距离主要应用在两个文本判断是否相近,比如我输入一个词,想要查找到数据库里面跟他最匹配的词。比如阿迪想要匹配到阿迪达斯,或者结账买单匹配到节帐埋单等等。不过在耐克nikenike耐克这种场景下就不适合了...

后续会介绍n-gram来计算相似性的方法,比较适合这种场景。

基于编辑距离来判断词语相似度方法(scala版)的更多相关文章

  1. 基于MATLAB的多项式数据拟合方法研究-毕业论文

    摘要:本论文先介绍了多项式数据拟合的相关背景,以及对整个课题做了一个完整的认识.接下来对拟合模型,多项式数学原理进行了详细的讲解,通过对文献的阅读以及自己的知识积累对原理有了一个系统的认识.介绍多项式 ...

  2. 基于Three.js的360X180度全景图预览插件

    基于Three.js的360X180度全景图预览插件 时间 2015-08-12 10:01:10  HTML5中国 原文  http://www.html5cn.org/article-8621-1 ...

  3. java环境中基于jvm的两大语言:scala,groovy

    一.java环境中基于jvm的两大语言:scala,groovy 可以在java项目里混编这两种语言: scala:静态语言,多范式语言,糅合了面向对象.面向过程:可以与java和net互操作:融汇了 ...

  4. 基于查表的整数霍夫变换方法实现(matlab)

    暂时先用matlab把算法弄一下,这是基于查表的整数霍夫变换方法实现及解释. 接着再实现FPGA的霍夫变换. 霍夫变换原理和算法这里不多说,可参考以下链接: http://blog.csdn.net/ ...

  5. 使用基于Apache Spark的随机森林方法预测贷款风险

    使用基于Apache Spark的随机森林方法预测贷款风险   原文:Predicting Loan Credit Risk using Apache Spark Machine Learning R ...

  6. 基于redis的处理session的方法

    一个基于redis的处理session的方法,如下. <?php class Session_custom { private $redis; // redis实例 private $prefi ...

  7. 基于Deep Learning 的视频识别方法概览

    深度学习在最近十来年特别火,几乎是带动AI浪潮的最大贡献者.互联网视频在最近几年也特别火,短视频.视频直播等各种新型UGC模式牢牢抓住了用户的消费心里,成为互联网吸金的又一利器.当这两个火碰在一起,会 ...

  8. C# 7.0 新特性1: 基于Tuple的“多”返回值方法

    本文基于Roslyn项目中的Issue:#347 展开讨论. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# 7.0 新特性3: ...

  9. 基于git命令的代码统计方法

    基于git命令的代码统计方法 没什么好说的,基于git log命令,使用前提是安装了git ...... .统计所有人代码量 统计所有人代码增删量,拷贝如下命令,直接在git bash等终端,git项 ...

随机推荐

  1. Shell编程基础篇-下

    1.1 条件表达式 1.1.1 文件判断 常用文件测试操作符 常用文件测试操作符 说明 -d文件,d的全拼为directory 文件存在且为目录则为真,即测试表达式成立 -f文件,f的全拼为file ...

  2. OpenStack搭建遇到的问题2(组件配置错误了,别重装全部,就把模块卸载就行了)

    apt-get remove -y mysql-server python-mysqldb 在装OpenStack的时候,出错的可能就是就是一个模块,比如keysstone或者是glance出错了,我 ...

  3. ASP.NET Core中的OWASP Top 10 十大风险-跨站点脚本攻击 (XSS)

    不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: https://dotnetcoretutorials.com/201 ...

  4. ngixn配置

    nginx 配置入门 之前的nginx配置是对nginx配置文件的具体含义进行讲解,不过对于nginx的新手可能一头雾水. 今天看到个文档不错,翻译过来分享给大家,可以让新手更详细地了解nginx配置 ...

  5. js 实现div模块的截图并下载功能(可制作长图)

    当需要实现html页面部分模块截图并具有保存图片功能时,前台直接生成截图并下载会方便的多.多的不说,直接看代码首先我们需要引入2个js文件: <script type="text/ja ...

  6. 一个简易的服务框架lsf

    项目地址:https://github.com/jianliu/lsf 主体思路是利用javaassist实现一个代理类,代理java的接口,实现每一个方法,实现的代码是对每个方法的名称.参数构建一个 ...

  7. Windows下Tomcat调优

    windows tomcat 优化 1.  tomcat conf server.xml 在server.xml中修改以一部分,增加节点数目,可以很好的提高性能: <Connector port ...

  8. spring,springmvc,mybatis基本整合(一)--xml文件配置方式(1)

    **这个整合.仅仅是最主要的整合,而且是xml配置文件的方式之中的一个,即当中的mybatis是採用非mapper接口的方式.(第二遍採用mapper接口方式.第三遍採用注解的方式:第四篇採用注解基于 ...

  9. myeclipse tomcat java.lang.OutOfMemoryError: PermGen space错误的解决方法

    错误代码: java.lang.OutOfMemoryError: PermGen space 原因分析: myeclipse或tomcat的内容分配的不够用,启动失败 解决方法: 1.找到tomca ...

  10. Comparable和Comparator的差别

    原文地址:http://leihuang.org/2014/11/16/Comparable-Vs-Comparator/ Comparable和Comparator都是用来实现集合中元素的比較.排序 ...