nodejskoa2博客通过SimHash算法实现相似博文推荐功能一
目录
- 更多分享:www.catbro.cn
一、前言:
- 本章节将通过借助SimHash计算文本相似度的能力来实现相似博文推荐的功能。
- 我们在上一篇SimHash算法详解中介绍了SimHash算法的基本原理级实现计算过程。不清楚的小伙伴可以先看SimHash的相关文章。
- 分词器使用的是segment分词起,hash使用的是Jenkins
二、具体实现
-
代码如下,解释都在代码里面:
createSimhash(keyword) { //1、对内容进行分词 var result = segment.doSegment(keyword, { stripPunctuation: true, simple: true }); //2、用keyMap来存储分词及对应的权值 var keyMap = new Map(); result.map(function (key) { if (keyMap.has(key)) { keyMap.set(key, keyMap.get(key) + 1) } else { keyMap.set(key, 1) } }) var hashMap = new Map(); keyMap.forEach(function (value, key, map) { //3、对每个key计算其hash值 var currenthash = jenkins.hash64ToBinary(key); //4、遍历hash值,对hash值进行权值操作 for (var i = 0; i < currenthash.length; i++) { var v1 = parseInt(currenthash[i]); var v2; if (v1 > 0) { v2 = 1 * value; } else { v2 = value * (-1); } //5、边加权边合并 if (hashMap.has(i)) { hashMap.set(i, hashMap.get(i) + v2); } else { hashMap.set(i, v2); } } }); var s1 = ""; //6、降维 for (var i = 0; i < 64; i++) { var v1 = hashMap.get(i); if (v1 > 0) { hashMap.set(i, 1) } else { hashMap.set(i, 0) } s1 = s1 + hashMap.get(i); } return s1; }
-
如此我们边实现了SimHash算法,接下来给出一个计算距离的代码段:
-
代码如下:
getDistance(hash1, hash2) { var lenght = hash1.length > hash2.length ? hash2.length : hash1.length; var distance = 0; for (var i = 0; i < lenght; i++) { if (hash1[i] !== hash2[i]) { distance = distance + 1; } } return distance; }
-
ok,具体调用这里就不列出来了。根据实际情况进行封装调用即可
三、总结:
- 通过本次在在博文中的应用,对于Simhash算法小伙伴应该不陌生了。
- 后续将会继续推出算法类的文章,欢迎关注
- 喜欢就点击我:www.catbro.cn