几种情况判定相似:
1.连续7个字符以上判定连续。
2.拆分成单个字符,计算相似个数(相似度percent = equalTotal / maxLength)。
3.使用分词器,拆分成词,根据相同的词计算相似度(相似度percent = equalTotal / maxLength)。
4.IK分词器排除不参与比较相似度的词,然后进行相似度比较。例如:你,我,他,这,那等。
5.SimHash根据海明距计算文本相似度。
6.判定词的权重进行计算。(实现待调研)
7.分析语义进行相似度计算。例:今天会下雨。PK 今天不会下雨。(实现待调研)
实战:
1.连续7个字重复,视为相似。
public class RepeatString {
/**
* 匹配最大字符相似个数
*/
@Test
public void stringMatchNum() {
String s1 = "连续7个字符相同视为相似,计算相似度匹配匹配匹,续7个字符相同视为不";
String s2 = "连续7个字符相同视为不相似,不计算相似度";
List<String> s = getMaxSameString(s1, s2);
System.out.println(s);
}
public List<String> getMaxSameString(String str1, String str2) {
if (str1 != null && str2 != null) {
List<String> list = new ArrayList<>();
String maxStr = (str1.length() >= str2.length()) ? str1 : str2;
String minStr = (str1.length() < str2.length()) ? str1 : str2;
int minLen = minStr.length();
// 拿字符串少的去和多的比较
for (int i = 0; i < minLen; i++) {
for (int x = 0, y = minLen - i; y <= minLen; x++, y++) {
String subStr = minStr.substring(x, y);
if (maxStr.contains(subStr)) {
list.add(subStr);
}
}
if (!list.isEmpty()) {
break;
}
}
return list;
}
return null;
}
}
2.拆分成单个字符计算相似度
public class SingleKey {
/**
* 将字符串拆分成单个字符进行比对
*/
@Test
public void testCompare() {
String s = "将字符串拆分成单个字符进行比对";
String ss = "进行比对";
long l3 = System.currentTimeMillis();
compare2String(s, ss);
long l4 = System.currentTimeMillis();
System.out.println("总用时:" + (l4 - l3) + "ms");
}
public void compare2String(String s, String ss) {
char[] a = s.toCharArray();
char[] b = ss.toCharArray();
int maxLength = a.length > b.length ? a.length : b.length;
int equalTotal = 0;
LinkedHashMap<Character, Integer> map = new LinkedHashMap<Character, Integer>();
for (char cha : a) {
for (char chb : b) {
if (cha == chb) {
equalTotal++;
map.put(cha, 1);
}
}
}
Iterator<Entry<Character, Integer>> it = map.entrySet().iterator();
System.out.print("Similer key:");
while (it.hasNext()) {
Entry<Character, Integer> entry = it.next();
System.out.print(entry.getKey() + " ");
}
double percent = new BigDecimal((float) equalTotal / maxLength).setScale(4, BigDecimal.ROUND_HALF_UP)
.doubleValue();
System.out.println("");
System.out.println("maxLength:" + maxLength);
System.out.println("sameCount:" + equalTotal);
System.out.println("similer percent:" + equalTotal + "/" + maxLength + "=" + percent);
}
}