摘自:http://www.programcreek.com/java-api-examples/index.php?source_dir=textmining-master/src/com/gta/simhash/SimHash.java

package com.gta.simhash;

public class Test { 

 public static void main(String[] args) {
// TODO Auto-generated method stub String s3 = "�������Ϻ���������죬���������������������Ͼ������ݣ����������ţ����ϣ��ൺ���人�����ݣ����ڣ��ɶ���������̫ԭ����ɳ�����֣�������֣�ݣ���������������³ľ�룬���ݣ��������Ϸʣ��ߺ�";
String s4 = "�������Ϻ���������죬���������������������Ͼ������ݣ����������ţ����ϣ��ൺ���人�����ݣ����ڣ��ɶ���������̫ԭ����ɳ�����֣�������֣�ݣ�����";
SimHash hash1 = new SimHash(s3, 64, 8);
SimHash hash2 = new SimHash(s4, 64, 8);
hash1.getResult(hash2);
} }
package com.gta.simhash;

import java.io.IOException;
import java.math.BigInteger;
import java.util.List;
import java.util.ArrayList; import org.wltea.analyzer.lucene.IKAnalyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute; public class SimHash {
private String tokens;
private int hashBits = 64;
private int distance = 5; public SimHash(String tokens)
{
this.tokens = tokens;
} public SimHash(String tokens, int hashBits, int distance)
{
this.tokens = tokens;
this.hashBits = hashBits;
this.distance = distance;
} public List<TermDict> tokenizer()
{
List<TermDict> terms = new ArrayList<TermDict>();
IKAnalyzer analyzer = new IKAnalyzer(true);
try {
TokenStream stream = analyzer.tokenStream("", this.tokens);
CharTermAttribute cta = stream.addAttribute(CharTermAttribute.class);
stream.reset();
int index = -1;
while (stream.incrementToken())
{
if ((index = isContain(cta.toString(), terms)) >= 0)
{
terms.get(index).setFreq(terms.get(index).getFreq()+1);
}
else
{
terms.add(new TermDict(cta.toString(), 1));
}
}
analyzer.close();
} catch (IOException e) {
e.printStackTrace();
}
return terms;
} public int isContain(String str, List<TermDict> terms)
{
for (TermDict td : terms)
{
if (str.equals(td.getTerm()))
{
return terms.indexOf(td);
}
}
return -1;
} public BigInteger simHash(List<TermDict> terms)
{
int []v = new int[hashBits];
for (TermDict td : terms)
{
String str = td.getTerm();
int weight = td.getFreq();
BigInteger bt = shiftHash(str);
for (int i = 0; i < hashBits; i++)
{
BigInteger bitmask = new BigInteger("1").shiftLeft(i);
if ( bt.and(bitmask).signum() != 0)
{
v[i] += weight;
}
else
{
v[i] -= weight;
}
}
} BigInteger fingerPrint = new BigInteger("0");
for (int i = 0; i < hashBits; i++)
{
if (v[i] >= 0)
{
fingerPrint = fingerPrint.add(new BigInteger("1").shiftLeft(i)); // update the correct fingerPrint
}
}
return fingerPrint;
} public BigInteger shiftHash(String str)
{
if (str == null || str.length() == 0)
{
return new BigInteger("0");
}
else
{
char[] sourceArray = str.toCharArray();
BigInteger x = BigInteger.valueOf((long) sourceArray[0] << 7);
BigInteger m = new BigInteger("131313");
for (char item : sourceArray)
{
x = x.multiply(m).add(BigInteger.valueOf((long)item));
}
BigInteger mask = new BigInteger("2").pow(hashBits).subtract(new BigInteger("1"));
boolean flag = true;
for (char item : sourceArray)
{
if (flag)
{
BigInteger tmp = BigInteger.valueOf((long)item << 3);
x = x.multiply(m).xor(tmp).and(mask);
}
else
{
BigInteger tmp = BigInteger.valueOf((long)item >> 3);
x = x.multiply(m).xor(tmp).and(mask);
}
flag = !flag;
} if (x.equals(new BigInteger("-1")))
{
x = new BigInteger("-2");
}
return x;
}
} public BigInteger getSimHash()
{
return simHash(tokenizer());
} public int getHammingDistance(SimHash hashData)
{
BigInteger m = new BigInteger("1").shiftLeft(hashBits).subtract(new BigInteger("1"));
System.out.println(getFingerPrint(getSimHash().toString(2)));
System.out.println(getFingerPrint(hashData.getSimHash().toString(2)));
BigInteger x = getSimHash().xor(hashData.getSimHash()).and(m);
int tot = 0;
while (x.signum() != 0)
{
tot += 1;
x = x.and(x.subtract(new BigInteger("1")));
}
System.out.println(tot);
return tot;
} public String getFingerPrint(String str)
{
int len = str.length();
for (int i = 0; i < hashBits; i++)
{
if (i >= len)
{
str = "0" + str;
}
}
return str;
} public void getResult(SimHash hashData)
{
if (getHammingDistance(hashData) <= distance)
{
System.out.println("match");
}
else
{
System.out.println("false");
}
} }

