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