Skip to content
ansj edited this page Apr 29, 2016 · 1 revision

nlp-lang之simhash

自1.6版本之后nlp-lang 提供了simhash支持.但是文档和相关说明没有提供.于是就相当于没有提供.现在我们来补全文档.

jar包的下载地址

http://maven.nlpcn.org/org/nlpcn/nlp-lang/

maven地址

<repositories>
    <repository>
        <id>mvn-repo</id>
        <url>http://maven.nlpcn.org/</url>
    </repository>
</repositories>

<dependencies>
    <dependency>
        <groupId>org.nlpcn</groupId>
        <artifactId>nlp-lang</artifactId>
        <version>1.6</version>
    </dependency>
</dependencies>

废话不多说直接代码吧...

String content = "卓尔防线继续伤筋动骨 队长梅方出场再补漏说起来卓尔队长梅方本赛季就是个“补漏”的命!在中卫与右边后卫间不停地轮换。如果不出意外,今天与广州恒大一战梅方又要换位置,这也是汉军队长连续三场比赛中的第三次换位。而从梅方的身上也可以看出,本赛季汉军防线如此“折腾”,丢球多也不奇怪了。梅方自2009赛季中乙出道便一直司职中后卫,还曾入选过布拉泽维奇国奥队,也是司职的中卫。上赛季,梅方与忻峰搭档双中卫帮助武汉卓尔队中超成功,但谁知进入本赛季后从第一场比赛开始梅方便不断因为种种“意外”而居无定所。联赛首战江苏舜天时,也是由于登贝莱受伤,朱挺位置前移,梅方临危受命客串右边后卫。第二轮主场与北京国安之战梅方仅仅打了一场中卫,又因为柯钊受罚停赛4轮而不得不再次到边路“补漏”。随着马丁诺维奇被弃用,梅方一度成为中卫首选,在与上海东亚队比赛中,邱添一停赛,梅方与忻峰再度携手,紧接着与申鑫队比赛中移至边路,本轮忻峰又停赛,梅方和邱添一成为中卫线上最后的选择。至于左右边后卫位置,卓尔队方面人选较多,罗毅、周恒、刘尚坤等人均可出战。记者马万勇原标题:卓尔防线继续伤筋动骨队长梅方出场再补漏稿源:中新网作者:";
		String content2 = "卓尔防线继续伤筋动骨 队长梅方出场再补漏说起来卓尔队长梅方本赛季就是个“补漏”的命!在中卫与右边后卫间不停地轮换。如果不出意外,今天与广州恒大一战梅方又要换位置,这也是汉军队长连续三场比赛中的第三次换位。而从梅方的身上也可以看出,本赛季汉军防线如此“折腾”,丢球多也不奇怪了。梅方自2009赛季中乙出道便一直司职中后卫,还曾入选过布拉泽维奇国奥队,也是司职的中卫。上赛季,梅方与忻峰搭档双中卫帮助武汉卓尔队中超成功,但谁知进入本赛季后从第一场比赛开始梅方便不断因为种种“意外”而居无定所。联赛首战江苏舜天时,也是由于登贝莱受伤,朱挺位置前移,梅方临危受命客串右边后卫。第二轮主场与北京国安之战梅方仅仅打了一场中卫,又因为柯钊受罚停赛4轮而不得不再次到边路“补漏”。随着马丁诺维奇被弃用,梅方一度成为中卫首选,在与上海东亚队比赛中,邱添一停赛,梅方与忻峰再度携手,紧接着与申鑫队比赛中移至边路,本轮忻峰又停赛,梅方和邱添一成为中卫线上最后的选择。至于左右边后卫位置,卓尔队方面人选较多,罗毅、周恒、刘尚坤等人均可出战。记者马万勇";
		Assert.assertTrue(simHashService.hmDistance(content, content2) < 7); //没错就这一句.hmDistance是汉明距离.越小代表约相似

simhash有一个很挫的缺点.两两比较.虽然可以通过分桶的方式来降低对比范围,但是依旧不够快,对于数据量很大的情况下.

这里我建议如果要用还是在结果之后做去重下面我说一下大概的步骤

  • 查询出文档1000个
  • 这些文档提前已经算好hashcode . 这是一个long形式的数字
  • 将code方式到index中并判断是否有重复

大约是以上三个步骤,下面是代码流程

Index index = simHashService.createIndex();//创建索引实体

		List<String> lists = IOUtil.readFile2List(DicManager.class.getResourceAsStream("/test.json"), "utf-8"); //list中每一个元素可以看成一个doc

		long start = System.currentTimeMillis();
		int m = 0;
		for (String string : lists) {
			int nearest = index.nearest(string);//查询当前文档和已放入文档的最近距离
			if (nearest < 7) { //某个阈值下则不放入索引
				m++;
			} else {
				index.add(string); //将文档放入索引
			}
		}
		Assert.assertTrue(m > 300 && m < 500);
		System.out.println(System.currentTimeMillis() - start);

好了.这就是simhash的大概用法.easy吧.其实我是为了测试最新的markdown编辑器才来用的这个目前来看效果不错

Clone this wiki locally