利用simhash计算文本相似度的更多相关文章

  1. 利用sklearn计算文本相似性

    利用sklearn计算文本相似性,并将文本之间的相似度矩阵保存到文件当中.这里提取文本TF-IDF特征值进行文本的相似性计算. #!/usr/bin/python # -*- coding: utf- ...

  2. C#动态规划法计算文本相似度

    C# 采用动态规划算法,计算两个字符串之间的相似程度. public static double CountTextSimilarity(string textX, string textY, boo ...

  3. DSSM算法-计算文本相似度

    转载请注明出处: http://blog.csdn.net/u013074302/article/details/76422551 导语 在NLP领域,语义相似度的计算一直是个难题:搜索场景下quer ...

  4. Java根据余弦定理计算文本相似度

    项目中需要算2个字符串的相似度,是根据余弦相似性算的,下面具体介绍一下: 余弦相似度计算 余弦相似度用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小.余弦值越接近1,就表明夹角越接近0度, ...

  5. NLP点滴——文本相似度

    [TOC] 前言 在自然语言处理过程中,经常会涉及到如何度量两个文本之间的相似性,我们都知道文本是一种高维的语义空间,如何对其进行抽象分解,从而能够站在数学角度去量化其相似性.而有了文本之间相似性的度 ...

  6. 转:Python 文本挖掘:使用gensim进行文本相似度计算

    Python使用gensim进行文本相似度计算 转于:http://rzcoding.blog.163.com/blog/static/2222810172013101895642665/ 在文本处理 ...

  7. 从0到1,了解NLP中的文本相似度

    本文由云+社区发表 作者:netkiddy 导语 AI在2018年应该是互联网界最火的名词,没有之一.时间来到了9102年,也是项目相关,涉及到了一些AI写作相关的功能,为客户生成一些素材文章.但是, ...

  8. 【机器学习】使用gensim 的 doc2vec 实现文本相似度检测

    环境 Python3, gensim,jieba,numpy ,pandas 原理:文章转成向量,然后在计算两个向量的余弦值. Gensim gensim是一个python的自然语言处理库,能够将文档 ...

  9. NLP文本相似度(TF-IDF)

    本篇博文是数据挖掘部分的首篇,思路主要是先聊聊相似度的理论部分,下一篇是代码实战.       我们在比较事物时,往往会用到“不同”,“一样”,“相似”等词语,这些词语背后都涉及到一个动作——双方的比 ...

随机推荐

  1. hdu1535——Invitation Cards

    Invitation Cards Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  2. HTTP Status Codes 状态码

    Network Connect Timeout Error

  3. [原创]webpack动态设置css路径

    在程序入口的最上方添加 __webpack_public_path__ = path; //your path //your app start here

  4. maven assembly 配置详解

    Maven Assembly插件介绍 博客分类: 项目构建   你是否想要创建一个包含脚本.配置文件以及所有运行时所依赖的元素(jar)Assembly插件能帮你构建一个完整的发布包. Assembl ...

  5. 九度OJ 1326:Waiting in Line(排队) (模拟)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:220 解决:64 题目描述: Suppose a bank has N windows open for service. There is ...

  6. 1.Python学习---helloworld

    1.首先访问http://www.python.org/download/去下载最新的python版本. 2.安装下载包,一路next. 3.为计算机添加安装目录搭到环境变量,如图把python的安装 ...

  7. jmeter--基于http+json接口的功能测试

    jmeter--基于http+json接口的功能测试 测试项目叫做smile_task,简称sm_task.这是一个基于nodejs超简单的todo list,sm_task没有任何UI界面(纯接口) ...

  8. 【JavaScript专题】--- 立即执行函数表达式

    一 什么是立即执行函数表达式 立即执行函数表达式,其实也可以叫初始化函数表达式,英文名:IIFE,immediately-inovked-function expression.立即执行函数表达式就是 ...

  9. thymeleaf基本应用

    Thymeleaf是个XML/XHTML/HTML5模板引擎,可以用于Web与非Web应用. Thymeleaf的主要目标在于提供一种可被浏览器正确显示的.格式良好的模板创建方式,因此也可以用作静态建 ...

  10. Linux c编程:同步属性

    就像线程具有属性一样,线程的同步对象(如互斥量.读写锁.条件变量.自旋锁和屏障)也有属性 1.互斥量属性 用pthread_mutexattr_init初始化pthread_mutexattr_t结构 ...