`

java 两字符串相似度计算算法

    博客分类:
  • Java
 
阅读更多
http://itindex.net/detail/46929-java-%E5%AD%97%E7%AC%A6%E4%B8%B2-%E7%9B%B8%E4%BC%BC
Levenshtein distance最先是由俄国科学家Vladimir Levenshtein在1965年发明,用他的名字命名。不会拼读,可以叫它edit distance(编辑距离)。 

原理很简单,就是返回将第一个字符串转换(删除、插入、替换)成第二个字符串的编辑次数。次数越少,意味着字符串相似度越高 

    Levenshtein distance可以用来: 

Spell checking(拼写检查) 
Speech recognition(语句识别) 
DNA analysis(DNA分析) 
Plagiarism detection(抄袭检测) 
LD用m*n的矩阵存储距离值。算法大概过程: 
Demo1:
/**  
* 编辑距离的两字符串相似度  
*  
* @author jianpo.mo  
*/  
public class SimilarityUtil {  

    private static int min(int one, int two, int three) {  
        int min = one;  
        if(two < min) {  
            min = two;  
        }  
        if(three < min) {  
            min = three;  
        }  
        return min;  
    }  
     
    public static 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 static 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) {  
        
        String str1 = "chenlb.blogjava.net";  
        String str2 = "chenlb.javaeye.com";  
        System.out.println("ld="+ld(str1, str2));  
        System.out.println("sim="+sim(str1, str2));  
    }  
}



Demo2:
public class LevenshteinDistance {
	public static void main(String[] args){
		String str1 = "i5rrrvan1";
        String str2 = "ittvan2";
        System.out.println("字符串1 {0}:"+str1);
 
        System.out.println("字符串2 {0}:"+str2);
 
        System.out.println("相似度 {0} %:"+ new LevenshteinDistance().LevenshteinDistancePercent(str1, str2) * 100);          
 
	}
 
        private int LowerOfThree(int first, int second, int third)
        {
            int min = Math.min(first, second);
 
            return Math.min(min, third);
        }
 
        private int Levenshtein_Distance(String str1, String str2)
        {
            int[][] Matrix;
            int n = str1.length();
            int m = str2.length();
 
            int temp = 0;
            char ch1;
            char ch2;
            int i = 0;
            int j = 0;
            if (n == 0)
            {
                return m;
            }
            if (m == 0)
            {
 
                return n;
            }
            Matrix = new int[n + 1][ m + 1];
 
            for (i = 0; i <= n; i++)
            {
                //初始化第一列
                Matrix[i][ 0] = i;
            }
 
            for (j = 0; j <= m; j++)
            {
                //初始化第一行
                Matrix[0][j] = j;
            }
 
            for (i = 1; i <= n; i++)
            {
                ch1 = str1.charAt(i - 1);
                for (j = 1; j <= m; j++)
                {
                    ch2 = str2.charAt(j-1);
                    if (ch1==ch2)
                    {
                        temp = 0;
                    }
                    else
                    {
                        temp = 1;
                    }
                    Matrix[i][j] = LowerOfThree(Matrix[i - 1][ j] + 1, Matrix[i][ j - 1] + 1, Matrix[i - 1][j - 1] + temp);
                }
            }
 	   for (i = 0; i <= n; i++)
            {
                for (j = 0; j <= m; j++)
                {
                	System.out.println(" {0} :"+Matrix[i][j]);
                }
                System.out.println("");
            }
 
            return Matrix[n][ m];
        }
 
 
        public double LevenshteinDistancePercent(String str1, String str2)
        {
            //int maxLenth = str1.Length > str2.Length ? str1.Length : str2.Length;
            int val = Levenshtein_Distance(str1, str2);
            return 1 - (double)val / Math.max(str1.length(), str2.length());
        }
}
分享到:
评论
1 楼 HEZR曾嶸 2018-08-28  
你好博主,这个不是很理解,能解释一下嘛

//左边+1,上边+1, 左上角+temp取最小   
d[i][j] = min(d[i-1][j]+1, d[i][j-1]+1, d[i-1][j-1]+temp);

相关推荐

    字符串相似度算法 字符串相似度算法 字符串相似度算法

    字符串相似度算法是一种衡量两个字符串之间相似度的方法,广泛应用于自然语言处理、数据挖掘、机器学习等领域。在本文中,我们将讨论一种常用的字符串相似度算法:Levenshtein Distance。 什么是Levenshtein ...

    java 计算字符串相似度

    java 计算字符串相似度

    Java 推荐系统 字符串 余弦相似度 算法

    根据给定的文件信息,本文将详细介绍如何使用Java实现基于字符串的余弦相似度算法,并应用于推荐系统中。 ### 一、引言 在推荐系统领域,为了衡量两个字符串之间的相似性,通常会采用多种算法,其中余弦相似度算法...

    java字符串相似度算法

    Java字符串相似度算法是用于衡量两个字符串之间相似程度的一种计算方法。在文本处理、信息检索、数据清洗等领域中,这种算法具有重要的应用价值。这里主要介绍了一种基于Levenshtein距离的Java实现。 Levenshtein...

    LD的两字符串相似度计算.zip

    在这个"LD的两字符串相似度计算.zip"压缩包中,可能包含了一个名为"readme.txt"的文件,它可能解释了如何使用这个算法或者给出了一个示例。另外,"com"可能是程序代码的组成部分,可能是一个Python、Java或其他编程...

    Java之词义相似度计算(语义识别、词语情感趋势、词林相似度、拼音相似度、概念相似度、字面相似度)

    Java可以通过Pinyin4j库转换汉字为拼音,然后使用Levenshtein距离或其他字符串相似度算法比较拼音的相似度。 **概念相似度**涉及到更高层次的语义理解,通常基于本体论或知识图谱。Java的OWL API可以处理OWL(Web ...

    基于Hadoop的文本相似度计算

    基于Hadoop的文本相似度计算是一个重要的应用,常用于信息检索、推荐系统和文档分类等场景。在这个项目中,我们利用TF-IDF(词频-逆文档频率)和向量空间模型来计算文本之间的相似性,同时采用IKAnalyzer作为中文...

    Java基于余弦方法实现的计算相似度算法示例

    "Java基于余弦方法实现的计算相似度算法示例" 本文主要介绍了Java基于余弦方法实现的计算相似度算法,简单说明了余弦相似性的概念、...通过这种算法,我们可以计算两个字符串之间的相似度,从而应用于文件比较等领域。

    java-string-similarity:一个Java库,实现了几种计算字符串之间相似度的算法

    ,用于计算两个字符串之间的归一化距离或相似度分数。 0.0 分表示两个字符串绝对不相似,1.0 表示绝对相似(或相等)。 介于两者之间的任何内容都表示两个字符串的相似程度。例子在这个简单的例子中,我们想要计算...

    Java错误堆栈相似度计算.pdf

    传统的字符串相似度比较算法,如最长公共子串算法(LCS)、Levenshtein Distance(编辑距离)和汉明距离(Hamming Distance),不能很好地衡量Java错误堆栈之间的相似度。Java错误堆栈具有其自身的特点,需要一种...

    使用Java实现的计算两字符串相似度+最长公共子序列.zip

    总结起来,这个Java项目提供了计算两个字符串相似度的方法,主要利用了最长公共子序列的概念和动态规划算法。通过理解并实现这个项目,开发者可以增强对字符串处理、动态规划以及相似度计算的理解,这对进行文本分析...

    Java字符串相似度:各种字符串相似度和距离算法的实现:Levenshtein,Jaro-winkler,n-Gram,Q-Gram,Jaccard索引,最长公共子序列编辑距离,余弦相似度..

    Java字符串相似度 一个实现不同字符串相似度和距离度量的库。 当前实现了十二种算法(包括Levenshtein编辑距离和同级,Jaro-Winkler,最长公共子序列,余弦相似性等)。 查看下面的摘要表以获取完整列表... 下载 ...

    对输入的两个字符串的相似度进行计算,并给出运行时间

    在实际应用中,这样的字符串相似度计算功能可以用于许多场景,例如: 1. 检测抄袭:在学术论文检测中,通过计算新论文与已知论文的相似度,可以判断是否存在抄袭行为。 2. 推荐系统:根据用户搜索历史的相似度,推荐...

    模糊匹配算法java实现

    1. **Levenshtein距离**:Levenshtein距离是一种衡量两个字符串相似度的方法,定义为由一个字符串转换成另一个字符串最少的单字符编辑操作次数(插入、删除或替换)。Java中可以自定义实现,或者使用开源库Apache ...

    java实现中文分词simhash算法

    5. **相似度计算**:通过比较两个文本的SimHash值,计算Hamming距离(不同位数的数量),一般来说,Hamming距离越小,文本相似度越高。 在Java中,我们可以自定义`SimHash.java`类来实现上述过程。类中可以包括分词...

    字符串的相似度 编辑距离 java实现

    字符串相似度计算之编辑距离 编辑距离(Edit Distance)是计算两个字符串之间的相似度的算法,它定义了从原串(s)转换到目标串(t)所需要的最少的插入、删除和替换的数目。在自然语言处理(NLP)中应用非常广泛,...

    最小编辑距离(字符串相似度)java版

    总之,最小编辑距离算法是计算字符串相似度的一种有效方法,通过动态规划实现,具有较高的效率和广泛的应用价值。在Java编程中,`EditDistance.java`文件所包含的实现可以帮助开发者在各种需要字符串比较的场景下...

    中文文本相似度匹配算法

    海明距离是衡量两个字符串差异程度的度量,对于simHash算法而言,它用于比较两个哈希值的相似度。在文本相似度匹配中,如果两个文本的simHash哈希值的汉明距离较小,那么这两个文本被认为是相似的。海明距离计算简单...

    中文文本相似度匹配算法 simHash 海明距离 IK分词

    汉明距离是指两个字符串在对应位置上不同字符的个数,数值越小,文本相似度越高。 海明距离在simHash中起到关键作用,它是衡量两个哈希值差异的指标。在文本相似度匹配中,如果两个simHash值的汉明距离小于某个阈值...

    相似度:相似度:相似度计算工具包,java编写。用于词,短语,句子,词法分析,情感分析,语义分析等相关的相似度计算

    相似度是由一系列算法组成的Java版相似度计算工具包,目标是传播自然语言处理中相似度计算方法。相似度是工具实用,性能高效,架构清晰,语料时新,可自定义的特点。 相似性提供下列功能:词相似度计算词林编码法...

Global site tag (gtag.js) - Google Analytics