资源简介
使用java调用HanLP分词器实现两个文本相似度对比,可以很快对比出百分率(1=100%)
代码片段和文件信息
package com.etoak.simHash;
import com.hankcs.hanlp.seg.common.Term;
import com.hankcs.hanlp.tokenizer.StandardTokenizer;
import org.apache.commons.lang3.StringUtils;
import org.jsoup.Jsoup;
import org.jsoup.safety.Whitelist;
import java.math.BigInteger;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MySimHash {
private String tokens; //字符串
private BigInteger strSimHash;//字符产的hash值
private int hashbits = 64; // 分词后的hash数;
public MySimHash(String tokens) {
this.tokens = tokens;
this.strSimHash = this.simHash();
}
private MySimHash(String tokens int hashbits) {
this.tokens = tokens;
this.hashbits = hashbits;
this.strSimHash = this.simHash();
}
/**
* 清除html标签
* @param content
* @return
*/
private String cleanResume(String content) {
// 若输入为HTML下面会过滤掉所有的HTML的tag
content = Jsoup.clean(content Whitelist.none());
content = StringUtils.lowerCase(content);
String[] strings = {“ “ “\n“ “\r“ “\t“ “\\r“ “\\n“ “\\t“ “ “};
for (String s : strings) {
content = content.replaceAll(s ““);
}
return content;
}
/**
* 这个是对整个字符串进行hash计算
* @return
*/
private BigInteger simHash() {
tokens = cleanResume(tokens); // cleanResume 删除一些特殊字符
int[] v = new int[this.hashbits];
List termList = StandardTokenizer.segment(this.tokens); // 对字符串进行分词
//对分词的一些特殊处理 : 比如: 根据词性添加权重 过滤掉标点符号 过滤超频词汇等;
Map weightOfNature = new HashMap(); // 词性的权重
weightOfNature.put(“n“ 2); //给名词的权重是2;
Map stopNatures = new HashMap();//停用的词性 如一些标点符号之类的;
stopNatures.put(“w“ ““); //
int overCount = 5; //设定超频词汇的界限 ;
Map wordCount = new HashMap();
for (Term term : termList) {
String word = term.word; //分词字符串
String nature = term.nature.toString(); // 分词属性;
// 过滤超频词
if (wordCount.containsKey(word)) {
int count = wordCount.get(word);
if (count > overCount) {
continue;
}
wordCount.put(word count + 1);
} else {
wordCount.put(word 1);
}
// 过滤停用词性
if (stopNatures.containsKey(nature)) {
continue;
}
// 2、将每一个分词hash为一组固定长度的数列.比如 64bit 的一个整数.
BigInteger t = this.hash(word);
for (int i = 0; i < this.hashbits; i++) {
BigInteger bitmask = new BigInteger(“1“).shiftLeft(i);
// 3、建立一个长度为64的整数数组(假设要生成64位的数字指纹也可以是其它数字)
// 对每一个分词hash后的数列进行判断如果是1000...1那么数组的第一位和末尾一位加1
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2017-12-03 14:59 SimHash\
目录 0 2017-12-03 14:58 SimHash\.idea\
文件 626 2017-12-03 14:30 SimHash\.idea\compiler.xm
文件 172 2017-12-03 14:30 SimHash\.idea\encodings.xm
目录 0 2017-12-03 14:30 SimHash\.idea\inspectionProfiles\
目录 0 2017-12-03 14:56 SimHash\.idea\libraries\
文件 545 2017-12-03 14:30 SimHash\.idea\libraries\Maven__com_hankcs_hanlp_portable_1_3_4.xm
文件 462 2017-12-03 14:30 SimHash\.idea\libraries\Maven__junit_junit_3_8_1.xm
文件 556 2017-12-03 14:30 SimHash\.idea\libraries\Maven__org_apache_commons_commons_lang3_3_4.xm
文件 485 2017-12-03 14:30 SimHash\.idea\libraries\Maven__org_jsoup_jsoup_1_10_3.xm
文件 439 2017-12-03 14:30 SimHash\.idea\misc.xm
文件 254 2017-12-03 14:29 SimHash\.idea\modules.xm
文件 22159 2017-12-03 14:58 SimHash\.idea\workspace.xm
文件 1549 2017-12-03 14:56 SimHash\pom.xm
文件 1209 2017-12-03 14:56 SimHash\SimHash.iml
目录 0 2017-12-03 14:29 SimHash\src\
目录 0 2017-12-03 14:29 SimHash\src\main\
目录 0 2017-12-03 14:31 SimHash\src\main\java\
目录 0 2017-12-03 14:31 SimHash\src\main\java\com\
目录 0 2017-12-03 14:57 SimHash\src\main\java\com\etoak\
目录 0 2017-12-03 14:53 SimHash\src\main\java\com\etoak\simHash\
文件 15305 2017-12-03 14:53 SimHash\src\main\java\com\etoak\simHash\MySimHash.java
目录 0 2017-12-03 14:29 SimHash\src\main\resources\
目录 0 2017-12-03 14:29 SimHash\src\test\
目录 0 2017-12-03 14:29 SimHash\src\test\java\
- 上一篇:Java教材系统管理
- 下一篇:jsp+mysql 客户信息管理系统完整源代码
评论
共有 条评论