汉字相似度比较

package com.common;

import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
* @description 定时任务-比较相似度
*/
public class CosineSimilarAlgorithm {
public static double getSimilarity(String doc1, String doc2) {
if (doc1 != null && doc1.trim().length() > 0 && doc2 != null && doc2.trim().length() > 0) {

Map<Integer, int[]> AlgorithmMap = new HashMap<Integer, int[]>();

// 将两个字符串中的中文字符以及出现的总数封装到,AlgorithmMap中
for (int i = 0; i < doc1.length(); i++) {
char d1 = doc1.charAt(i);
if (isHanZi(d1)) {
int charIndex = getGB2312Id(d1);
if (charIndex != -1) {
int[] fq = AlgorithmMap.get(charIndex);
if (fq != null && fq.length == 2) {
fq[0]++;
} else {
fq = new int[2];
fq[0] = 1;
fq[1] = 0;
AlgorithmMap.put(charIndex, fq);
}
}
}
}

for (int i = 0; i < doc2.length(); i++) {
char d2 = doc2.charAt(i);
if (isHanZi(d2)) {
int charIndex = getGB2312Id(d2);
if (charIndex != -1) {
int[] fq = AlgorithmMap.get(charIndex);
if (fq != null && fq.length == 2) {
fq[1]++;
} else {
fq = new int[2];
fq[0] = 0;
fq[1] = 1;
AlgorithmMap.put(charIndex, fq);
}
}
}
}

Iterator<Integer> iterator = AlgorithmMap.keySet().iterator();
double sqdoc1 = 0;
double sqdoc2 = 0;
double denominator = 0;
while (iterator.hasNext()) {
int[] c = AlgorithmMap.get(iterator.next());
denominator += c[0] * c[1];
sqdoc1 += c[0] * c[0];
sqdoc2 += c[1] * c[1];
}
double origin = denominator / Math.sqrt(sqdoc1 * sqdoc2);
if (String.valueOf(origin).equals("NaN")) {
return Double.valueOf("0");
}
BigDecimal bg = new BigDecimal(origin);
double f1 = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
return f1;
} else {
throw new NullPointerException(" the Document is null or have not cahrs!!");
}
}

public static boolean isHanZi(char ch) {
// 判断是否汉字
return (ch >= 0x4E00 && ch <= 0x9FA5);

}

/**
* 根据输入的Unicode字符,获取它的GB2312编码或者ascii编码,
*
* @param ch
* 输入的GB2312中文字符或者ASCII字符(128个)
* @return ch在GB2312中的位置,-1表示该字符不认识
*/
public static short getGB2312Id(char ch) {
try {
byte[] buffer = Character.toString(ch).getBytes("GB2312");
if (buffer.length != 2) {
// 正常情况下buffer应该是两个字节,否则说明ch不属于GB2312编码,故返回‘?‘,此时说明不认识该字符
return -1;
}
int b0 = (buffer[0] & 0x0FF) - 161; // 编码从A1开始,因此减去0xA1=161
int b1 = (buffer[1] & 0x0FF) - 161; // 第一个字符和最后一个字符没有汉字,因此每个区只收16*6-2=94个汉字
return (short) (b0 * 94 + b1);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return -1;
}

// public static void main(String[] args) {
// //
// String str1 = " rrr11ttrrr";
// String str2 = "titl四五六e4";
// String str3 = "这个杀手 不太冷";
// String str4 = "杀手 冷";
// String str5 = "这个 杀手 不";
//
// System.out.println(getSimilarity(str1, str2));
// System.out.println(getSimilarity(str1, str3));
// System.out.println(getSimilarity(str1, str4));
// System.out.println(getSimilarity(str1, str5));
//
// }

}

时间: 2024-08-25 03:59:07

汉字相似度比较的相关文章

我是如何用单机实现亿级规模题库去重的?

背景 最近工作中遇到了一个问题:如何对大规模题库去重?公司经过多年的积累,有着近亿道题目的题库,但是由于题目来源不一导致题库中有很多重复的题目,这些重复的题目在检索时,除了增加搜索引擎的计算量外,并不会提高准确率.此外由于题目过多,搜索引擎往往采取了截断策略,只对一部分题目进行计算,这导致了某些正确的题目反而得不到计算,拍搜准确率甚至不增反降.所以对于一个搜索引擎来说,虽然初期增加题目数量往往可以大幅提高拍搜准确率,但是当题目量大到一定程度时,反而会由于计算量跟不上导致准确率下降.如何尽可能的去

php 汉字验证码

代码: captcha.php <?php //实现简单的验证码 //session_start session_start(); //画布 $image = imagecreatetruecolor(200, 60); //设置填充颜色 $bgcolor = imagecolorallocate($image, 255, 255, 255); //填充 imagefill($image, 0, 0, $bgcolor); //随机数据 $str = '的一是在不了有和人这中大为上个国我以要他时

转:文本相似度算法

文本相似度算法 原文出自:http://www.cnblogs.com/liangxiaxu/archive/2012/05/05/2484972.html 1.信息检索中的重要发明TF-IDF 1.1TF Term frequency即关键词词频,是指一篇文章中关键词出现的频率,比如在一篇M个词的文章中有N个该关键词,则 (公式1.1-1) 为该关键词在这篇文章中的词频. 1.2IDF Inverse document frequency指逆向文本频率,是用于衡量关键词权重的指数,由公式 (公

衙度点燃咗报时烟花全城得信,都烧起烟花炮仗

嚟系子时到,府衙度点燃咗报时烟花,全城得信,都烧起烟花炮仗嚟.佟氏连忙叫醒仔,急急畀佢哋著翻件衫,执头发,就带咗佢哋到前院拜祖宗.先系张保带住四宁拜,跟住佟氏带咗淑宁跟住拜咗.等一套规矩做埋咗,才叫人抬出一啖煲摆枱上,煲入面嘅饺子紧水面翻滚.原来到嗰阵先吃饺子..比我哋乡下洗嘢嘅皂荚膏子好咗好多.听讲仲有香嘅番梘呢,就系加咗香料嘅,洗衫时净系用啲,就可以畀衫香足三日三夜啊!"「系点嚟嘅?"~~"!四宁眉开眼笑噉,一把抱起淑宁:"点睇阿哥呀?我可好耐冇同你一碌玩喇.&

关于C++对汉字拼音的处理(3)

之所以汉字转拼音的博文能出到3,主要是因为没有很完美的C++的解决方案,但是写到了这里可以有一个小结了. 以前的方法都有这种那种弊端,如果出现了无法识别的汉字(简体的)就无法修改处理了,但是下面的这种方法却能够随时修改.添加.删除汉字,这样就可以保证汉字转拼音的正确性了. 另外,对于繁体中文下面的方法并不支持,如果有兴趣的童鞋可以参照下面的方法进行修补完善. 首先说下下面的方法的优缺点: 优点: 1.简单易懂,初学者都能一目了然的看明白,不想某些大神写的东西各种位运算或使用第三方库来完成这个小小

PHP similar_text()、levenshtein()、lcs()支持中文汉字版

PHP 原生的similar_text()函数.levenshtein()函数对中文汉字支持不好,我自己写了一个 similar_text()中文汉字版 1 <?php 2 //拆分字符串 3 function split_str($str) { 4 preg_match_all("/./u", $str, $arr); 5 return $arr[0]; 6 } 7 8 //相似度检测 9 function similar_text_cn($str1, $str2) { 10

汉字简体繁体转换----Javascript

最近看到有个简体--繁体字互相转换的程序,是用JS实现的,感觉很好玩,所以拿来研究研究.先看看界面如下: 汉字简体繁体转换 上面的所有代码如下: <script> function copy(ob) { var obj=findObj(ob); if (obj) { obj.select();js=obj.createTextRange();js.execCommand("Copy"); } } function paste(ob) { var obj=findObj(ob

汉字-拼音转换类

汉字转拼音 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84

繁简汉字之争:简约与厚重之间的文明两难

繁简汉字之争:简约与厚重之间的文明两难 摘自<北晚新视觉> 2014年10月13日讯,每当汉字掀起一股热潮的时候,汉字的"繁简之争"总是会被拿出来议论一番.简体字方便书写记忆.繁体字更有文化内涵.因为历史原因,海峡两岸的中国人分别以简体字和繁体字作为通用汉字,文字的不同更是带来文化上的比较和争论.一段流传十分广泛的话痛陈汉字简化后的种种弊端:"汉字简化后,親不见,愛无心,產不生,厰空空,麵无麦,運无车,導无道,兒无首,飛单翼,湧无力,有雲无雨,開関无门,鄉里无郎-