通过计算,结果得到二者的指纹是一模一样,其汉明距离为0.
srcFingerPrint: [1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 1 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0] dstFingerPrint: [1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 1 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0] --- PASS: TestSimHashSimilar (0.85s) similarity_test.go:57: SimHashSimilar distance: 0 PASS 适用性注意一:
我们再来看一个文章主旨类似,但是内容相关性较低的文本比较示例:
文本1: "关于区块链和数字货币的关系,很多人或多或少都存在疑惑。简单来说,区块链是比特币的底层运用,而比特币只是区块链的一个小应用而已。" + "数字货币即虚拟货币,最早的数字货币诞生于2009年,其发明者中本聪为了应对经济危机对于实体货币经济的冲击。比特币是最早的数字货币,后来出现了以太币、火币以及莱特币等虚拟货币,这些虚拟货币是不能用来交易的。" + "狭义来讲,区块链是一种按照时间顺序将数据区块以顺序相连的方式组合成的一种链式数据结构, 并以密码学方式保证的不可篡改和不可伪造的分布式账本。" + "广义来讲,区块链技术是利用块链式数据结构来验证与存储数据、利用分布式节点共识算法来生成和更新数据、利用密码学的方式保证数据传输和访问的安全、利用由自动化脚本代码组成的智能合约来编程和操作数据的一种全新的分布式基础架构与计算方式。" 文本2: "区块链技术为我们的信息防伪与数据追踪提供了革新手段。区块链中的数据区块顺序相连构成了一个不可篡改的数据链条,时间戳为所有的交易行为贴上了一套不讲课伪造的真是标签,这对于人们在现实生活中打击假冒伪劣产品大有裨益; " + "市场分析指出,整体而言,区块链技术目前在十大金融领域显示出应用前景,分别是资产证券化、保险、供应链金融、场外市场、资产托管、大宗商品交易、风险信息共享机制、贸易融资、银团贷款、股权交易交割。" + "这些金融场景有三大共性:参与节点多、验真成本高、交易流程长,而区块链的分布式记账、不可篡改、内置合约等特性可以为这些金融业务中的痛点提供解决方案。" + "传统的工业互联网模式是由一个中心化的机构收集和管理所有的数据信息,容易产生因设备生命周期和安全等方面的缺陷引起的数据丢失、篡改等问题。区块链技术可以在无需任何信任单个节点的同时构建整个网络的信任共识,从而很好的解决目前工业互联网技术领域的一些缺陷,让物与物之间能够实现更好的连接。"通过计算,当我们选择前top10高频词作为衡量时,结果得到二者的指纹是如下,其汉明距离为4:
srcFingerPrint: [1 0 1 1 0 1 0 0 0 1 1 1 1 1 1 0 1 0 0 1 0 1 1 1 0 0 0 1 0 0 0 1] dstFingerPrint: [1 0 1 1 0 1 0 0 0 1 1 1 1 1 1 0 1 1 0 1 1 1 1 0 0 0 0 1 0 1 0 1] --- PASS: TestSimHashSimilar (0.84s) similarity_test.go:58: SimHashSimilar distance: 4 PASS当我们选择前top50高频词作为衡量时,结果得到二者的指纹是如下,其汉明距离为9:
srcFingerPrint: [1 0 1 1 0 1 0 0 0 1 1 1 1 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 1 0 1] dstFingerPrint: [1 0 1 1 0 1 0 1 0 0 1 0 1 1 0 0 1 1 0 1 1 1 1 0 0 0 0 1 0 0 0 1] --- PASS: TestSimHashSimilar (0.83s) similarity_test.go:58: SimHashSimilar distance: 9 PASS所以我们发现了一个对结果判定很重要的参数:分词数量。在上面的示例中,当我们选择10个分词时,其汉明距离仅为4,几乎符合了我们对文本相似(汉明距离3)的判断。而随着topN数量的增加,引入了更多的词组,其汉明距离越来越大,这也说明了,当大文本内容出现时,选择合适的topN分词数量进行比较对结果的影响是十分大的。
注意二:
另外一点需要需要注意的是,simhash的优点是适用于高维度的海量数据处理,当维度降低,如短文本的相似度比较,simhash并不合适,以我们计算余弦相似度的文本为例,
S1: "为什么我的眼里常含泪水,因为我对这片土地爱得深沉" S2: "我深沉的爱着这片土地,所以我的眼里常含泪水"