-
2022-02-21 11:35:21
/**
* 计算两个字符串的相似度
* @param str
* @param target
* @return
*/public static float getSimilarityRatio(String str, String target) { int d[][]; // 矩阵 int n = str.length(); int m = target.length(); int i; // 遍历str的 int j; // 遍历target的 char ch1; // str的 char ch2; // target的 int temp; // 记录相同字符,在某个矩阵位置值的增量,不是0就是1 if (n == 0 || m == 0) { return 0; } 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++) { // 遍历str ch1 = str.charAt(i - 1); // 去匹配target for (j = 1; j <= m; j++) { ch2 = target.charAt(j - 1); if (ch1 == ch2 || ch1 == ch2 + 32 || ch1 + 32 == ch2) { temp = 0; } else { temp = 1; } // 左边+1,上边+1, 左上角+temp取最小 d[i][j] = Math.min(Math.min(d[i - 1][j] + 1, d[i][j - 1] + 1), d[i - 1][j - 1] + temp); } } return (1 - (float) d[n][m] / Math.max(str.length(), target.length())) * 100F; }
更多相关内容 -
java 计算字符串相似度
2015-10-13 10:28:29java 计算字符串相似度 -
Java:计算字符串相似度的度量
2021-02-28 07:52:01)其目的是根据字符在两者中出现的方式计算两个字符串之间的相似性,或者在一个字符串中出现或不出现在另一个字符串中。代码是正确的,但我想优化它。您是否看到任何低效率,不良做法或不必要的复杂性?(不要担心Gene...这种方法是我程序的瓶颈。 (或者,至少在大部分时间用完了。)
其目的是根据字符在两者中出现的方式计算两个字符串之间的相似性,或者在一个字符串中出现或不出现在另一个字符串中。
代码是正确的,但我想优化它。您是否看到任何低效率,不良做法或不必要的复杂性?
(不要担心Gene类。这里真正关注的是Genes携带的字符串。)
public static int simpleScore(Gene g0, Gene g1) {
if (g0.equals(g1)) { //identical genes have distance 0
return 0;
}
String frag0 = g0.getDNA();
String frag1 = g1.getDNA();
Map charOccurencesFrag0 = new HashMap(Constants.DNA_CHARS.length);
Map charOccurencesFrag1 = new HashMap(Constants.DNA_CHARS.length);
int multSCOST = 0;
int multDCOST = 0;
int multDDCOST = 0;
for (char c : Constants.DNA_CHARS) { //look through all acceptable DNA chars
charOccurencesFrag0.put(c, StringUtils.countMatches(frag0, "" + c));
charOccurencesFrag1.put(c, StringUtils.countMatches(frag1, "" + c));
//if a char appears in one frag but not the other
if ((frag0.indexOf(c) != -1 && frag1.indexOf(c) == -1) || (frag0.indexOf(c) == -1 && frag1.indexOf(c) != -1)) {
multDDCOST += (charOccurencesFrag0.get(c) + charOccurencesFrag1.get(c));
}
//if a char appears in both frags
if (frag0.indexOf(c) != -1 && frag1.indexOf(c) != -1) {
int diff = Math.abs(charOccurencesFrag0.get(c) - charOccurencesFrag1.get(c));
multDCOST += diff;
multSCOST += Math.min(charOccurencesFrag0.get(c), charOccurencesFrag1.get(c));
}
}
return Constants.SCOST * multSCOST + Constants.DDCOST * multDDCOST + Constants.DCOST * multDCOST;
}根据回复更新了代码
这导致了相当大的加速。感谢所有评论的人。还有其他人有什么想法吗?
public static int simpleScore(Gene g0, Gene g1) {
if (g0.equals(g1)) { //identical genes have distance 0
return 0;
}
String frag0 = g0.getDNA();
String frag1 = g1.getDNA();
int[] charOccurencesFrag0 = countOccurrences(frag0, Constants.DNA_CHARS);
int[] charOccurencesFrag1 = countOccurrences(frag1, Constants.DNA_CHARS);
int multSCOST = 0;
int multDCOST = 0;
int multDDCOST = 0;
for (int ket = 0; ket < Constants.DNA_CHARS.length; ket++) {
//if a char appears in one frag but not the other
if ((charOccurencesFrag0[ket] > 0 && charOccurencesFrag1[ket] == 0) || (charOccurencesFrag0[ket] == 0 && charOccurencesFrag1[ket] >0)){
multDDCOST += charOccurencesFrag0[ket] + charOccurencesFrag1[ket];
}
//if a char appears in both frags
if (charOccurencesFrag0[ket] != 0 && charOccurencesFrag1[ket] != 0){
int diff = Math.abs(charOccurencesFrag0[ket] - charOccurencesFrag1[ket]);
multDCOST += diff;
multSCOST += Math.min(charOccurencesFrag0[ket] , charOccurencesFrag1[ket]);
}
}
return Constants.SCOST * multSCOST + Constants.DDCOST * multDDCOST + Constants.DCOST * multDCOST;
}
// from MAK on SO
private static int[] countOccurrences(String x, char[] validDNAChars){
int[] count=new int[validDNAChars.length];
for(int i=0;i
int index=-1;
for(int j=0;j
if (x.charAt(i)==validDNAChars[j]){
index=j;
}
}
if (index>=0) count[index]++;
}
return count;
}
-
字符串相似度比对JAVA
2016-10-22 18:09:06就是一个简单的字符串相似度比较的方法,暂时还不知道有没有更好的方法,大家先看看,有更好的希望分享一下 -
Java字符串相似度:各种字符串相似度和距离算法的实现:Levenshtein,Jaro-winkler,n-Gram,Q-Gram,...
2021-02-02 12:45:17Java字符串相似度 一个实现不同字符串相似度和距离度量的库。 当前实现了十二种算法(包括Levenshtein编辑距离和同级,Jaro-Winkler,最长公共子序列,余弦相似性等)。 查看下面的摘要表以获取完整列表... 下载 ... -
java字符串相似度算法
2021-02-28 07:51:26本文实例讲述了java字符串相似度算法。分享给大家供大家参考。具体实现方法如下:public class Levenshtein {private int compare(String str, String target) {int d[][]; // 矩阵int n = str.length();int m = ...本文实例讲述了java字符串相似度算法。分享给大家供大家参考。具体实现方法如下:
public class Levenshtein {
private int compare(String str, String target) {
int d[][]; // 矩阵
int n = str.length();
int m = target.length();
int i; // 遍历str的
int j; // 遍历target的
char ch1; // str的
char ch2; // target的
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++) { // 遍历str
ch1 = str.charAt(i - 1);
// 去匹配target
for (j = 1; j <= m; j++) {
ch2 = target.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];
}
private int min(int one, int two, int three) {
return (one = one < two ? one : two) < three ? one : three;
}
/**
* 获取两字符串的相似度
*
* @param str
* @param target
*
* @return
*/
public float getSimilarityRatio(String str, String target) {
return 1 - (float) compare(str, target) / Math.max(str.length(), target.length());
}
public static void main(String[] args) {
Levenshtein lt = new Levenshtein();
String str = "ab";
String target = "ac";
System.out.println("similarityRatio=" + lt.getSimilarityRatio(str, target));
}
}
希望本文所述对大家的Java程序设计有所帮助。
-
Java 计算字符串相似度——Levenshtein
2019-01-21 08:59:06介绍:莱茵斯坦距离 计算相似度 先取两个字符串长度的最大值maxLen,用需要操作数除maxLen,得到相似度。 例如abc和abe 一个操作,长度为3,所以相似度为1/2=0.666 public class ...介绍:莱茵斯坦距离 计算相似度 先取两个字符串长度的最大值maxLen,用需要操作数除maxLen,得到相似度。
例如abc和abe 一个操作,长度为3,所以相似度为1/2=0.666
public class CharacterStringAcquaintanceDegree { /** * 莱茵斯坦距离——相似度计算 * * @param 参数1 * @param 参数2 */ public static Float levenshtein(String str1, String str2) { //--- 计算两个字符串的长度。 int len1 = str1.length(); int len2 = str2.length(); // 建立数组,比字符长度的大一个空间 int[][] matrix = new int[len1 + 1][len2 + 1]; // 分别为两个字符串赋值到矩阵中 for (int a = 0; a <= len1; a++) { matrix[a][0] = a; } for (int a = 0; a <= len2; a++) { matrix[0][a] = a; } // 计算两个字符是否一样,计算左上的值 int temp; for (int i = 1; i <= len1; i++) { for (int j = 1; j <= len2; j++) { //判断两个字符是否一致 if (str1.charAt(i - 1) == str2.charAt(j - 1)) { temp = 0; } else { temp = 1; } // 取三个值中最小的 matrix[i][j] = min(matrix[i - 1][j - 1] + temp, matrix[i][j - 1] + 1, matrix[i - 1][j] + 1); } } // System.out.println("字符串\""+str1+"\"与\""+str2+"\"的比较"); // 取数组右下角的值,同样不同位置代表不同字符串的比较 // System.out.println("差异步骤:"+matrix[len1][len2]); // 计算相似度 float similarity = 1 - (float) matrix[len1][len2] / Math.max(str1.length(), str2.length()); // System.out.println("相似度:"+similarity); return similarity; } // 得到最小值 private static int min(int... is) {//int... 获取未知长度的int int min = Integer.MAX_VALUE; for (int i : is) { if (min > i) { min = i; } } return min; } }
public static void main(String[] args) { String str1="holle word"; String str2="holle word,"; float is = CharacterStringAcquaintanceDegree.levenshtein(str1, str2); System.out.println("字符串:"+str1); System.out.println("字符串:"+str2); System.out.println("相识度:"+is); }
该文章转载至:https://blog.csdn.net/u010180738/article/details/84113022
-
Java 对比两字符串的相似度
2021-03-11 17:23:29/*** 编辑距离算法,首先由俄国科学家Levenshtein提出的,又叫Levenshtein Distance* 主要用来计算从原串(s)转换到目标串(t)所/*** 编辑距离算法,首先由俄国科学家Levenshtein提出的,又叫Levenshtein Distance* ... -
字符串相似度
2013-11-18 13:57:26判断两个字符串的相似度 java 相似度 string -
计算字符串相似度算法(java)
2021-04-28 03:16:07public static float getSimRatio(String str, String target) {if (str == null || target == null) {return 0;}str = str.toLowerCase();target = target.toLowerCase();int d[][];int n = str.length();... -
字符串相似度(编辑距离算法)
2021-03-14 12:58:22编辑距离(Edit Distance),最先是由俄国科学家Vladimir Levenshtein在1965年发明,用他的名字命名,又称Levenshtein距离。是指两个字串之间,由一个...1.将两个字符串分别写到行和列中,第一行和第一列的值从0开始增... -
Java实现字符串相似度算法,用于试题相似度,字符串相似度,字符串比较等场景
2020-04-14 19:47:38使用Levenshtein(莱文斯坦)编辑距离来实现相似度算法 所谓Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数,操作包括一切你使用的手段将一个字符串转换成另一个字符串,比如插入一个... -
java 两字符串相似度计算算法
2015-03-21 18:15:13[url]http://itindex.net/detail/46929-java-%E5%AD%97%E7%AC%A6%E4%B8%B2-%E7%9B%B8%E4%BC%BC[/url] Levenshtein distance最先是由俄国科学家Vladimir Levenshtein在1965年发明,用他的名字命名。不会拼读,可以叫... -
Java字符串相似度匹配
2018-11-16 00:30:31//计算两个字符串的长度。 int len1 = str1.length(); int len2 = str2.length(); //建立上面说的数组,比字符长度大一个空间 int[][] dif = new int[len1 + 1][len2 + 1]; //赋初值,步骤B。 for (int a = 0... -
Java两个字符串比较相似度
2021-12-06 11:14:44一、具体代码如下: public static void main(String[] args) { String proName1="我是中国人"; String proName2="我是中国湖南人";... System.out.println("相似度:"+number*100+"%"); } ... -
java算法(1)---余弦相似度计算字符串相似率
2021-06-04 11:04:16功能需求:最近在做通过爬虫技术去爬取各大相关网站的新闻,储存到公司数据中。这里面就有一个技术点,就是如何保证你...对于余弦相似度算法的理论讲的比较清晰,我们也是按照这个方式来计算相似度的。 1、说重点 ... -
java算法 字符串的相似度计算
2020-12-21 18:05:29} /** * 获取两字符串的相似度 */ public static Double getSimilarityRatio(String str, String target) { int max = Math.max(str.length(), target.length()); return 1- (double)compare(str, target) / max; }... -
Java实现标题相似度计算,文本内容相似度匹配,Java通过SimHash计算标题文本内容相似度
2022-02-09 15:03:53四、Java通过SimHash计算文本内容相似度代码示例 一)、新增依赖包 二)、过滤特殊字符 三)、计算单个分词的Hash值 四)、分词计算向量 五)、获取标题内容的海明距离 六)、获取标题内容的相似度 七)、... -
Java 比较两个字符串的相似度算法(Levenshtein Distance)
2018-08-28 11:13:21Levenshtein Distance,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。 许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。 编辑距离的算法是首先由... -
Java中对比两个字符串的相似度
2020-07-09 12:28:55Java中对比两个字符串的相似度的方法, 以下整理了两个方式比对方法,同样的字符串不同的计算方式得到的结果也是不同的: package test; /** * 对比俩个字符串的相似度 * @author sanshi */ public class ... -
Java代码实现余弦相似度算法比较两字符串相似度
2018-11-02 13:14:25因工作需要比较两个两个字符串的相似度比较,由于最短编辑距离算法不符合需求,就又找其他算法,在网上看到了另一个算法:余弦相似度算法。于是学习了一下,并写篇... * 计算两个字符串(英文字符)的相似度,简单的... -
Java获取两个字符串的相似度
2021-08-18 13:44:16Java获取两个字符串的相似度 public static double getStringSimilarity(String sourceString, String targetString) { int[][] matrix; int sourceStringLength = sourceString.length(); int ... -
java中如何计算两个字符串的相似度?
2021-03-07 21:55:25发现apache提供了现成的解决方案1.Cosine similaritypackage org.apache.commons....import java.util.HashSet;import java.util.Map;import java.util.Set;/*** Measures the Cosine similarity of two vectors of... -
字符串相似度计算工具和算法
2020-07-10 22:19:17介绍:JavaWuzzy是Java版的FuzzyWuzzy,用于计算字符串之间的匹配度。 FuzzySearch.ratio(String s1, String s2) 全匹配,对顺序敏感 FuzzySearch.partialRatio(String s1, String s2) 搜索匹配(部分匹配),对顺序... -
Java字符串匹配相似度算法
2018-12-19 11:34:50* 采用动态规划的方法(字符串匹配相似度) * @param source 源 * @param target 要匹配的字符串 * @return */ public static int EditDistance(String source, String target) { char[] source... -
字符串相似度比较工具
2021-01-27 10:21:30字符串相似度比较工具 描述:在日常开发过程中我们可能需要比较两个字符串的相似度有多少,本工具类提供了一个方便计算的算法。 /** * 字符串相似度比较工具 * * @date: 2020/12/7 10:45 */ public class ... -
3个版本的计算字符串的相似度. js C# java
2017-11-07 09:53:52**计算字符串的相似度. javascript版**/** * * 检查两个字符串的相似度 * 可以用在 DNA分析 拼字检查 语音辨识 抄袭侦测 * @createTime 2012-1-12 */ function SimilarityDegree(str1, str2) { //计算两个...