计算文本相似度方法比对(1)

几种情况判定相似:

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);
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值