區域性敏感雜湊LSH

2021-07-24 17:17:29 字數 2268 閱讀 3336

參考資料:

簡單介紹:

在茫茫人海中發現相似的你——區域性敏感雜湊(lsh)

:

基本思想

區域性敏感雜湊的基本思想類似於一種空間域轉換思想,lsh演算法基於乙個假設,如果兩個文字在原有的資料空間是相似的,那麼分別經過雜湊函式轉換以後的它們也具有很高的相似度;相反,如果它們本身是不相似的,那麼經過轉換後它們應仍不具有相似性。

文件相似度計算

按照文字處理的術語,我們認為一條微博是一篇文件,度量兩篇文件相似度有多種方法,有歐式距離、編輯距離、余弦距離、jaccard距離,我們這裡使用jaccard距離。這裡注意一下,距離和相似度是不同的概念,距離越近相似度應該越高,距離越遠相似度應該越低,因此similar = 1-distace。

集合s和t的jaccard相識度

當我們不考慮微博中重複出現的詞時,一條微博就可以看成乙個集合,集合的元素是乙個個的詞:

s1 = '''從 決心 ** 的 這 一刻 起 請 做 如下 小 改變 你 做 得 到 麼'''

s2 = '''從 決心 ** 的 這 一刻 起 請 做 如下 小 改變'''

sim(s1,s2)=11/16=0.69.

文件的shingling

為了字面上相似的文件,將文件表示成集合最有效的方法是構建文件中的短字串集合,乙個常用的方法時shingling(不知道翻譯成什麼,囧),看定義很簡單的:文件的k-shingle定義為其中長度為k的子串。對於上面的字串s2,選擇k=2,這s2中的所有2-single組成的集合為:

k值的選取具有一定的技巧,k越大越能找到真正相似的文件,而k越小就能召回更多的文件,但他們可能相似度不高,比如

k=1,就變成了基本詞的比較了

。我這裡詞作為shingle的基本單位,在英文處理中,是以字母為基本單位,原因在於漢字有上萬個,而英文本母只有27個,以漢字為單位將造成shingle集合巨大。

遍歷所用文件,就得到了shingle全集。

保持相似度矩陣表示

1、集合的矩陣表示

s1 =

"我 **"

s2=

"要"s3 =

"他 ** 成功"

s4 =

"我 要 **"

為方便敘述,我們取k=1,這時shingle全集為,將文件表示成特徵矩陣,行代表shingle元素,列代表文件,只有文件j出現元素i時,矩陣m[i][j]=1,否則m[i][j] = 0. 元素

s1s2

s3s4我1

001他

0010

要010

1**10

11成功0

010

實際上,真正計算的過程中矩陣不是這樣表示的,因為資料很稀疏。得到矩陣表示後,我們來看最小hash的定義。

最小雜湊(min-hashing)

最小hash定義為:特徵矩陣按行進行乙個隨機的排列後,第乙個列值為1的行的行號。舉例說明如下,假設之前的特徵矩陣按行進行的乙個隨機排列如下: 元素

s1s2

s3s4他0

010成功

0010

我100

1**10

11要0

101

最小雜湊值:h(s1)=3,h(s2)=5,h(s3)=1,h(s4)=2.

為什麼定義最小hash?事實上,兩列的最小hash值就是這兩列的jaccard相似度的乙個估計,換句話說,兩列最小hash值同等的概率與其相似度相等,即p(h(si)=h(sj)) = sim(si,sj)。為什麼會相等?我們考慮si和sj這兩列,它們所在的行的所有可能結果可以分成如下三類:

(1)a類:兩列的值都為1;

(2)b類:其中一列的值為0,另一列的值為1;

(3)c類:兩列的值都為0.

特徵矩陣相當稀疏,導致大部分的行都屬於c類,但只有a、b類行的決定sim(si,sj),假定a類行有a個,b類行有b個,那麼sim(si,sj)=a/(a+b)。現在我們只需要證明對矩陣行進行隨機排列,兩個的最小hash值相等的概率p(h(si)=h(sj))=a/(a+b),如果我們把c類行都刪掉,那麼第一行不是a類行就是b類行,如果第一行是a類行那麼h(si)=h(sj),因此p(h(si)=h(sj))=p(刪掉c類行後,第一行為a類)=a類行的數目/所有行的數目=a/(a+b),這就是最小hash的神奇之處。

LSH區域性敏感hash 口頭解釋版

網上講lsh這個很多,但是我就沒找到有人講清楚了的,於是寫下這篇文字 這個鏈結是一知乎大神的對shingling,min hash和lsh的理解性講解 前面很容易懂,唯獨lsh,讓人看不懂,我也看了他推薦的鏈結,有篇英文pdf講的這個。看了幾遍,就是沒說破lsh怎麼用,就在講特異度和敏感度的問題。其...

區域性敏感雜湊演算法

該演算法是一種衡量文字相似度的演算法,下面介紹一下這個演算法的主要思想。假設我們有三段文字 1,我愛你中國。2,我愛北京天安門。3,我愛吃蘋果 一,分詞,形成如下矩陣 文字 1 文字 2 文字 3 我 1 1 1 愛 1 1 1 你 1 0 0 中國 1 0 0 北京 0 1 0 天安門 0 1 0...

區域性敏感雜湊 原始LSH C 實現

之前專案中用到lsh演算法來做特徵檢索,對lsh演算法很好奇,最近看了lsh的 依照自己的理解,初步寫了lsh 測試效果不是特別理想,引數的選擇也基本靠嘗試,姑且先把 放上來,之後再改進吧 2016.01.24 include include include include using namesp...