<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
傳統相似度演演算法:文字相似度的計算,一般使用向量空間模型(VSM),先對文字分詞,提取特徵,根據特徵建立文字向量,把文字之間相似度的計算轉化為特徵向量距離的計算,如歐式距離、餘弦夾角等。
缺點:巨量資料情況下複雜度會很高。
Simhash應用場景:計算大規模文字相似度,實現海量文字資訊去重。
Simhash演演算法原理:通過hash值比較相似度,通過兩個字串計算出的hash值,進行互斥或操作,然後得到相差的個數,數位越大則差異越大。
詞頻(TF):一個詞語在整篇文章中出現的次數與詞語總個數之比;
逆向詞頻(IDF):一個詞語,在所有文章中出現的頻率都非常高,這個詞語不具有代表性,就可以降低其作用,也就是賦予其較小的權值。
分子代表文章總數,分母表示該詞語在這些文章出現的篇數。一般會採取分母加一的方法,防止分母為0的情況出現,在這個比值之後取對數,就是IDF了。
最終用tf*idf得到一個詞語的權重,進而計算一篇文章的關鍵詞。然後根據每篇文章對比其關鍵詞的方法來對文章進行去重。simhash演演算法對效率和效能進行平衡,既可以很少的對比(關鍵詞不能取太多),又能有好的代表性(關鍵詞不能過少)。
Simhash是一種區域性敏感hash。即假定A、B具有一定的相似性,在hash之後,仍然能保持這種相似性,就稱之為區域性敏感hash。
得到一篇文章關鍵詞集合,通過hash的方法把關鍵詞集合hash成一串二進位制,直接對比二進位制數,其相似性就是兩篇檔案的相似性,在檢視相似性時採用海明距離,即在對比二進位制的時候,看其有多少位不同,就稱海明距離為多少。
將文章simhash得到一串64位元的二進位制,根據經驗一般取海明距離為3作為閾值,即在64位元二進位制中,只要有三位以內不同,就可以認為兩個檔案是相似的,這裡的閾值也可以根據自己的需求來設定。也就是把一個檔案hash之後得到一串二進位制數的演演算法,稱這個hash為simhash。
simhash具體實現步驟如下:
Simhash整體流程圖如下:
完全無關的文字正好對應成了相同的simhash,精確度並不是很高,而且simhash更適用於較長的文字,但是在大規模語料進行去重時,simhash的計算速度優勢還是很不錯的。
# !/usr/bin/python # coding=utf-8 class Simhash: def __init__(self, tokens='', hashbits=128): self.hashbits = hashbits self.hash = self.simhash(tokens) def __str__(self): return str(self.hash) # 生成simhash值 def simhash(self, tokens): v = [0] * self.hashbits for t in [self._string_hash(x) for x in tokens]: # t為token的普通hash值 for i in range(self.hashbits): bitmask = 1 << i if t & bitmask: v[i] += 1 # 檢視當前bit位是否為1,是的話將該位+1 else: v[i] -= 1 # 否則的話,該位-1 fingerprint = 0 for i in range(self.hashbits): if v[i] >= 0: fingerprint += 1 << i return fingerprint # 整個檔案的fingerprint為最終各個位>=0的和 # 求海明距離 def hamming_distance(self, other): x = (self.hash ^ other.hash) & ((1 << self.hashbits) - 1) tot = 0 while x: tot += 1 x &= x - 1 return tot # 求相似度 def similarity(self, other): a = float(self.hash) b = float(other.hash) if a > b: return b / a else: return a / b # 針對source生成hash值 def _string_hash(self, source): if source == "": return 0 else: x = ord(source[0]) << 7 m = 1000003 mask = 2 ** self.hashbits - 1 for c in source: x = ((x * m) ^ ord(c)) & mask x ^= len(source) if x == -1: x = -2 return x
測試:
if __name__ == '__main__': s = 'This is a test string for testing' hash1 = Simhash(s.split()) s = 'This is a string testing 11' hash2 = Simhash(s.split()) print(hash1.hamming_distance(hash2), " ", hash1.similarity(hash2))
到此這篇關於如何利用python實現Simhash演演算法的文章就介紹到這了,更多相關pythonSimhash演演算法內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45