1.需求
想判断2个字符串之间的相似度或者相关性,网上有很多成熟的NLP
相关的工具类或者算法,下面的例子主要是针对两个字符串里面的字符出现相同次数的维度统计
的一种简单算法,不一定适用所有场景。
2.代码
package com.xxx;
/**
* 字符串相似度判别
*/
public class StringSimilarityTest {
public static void main(String[] args) {
String root = "我有一个苹果";
String str2 = "我有苹果";
String str3 = "我有一个梨子";
String str4 = "我想吃苹果";
similarity(root, str2);
similarity(root, str3);
similarity(root, str4);
}
/**
* 分析2个字符串的相似度
*/
public static float similarity(String str1,String str2) {
//计算两个字符串的长度。
int len1 = str1.length();
int len2 = str2.length();
//建立上面说的数组,比字符长度大一个空间
int[][] dif = new int[len1 + 1][len2 + 1];
//赋初值,步骤B。
for (int a = 0; a <= len1; a++) {
dif[a][0] = a;
}
for (int a = 0; a <= len2; a++) {
dif[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;
}
//取三个值中最小的
dif[i][j] = min(dif[i - 1][j - 1] + temp, dif[i][j - 1] + 1,
dif[i - 1][j] + 1);
}
}
//计算相似度
float similarity =1 - (float) dif[len1][len2] / Math.max(str1.length(), str2.length());
System.out.println("相似度:"+similarity);
return similarity;
}
//得到最小值
private static int min(int... is) {
int min = Integer.MAX_VALUE;
for (int i : is) {
if (min > i) {
min = i;
}
}
return min;
}
}
3.结果
相似度:0.6666666
相似度:0.6666666
相似度:0.5