- 浏览: 1994589 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (651)
- ACE (35)
- BAT (9)
- C/C++ (116)
- fast-cgi (14)
- COM (27)
- python (59)
- CGI (4)
- C# (2)
- VC (84)
- DataBase (29)
- Linux (96)
- P2P (6)
- PHP (15)
- Web (6)
- Memcached (7)
- IME输入法 (11)
- 设计模式 (2)
- 搜索引擎 (1)
- 个人情感 (4)
- 笔试/面试 (3)
- 一亩三分地 (33)
- 历史 (2)
- 地理 (1)
- 人物 (3)
- 经济 (0)
- 不仅仅是笑哦 (43)
- 小故事大道理 (2)
- http://www.bjdsmyysjk120.com/ (0)
- http://www.bjdsmyy120.com/ (0)
- 它山之石可以攻玉 (15)
- 大学生你关注些什么 (28)
- 数据恢复 (1)
最新评论
-
luokaichuang:
这个规范里还是没有让我明白当浏览器上传文件时,STDIN的消息 ...
FastCGI规范 -
effort_fan:
好文章!学习了,谢谢分享!
com技术简介 -
vcell:
有错误os.walk(strPath)返回的已经是全部的文件和 ...
通过python获取目录的大小 -
feifeigd:
feifeigd 写道注意:文章中的CPP示例第二行 #inc ...
ATL入门:利用ATL编写简单的COM组件 -
feifeigd:
注意:文章中的CPP示例第二行 #include " ...
ATL入门:利用ATL编写简单的COM组件
LEVENSHTEIN DISTANCE(LD)-计算两字符串相似度算法
两字符串相似度计算方法有好多,现对基于编距的算法的相似度计算自己总结下。
简单介绍下Levenshtein Distance(LD):LD 可能衡量两字符串的相似性。它们的距离就是一个字符串转换成那一个字符串过程中的添加、删除、修改数值。
举例:
如果str1="test",str2="test",那么LD(str1,str2) = 0。没有经过转换。
如果str1="test",str2="tent",那么LD(str1,str2) = 1。str1的"s"转换"n",转换了一个字符,所以是1。
如果它们的距离越大,说明它们越是不同。
Levenshtein distance最先是由俄国科学家Vladimir Levenshtein在1965年发明,用他的名字命名。不会拼读,可以叫它edit distance(编辑距离)。
Levenshtein distance可以用来:
Spell checking(拼写检查)
Speech recognition(语句识别)
DNA analysis(DNA分析)
Plagiarism detection(抄袭检测)
LD用m*n的矩阵存储距离值。算法大概过程:
str1或str2的长度为0返回另一个字符串的长度。
初始化(n+1)*(m+1)的矩阵d,并让第一行和列的值从0开始增长。
扫描两字符串(n*m级的),如果:str1[i] == str2[j],用temp记录它,为0。否则temp记为1。然后在矩阵d[i][j]赋于d[i-1][j]+1 、d[i][j-1]+1、d[i-1][j-1]+temp三者的最小值。
扫描完后,返回矩阵的最后一个值即d[n][m]
最后返回的是它们的距离。怎么根据这个距离求出相似度呢?因为它们的最大距离就是两字符串长度的最大值。对字符串不是很敏感。现我把相似度计算公式定为1-它们的距离/字符串长度最大值。
源码: package com.chenlb.algorithm; /** * 编辑距离的两字符串相似度 * * @author chenlb 2008-6-24 下午06:41:55 */ public class Similarity { private int min(int one, int two, int three) { int min = one; if(two < min) { min = two; } if(three < min) { min = three; } return min; } public int ld(String str1, String str2) { int d[][]; //矩阵 int n = str1.length(); int m = str2.length(); int i; //遍历str1的 int j; //遍历str2的 char ch1; //str1的 char ch2; //str2的 int temp; //记录相同字符,在某个矩阵位置值的增量,不是0就是1 if(n == 0) { return m; } if(m == 0) { return n; } d = new int[n+1][m+1]; for(i=0; i<=n; i++) { //初始化第一列 d[i][0] = i; } for(j=0; j<=m; j++) { //初始化第一行 d[0][j] = j; } for(i=1; i<=n; i++) { //遍历str1 ch1 = str1.charAt(i-1); //去匹配str2 for(j=1; j<=m; j++) { ch2 = str2.charAt(j-1); if(ch1 == ch2) { temp = 0; } else { temp = 1; } //左边+1,上边+1, 左上角+temp取最小 d[i][j] = min(d[i-1][j]+1, d[i][j-1]+1, d[i-1][j-1]+temp); } } return d[n][m]; } public double sim(String str1, String str2) { int ld = ld(str1, str2); return 1 - (double) ld / Math.max(str1.length(), str2.length()); } public static void main(String[] args) { Similarity s = new Similarity(); String str1 = "chenlb.blogjava.net"; String str2 = "chenlb.iteye.com"; System.out.println("ld="+s.ld(str1, str2)); System.out.println("sim="+s.sim(str1, str2)); } }
发表评论
-
Berkeley DB 使用经验总结
2012-08-27 14:41 3018作者:陈磊 NoSQL是现在互联网Web2.0时代备受 ... -
嵌入式数据库系统Berkeley DB
2012-08-27 14:37 1465前言 UNIX/LINUX平台下的数据库种类非常多 ... -
C语言中标准输入流、标准输出流、标准错误输出流
2011-06-13 14:32 9188C语言中标准输入流、标准输出流、标准错误输出流 在 ... -
Rsync 实现原理
2011-05-12 20:06 8242Rsync 实现原理 前言 关于rsync的原始文档 ... -
c++简单的虚函数测试
2011-04-27 14:25 962#include <iostream> u ... -
C++文件行查找
2011-04-26 14:10 1342#include <iostream> # ... -
c++偏特化简单示例
2011-04-13 11:17 2100c++偏特化 // temp1.c ... -
GDB调试精粹及使用实例
2011-03-16 14:06 1069GDB调试精粹及使用实例 一:列文件清单 1. ... -
简单的ini文件解析
2011-02-12 16:36 1560int GetKeyVal(const string s ... -
scanf族函数高级用法
2011-01-25 16:00 2470如何解释 fscanf(fd,&quo ... -
使用scons替代makefile(1)
2011-01-25 11:58 3631早在多年前我刚开始接触linux下的C程序时,经常被makef ... -
使用scons替代makefile(2)
2011-01-25 11:57 3519本篇文章接着上一篇进一步介绍scons的使用方法,主要介绍静态 ... -
使用scons替代makefile(3)
2011-01-25 11:55 4768在上两篇文章中已经简单介绍了用scons编译库文件,可执行程序 ... -
C 支持动态添加测试数据的测试代码
2011-01-13 17:22 1069/下面的定义为了支持可扩增。 //当需要增加一个新的测试用列 ... -
Linux下Makefile的automake生成
2010-12-28 16:55 1039******************helloworld.c* ... -
SCons笔记(详细版)
2010-12-23 16:11 103581. 基本使用 SConstruct文件就功能而言相当于Ma ... -
scons 学习
2010-12-23 11:14 2103scons 学习 作者:Sam(甄峰) sam_code@h ... -
scons随笔
2010-12-22 20:20 4631scons随笔 Scons是新一代的软件构件工具,或者说ma ... -
Scons在linux下的安装和使用
2010-12-21 11:59 3190因为正在用的一个开源软件需要的Developm ... -
排列组合的实现
2010-12-20 12:41 1002简单算法: 从前往后(或者从后往前)每次交换一个位置。当存在 ...
相关推荐
Levenshtein Distance--求字符串的相似程度的算法,文件用IE6可以打开。
Levenshtein:快速计算编辑距离以及字符串的相似度
Levenshtein Distance-两字符串相似度计算...
Levenshtein算法python也是用的这个对比字符串相似度的,还不错
比较两个字符串的相似度,利用Levenshein算法计算出两个字符串的最小编辑距离,根据最小编辑距离得出相似度,例如: 字符串1:1234 字符串2:51234,则他们的相似度为:4/5。
两个字符串的相似度算法实现——编辑距离之Levenshtein距离
C#,字符串相似度的莱文斯坦距离(Levenshtein Distance)算法与源代码 莱文斯坦距离(Levenshtein Distance)用于衡量两个字符串之间的相似度。 莱文斯坦距离以俄国科学家(Vladimir I. Levenshtein)命名,他于...
NULL 博文链接:https://biansutao.iteye.com/blog/326008
“成本”列给出了计算成本的估算值,以分别计算长度为m和n的两个字符串之间的相似度。 归一化? 公制? 类型 成本 典型用法 距离 没有 是 O(米* n) 1 距离相似 是 没有 O(米* n) 1 距离 没有 没有 O(米* n...
python_Levenshtein-0.12.2-cp39-cp39-win32
一个实现不同字符串相似度和距离度量的库。目前实现了十几种算法(包括 Levenshtein 编辑距离和兄弟、Jaro-Winkler、最长公共子序列、余弦相似度等)。查看下面的汇总表以获取完整列表... python字符串相似度 下载 ...
python_Levenshtein-0.12.2-cp38-cp38-win_amd64
标签:airavata-levenshtein-distance-service-0.9.jar,airavata,levenshtein,distance,service,0.9,jar包下载,依赖包
python_Levenshtein-0.12.2-cp39-cp39-win_amd64
标签:airavata-levenshtein-distance-service-0.5.jar,airavata,levenshtein,distance,service,0.5,jar包下载,依赖包
标签:airavata-levenshtein-distance-service-0.11.jar,airavata,levenshtein,distance,service,0.11,jar包下载,依赖包
标签:airavata-levenshtein-distance-service-0.8.jar,airavata,levenshtein,distance,service,0.8,jar包下载,依赖包
标签:airavata-levenshtein-distance-service-0.7.jar,airavata,levenshtein,distance,service,0.7,jar包下载,依赖包
标签:airavata-levenshtein-distance-service-0.10.jar,airavata,levenshtein,distance,service,0.10,jar包下载,依赖包