此篇文章主要是闡述了如何運(yùn)用python完成Sim哈希算法,文章內(nèi)容依托于python的相關(guān)信息開(kāi)展Sim哈希算法的詳細(xì)介紹一下,具有很強(qiáng)的參考意義,感興趣的朋友可以了解一下
1.為何需用Simhash?
傳統(tǒng)式相關(guān)性優(yōu)化算法:語(yǔ)義相似度測(cè)算,一般采用線性空間實(shí)體模型(VSM),先向文字中文分詞,提取特征,依據(jù)特點(diǎn)創(chuàng)建文字空間向量,把文字中間相關(guān)性測(cè)算轉(zhuǎn)化成矩陣的特征值之間的距離測(cè)算,如歐氏距離、余弦交角等。
缺陷:大數(shù)據(jù)技術(shù)前提下復(fù)雜性會(huì)比較高。
Simhash應(yīng)用情景:測(cè)算規(guī)模性語(yǔ)義相似度,完成大量文本內(nèi)容去重。
Sim哈希算法基本原理:根據(jù)hash值較為相關(guān)性,根據(jù)2個(gè)字符串?dāng)?shù)組測(cè)算出來(lái)的hash值,開(kāi)展取反實(shí)際操作,隨后獲得相距的數(shù)量,數(shù)據(jù)越多則差別越多。
2.文章內(nèi)容關(guān)鍵字svm算法優(yōu)化算法TD-IDF
高頻詞(TF):一個(gè)成語(yǔ)在全篇文章中存在的頻次與詞句總數(shù)量比例;
反向高頻詞(IDF):一個(gè)成語(yǔ),在大多數(shù)文中出現(xiàn)頻率都很高,這個(gè)詞不有代表性的,就能夠降低它的作用,其實(shí)就是給予其比較小的權(quán)重值。
分子結(jié)構(gòu)意味著文章內(nèi)容數(shù)量,真分?jǐn)?shù)表明該詞句在各種文章內(nèi)容發(fā)生的篇幅。通常會(huì)采用真分?jǐn)?shù)加一點(diǎn)的辦法,避免真分?jǐn)?shù)為0的情況發(fā)生,在這一比率以后取對(duì)數(shù),便是IDF了。
最后用tf*idf獲得一個(gè)成語(yǔ)的權(quán)重值,從而測(cè)算篇文章核心關(guān)鍵詞。再根據(jù)每篇比照其關(guān)鍵字的方法去文章結(jié)構(gòu)開(kāi)展去重。sim哈希算法對(duì)效率特性開(kāi)展均衡,既能非常少對(duì)比(關(guān)鍵字不可以取過(guò)多),又可有一個(gè)好的標(biāo)志性(關(guān)鍵字不可以太少)。
3.Simhash基本原理
Simhash是一類部分比較敏感hash。即假設(shè)A、B具有很強(qiáng)的相關(guān)性,在hash之后,依然可以保持這類相關(guān)性,就稱為部分比較敏感hash。
獲得篇文章關(guān)鍵字結(jié)合,根據(jù)hash的辦法把關(guān)鍵字集合hash成一長(zhǎng)串2進(jìn)制,立即比照二進(jìn)制,其相關(guān)性便是幾篇文本文檔的相關(guān)性,在查詢相關(guān)性時(shí)使用海明間距,則在比照二進(jìn)制情況下,看它的有多少個(gè)位不一樣,就稱海明間距為是多少。
將文章內(nèi)容simhash獲得一長(zhǎng)串64席的2進(jìn)制,依據(jù)工作經(jīng)驗(yàn)通常取海明間距為3做為閥值,則在64位2進(jìn)制中,只要是有3位之內(nèi)不一樣,就能覺(jué)得2個(gè)文本文檔是相近的,這兒的閥值還可以根據(jù)自己的喜好來(lái)設(shè)定。就是把1個(gè)文本文檔hash之后獲得一長(zhǎng)串二進(jìn)制的優(yōu)化算法,稱這一個(gè)hash為simhash。
simhash實(shí)際完成過(guò)程如下所示:
1.將文本文檔中文分詞,取個(gè)論文的TF-IDF權(quán)重值最高前20個(gè)詞(feature)和權(quán)重值(weight)。即一篇文章文本文檔獲得了一個(gè)長(zhǎng)短為20的(feature:weight)的結(jié)合。
2.對(duì)涉及的詞匯(feature),開(kāi)展普通hach以后獲得了一個(gè)64求的2進(jìn)制,獲得長(zhǎng)短為20的(hash:weight)的結(jié)合。
3.依據(jù)(2)中獲得一長(zhǎng)串二進(jìn)制(hash)中相對(duì)應(yīng)位置在1是0,對(duì)相對(duì)應(yīng)部位取正逢weight和負(fù)數(shù)weight。比如一個(gè)詞語(yǔ)經(jīng)過(guò)(2)獲得(010111:5)經(jīng)過(guò)過(guò)程(3)以后可以獲得目錄[-5,5,-5,5,5,5]。從而可以獲得20個(gè)長(zhǎng)短為64的目錄[weight,-weight...weight]意味著1個(gè)文本文檔。
4.對(duì)(3)中20個(gè)目錄開(kāi)展列向累加獲得了一個(gè)目錄。如[-5,5,-5,5,5,5]、[-3,-3,-3,3,-3,3]、[1,-1,-1,1,1,1]開(kāi)展列向累加獲得[-7,1,-9,9,3,9],那樣,對(duì)于1個(gè)文本文檔獲得,1個(gè)長(zhǎng)短為64的目錄。
5.對(duì)(4)中獲得的頁(yè)面上每一個(gè)值作出判斷,當(dāng)以負(fù)數(shù)時(shí)去0,正逢取1。比如,[-7,1,-9,9,3,9]獲得010111,這個(gè)就獲得了一個(gè)文本文檔的simhash值了。
6.測(cè)算相關(guān)性。兩個(gè)simhash取取反,看在其中1的數(shù)量是不是超出3。超出3則認(rèn)定是不類似,應(yīng)當(dāng)小于等于3則認(rèn)定是類似。
Simhash總體流程表如下所示:
4.Simhash的不足
完全無(wú)關(guān)的文本正好對(duì)應(yīng)成了相同的simhash,精確度并不是很高,而且simhash更適用于較長(zhǎng)的文本,但是在大規(guī)模語(yǔ)料進(jìn)行去重時(shí),simhash的計(jì)算速度優(yōu)勢(shì)還是很不錯(cuò)的。
5.Simhash算法實(shí)現(xiàn)
#!/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#查看當(dāng)前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#整個(gè)文檔的fingerprint為最終各個(gè)位>=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 #針對(duì)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 測(cè)試: 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))
綜上所述,這篇文章就給大家介紹到這里了,希望可以給大家?guī)?lái)幫助。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/128830.html
摘要:徘徊和行程所用的時(shí)間使用指數(shù)分布生成,我們將時(shí)間設(shè)為分鐘數(shù),以便顯示清楚。迭代表示各輛出租車的進(jìn)程在各輛出租車上調(diào)用函數(shù),預(yù)激協(xié)程。 前兩篇我們已經(jīng)介紹了python 協(xié)程的使用和yield from 的原理,這一篇,我們用一個(gè)例子來(lái)揭示如何使用協(xié)程在單線程中管理并發(fā)活動(dòng)。。 什么是離散事件仿真 Wiki上的定義是: 離散事件仿真將系統(tǒng)隨時(shí)間的變化抽象成一系列的離散時(shí)間點(diǎn)上的事件,通過(guò)...
摘要:協(xié)作型過(guò)濾協(xié)同過(guò)濾是利用集體智慧的一個(gè)典型方法。這就是協(xié)同過(guò)濾的核心思想。要實(shí)現(xiàn)協(xié)同過(guò)濾,需要以下幾個(gè)步驟搜集偏好尋找相近用戶推薦物品搜集偏好首先,我們要尋找一種表達(dá)不同人及其偏好的方法。 協(xié)作型過(guò)濾 協(xié)同過(guò)濾是利用集體智慧的一個(gè)典型方法。要理解什么是協(xié)同過(guò)濾 (Collaborative Filtering, 簡(jiǎn)稱CF),首先想一個(gè)簡(jiǎn)單的問(wèn)題,如果你現(xiàn)在想看個(gè)電影,但你不知道具體看哪...
摘要:用戶過(guò)去的偏好很可能展示或者反應(yīng)未來(lái)的興趣偏好。數(shù)據(jù)集我們選用,下載地址數(shù)據(jù)集算法理論算法框架如圖,輸入是的評(píng)分矩陣,該矩陣非常稀疏。所以預(yù)測(cè)分兩步進(jìn)行計(jì)算項(xiàng)目之間的相似性和根據(jù)相似性進(jìn)行預(yù)測(cè)評(píng)分。 【參考文獻(xiàn)】:Sarwar B M . Item-based collaborative filtering recommendation algorithms[C]// Internat...
摘要:與介紹將圖片翻譯成文字一般被稱為光學(xué)文字識(shí)別,。是目前公認(rèn)最優(yōu)秀最精確的開(kāi)源系統(tǒng)。我們以圖片為例輸入命令識(shí)別結(jié)果如下只識(shí)別錯(cuò)了一個(gè)字,識(shí)別率還是不錯(cuò)的。最后加一句,對(duì)于彩色圖片的識(shí)別效果沒(méi)有黑白圖片的效果好。 OCR與Tesseract介紹 ??將圖片翻譯成文字一般被稱為光學(xué)文字識(shí)別(Optical Character Recognition,OCR)??梢詫?shí)現(xiàn)OCR 的底層庫(kù)并不多,...
閱讀 956·2023-01-14 11:38
閱讀 936·2023-01-14 11:04
閱讀 787·2023-01-14 10:48
閱讀 2157·2023-01-14 10:34
閱讀 1005·2023-01-14 10:24
閱讀 895·2023-01-14 10:18
閱讀 545·2023-01-14 10:09
閱讀 622·2023-01-14 10:02