目录

nodejskoa2博客通过SimHash算法实现相似博文推荐功能一


一、前言:
  • 本章节将通过借助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