在大数据中如何寻找相似的文档(shingle, minhash, LSH)(一)
生活随笔
收集整理的這篇文章主要介紹了
在大数据中如何寻找相似的文档(shingle, minhash, LSH)(一)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
ps: 文章翻譯與 Mining of Massive Datasets
場景:在一堆非常多的文檔中,找到相似的文檔,或者對文檔間的相似性進(jìn)行評估。
當(dāng)應(yīng)用于此類目的的時候,我們最常用的用來表示一篇文檔的方法是:shingling。 1. k-shingles 可以把一篇文檔看成一個字符串。那么一篇文檔的k-shingle就是在這篇文檔中出過現(xiàn)的任何長度為k的字符串。k-shingles就是改篇文檔所有k-shingle的集合。 (那么k的大小決定于什么因素呢? 與文檔的長度和所有的字符個數(shù)有關(guān)。k的取值一般要滿足一個規(guī)則:k的取值應(yīng)該能夠滿足,任何一個給定的shingle出現(xiàn)在任何給定的文檔中的概率都非常低。) ?(一般對于郵件類的文檔,k取值為5是最為合適的。假設(shè)在郵件中一般只會出現(xiàn)字母字符和空格字符。那么將會有27^5=14,348,907個可能的shingles。而一般的Email的字符長度會遠(yuǎn)小于14million。而在實際的測試中k=5也確實是表現(xiàn)的非常好。而對于長文檔,如研究論文等k取9是一個安全的取值。) 2. Hashing Shingles 我們可以選擇一個hash函數(shù)來將k-shingle映射成為數(shù)值,這樣對文檔的表示形式就是一群整數(shù)的集合。 3. ?對于單詞建立shingles 除了將文檔看成字符串,我們也可以以單詞為個體建立shingle。對于新聞類的文檔,建立單詞的shingle是非常有效的。(對于新聞類的文檔,會出現(xiàn)非常多的停用詞,停用詞一般不能告訴我們文檔的重要信息,所以一般會先去掉停用詞) (然而,對于在新聞類文檔中找到兩個類似的文檔問題,研究發(fā)現(xiàn),對于這樣的shingle:‘一個停用詞后邊緊跟著兩個詞,不管后邊的兩個詞是不是停用詞’ ? 能夠形成非常有用的shingles集合。它的好處在于,可以讓新聞類文檔形成的shingles集合中,與webPage本身有關(guān)的多于與周圍環(huán)境有關(guān)的?<原因未知,書中也沒有更多的說明>。這樣非常合適這樣的目的:在一大堆網(wǎng)頁中,找出網(wǎng)頁中文章是相關(guān)的,而不管文章周圍的內(nèi)容。) 4. ?保持相似度的集合摘要(MinHashing) 可以發(fā)現(xiàn),文檔的shingles集合是非常大的,盡管我們用hash將其映射為4byte或者更大的整數(shù)。假設(shè)我們有上百萬的文檔,那么內(nèi)存中就會放不下這些shingles的集合。 我們的目標(biāo)就是把大數(shù)據(jù)量的shingles集合變換為非常小的代表(稱之為簽名)。而且這樣的簽名應(yīng)該有這樣的性質(zhì): 能夠很容易的對兩個簽名集合進(jìn)行比較,并且能夠較簡單的計算兩個簽名集合的jaccard距離;而且,簽名集合計算出來的的相似度(jaccard距離)應(yīng)該和實際的相差不大,簽名集合越大,越能接近準(zhǔn)確值。 MinHashing就是具有這些性質(zhì)的獲取簽名的一種有效方法。 簽名一般大概會取幾百個左右,每一個值都是原代表集合的一個不同的MinHash值。 那么如何計算一個集合的minhash值呢? 首先,對集合的表示方法進(jìn)行改變,假設(shè)現(xiàn)在三篇文檔,我們用下面的方式來表示,稱之為characteristic matrix; 左邊的一列是所有出現(xiàn)過的元素。這樣每一篇文檔被表示為0,1集合。| element | s1 | s2 | s3 |
| a | 1 | 0 | 0 |
| b | 0 | 0 | 1 |
| c | 0 | 1 | 0 |
| d | 1 | 0 | 1 |
| e | 0 | 0 | 1 |
| row | s1 | s2 | s3 | s4 | h1= x+1 mod 5 |
| 0 | 1 | 0 | 0 | 1 | 1 |
| 1 | 0 | 0 | 1 | 0 | 2 |
| 2 | 0 | 1 | 0 | 1 | 3 |
| 3 | 1 | 0 | 1 | 1 | 4 |
| 4 | 0 | 0 | 1 | 0 | 0 |
總結(jié)
以上是生活随笔為你收集整理的在大数据中如何寻找相似的文档(shingle, minhash, LSH)(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python中eval函数的作用
- 下一篇: VSCode+Marp:用Markdow