利用simhash算法原理和HanLP分词原理计算文本相似度工具类

前言

该方法是采用HanLP分词原理

参考大佬们的代码与原理:(部分)
simhash算法及原理简介
海量文本用 Simhash, 2小时变4秒! | 文本分析:大规模文本处理(2)

一、计算文本相似度工具类SimHashUtils

package com.siboo.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.Reader;
import java.math.BigInteger;
import java.sql.Clob;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.StringTokenizer;
import java.util.regex.Pattern;

import com.hankcs.hanlp.HanLP;
import com.hankcs.hanlp.corpus.tag.Nature;
import com.hankcs.hanlp.seg.common.Term;
import com.siboo.utils.StringUtils;

/**
 * 
* @Title: SimHashUtils.java
* @Package com.newtec.knowGraph.data.params
* @author 陈笑璞
* @date 2020年6月22日 下午5:35:32 
* @Description: 计算文本相似度工具类(采用SimHash算法思想)
*
 */
public class SimHashUtils {
   

    private static int hashbits = 64;// 默认64位,即将一个文本转换为64bit数据
    
    private static Pattern CHINES_PATTERIN = Pattern.compile("^[\u4e80-\u9fa5]+$" );
    
    private static final int DWEIGHT = 1;// 默认权重
    
    public SimHashUtils() {
   
		super();
	}

	public SimHashUtils(int hashbits) {
   
		super();
		this.hashbits = hashbits;
	}
	
	
	/**
	 * 
	* @Title: splitFourEqual
	* @Description: 将Simhash签名值平均分割为4等份
	* @param signature 字符串
	* @return List<String> 返回分割的4等份字符串
	 */
	public static List<String> splitFourEqual(String signature) {
   
		int length = signature.length();
		int m = 4;
		int num = length / m;
		List<String> list = new ArrayList<String>();
		for (int i = 0; i < m; i++) {
   
			list.add(signature.substring(i*num, (i+1)*num));
		}
		return list;
	}
	
	/**
	 * 
	* @Title: ClobToString
	* @Description: Java读取Oracle的CLOB字段转换为String数据
	* @param clob CLOB字段类型数据
	* @throws SQLException 
	* @throws IOException 
	* @return String 返回转换为String数据
	 */
	public static String ClobToString(Clob clob) throws SQLException, IOException {
   
        Reader is = clob.getCharacterStream();// 得到流
        BufferedReader br = new BufferedReader(is);
        String s = br.readLine();
        StringBuffer sb = new StringBuffer();
        while (s != null) {
   
        	// 执行循环将字符串全部取出付值给StringBuffer由StringBuffer转成String
            sb.append(s);
            s = br.readLine();
        }
        if(br!=null){
   
            br
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是用Python实现simhash算法计算文本相似度的示例代码: ```python import re import hashlib def simhash(text): # 定义特征向量 feature_vector = [0] * 128 # 进行分词 words = re.findall(r'\w+', text.lower()) for word in words: # 构建哈希值 word_hash = int(hashlib.md5(word.encode('utf-8')).hexdigest(), 16) # 计算权重并更新特征向量 for i in range(128): mask = 1 << i if word_hash & mask: feature_vector[i] += 1 else: feature_vector[i] -= 1 # 生成simhashsimhash_value = 0 for i in range(128): if feature_vector[i] > 0: simhash_value |= 1 << i return simhash_value def hamming_distance(value1, value2): # 计算两个simhash值的汉明距离 distance = 0 for i in range(128): mask = 1 << i if value1 & mask != value2 & mask: distance += 1 return distance def similarity(text1, text2): # 计算两个文本相似度 simhash1 = simhash(text1) simhash2 = simhash(text2) distance = hamming_distance(simhash1, simhash2) similarity = 1 - distance / 128 return similarity # 测试示例 text1 = 'Hello world!' text2 = 'Hello Python!' text3 = 'Hello world!' print(similarity(text1, text2)) # 输出 0.625 print(similarity(text1, text3)) # 输出 1.0 ``` 代码中,simhash函数用于计算文本simhash值,hamming_distance函数用于计算两个simhash值的汉明距离,similarity函数用于计算两个文本相似度。示例代码中使用MD5哈希算法生成单词的哈希值,并对于每个位上的权重计算特征向量,然后根据特征向量生成simhash值。最后,根据汉明距离计算相似度
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值