2015-11-18 50 views
0

正如我剛纔所知,simhash和minhash可用於此任務。但是所有這些算法都必須遍歷整個文本數據庫,這將非常可靠。 有沒有可以加速任務的優化或其他算法? 我所想到的就是將文本數據庫分成幾個部分,並將兩兩相似性並行。我的文本數據庫有大約10億條記錄。如何檢測大數據上的相似文字?

+0

我使用mongodb來存儲文本。有沒有關於mongodb的東西可以幫助減少遍歷整個數據庫的負載,例如預先存儲文本的哈希碼,這些哈希碼在我的試用之後幫助不大。 –

+0

您必須遍歷數據庫至少一次以執行任何有用的操作。 –

+0

@Juan Lopes,謝謝,我已經將程序遷移到了分佈式計算的火花上,並且運行良好。 –

回答

1

您必須遍歷整個數據庫一次(10億條記錄)。

minhash和simhash的好處是,您不必單獨比較每個可能的對,看看它們是否相似(大概500個可能的配對)。

將數據庫拆分爲多個部分不會有幫助;你會簡單地錯過一些相似之處。如果記錄自然落入組中,您知道它們之間不存在任何相似性(例如,如果您有兩種非常不同的記錄類型,它們彼此從不相似,則可以分別對待它們以進行相似性檢測) 。

simhash和minhash都可以受益於分佈式計算。生成散列可以儘可能多地分發。如果你願意的話,散列的存儲可以用map/reduce拆分,但對於simhash你可能不需要它,因爲它足夠緊湊以適應標準機器的主內存。

Simhash只能找到非常相似的相似性對,而且它經常需要一點點調整才能很好地工作。如果你想找到更寬鬆的相似之處,可以使用一個更寬容的minhash變體。我建議與LSH一起檢查superminhash。 Superminhash是快速生成哈希,但可能更重要的是它實現了更好的精度,因此需要存儲更少的哈希值。 LSH將哈希分組爲條帶,以便您不會比較單個哈希值;你一次比較整個樂隊。這兩種技術意味着需要更少的查詢來查找單獨的共享哈希(或後者情況下的波段),特別是LSH意味着需要爲每個單獨的查詢處理更少的結果。這應該會讓你大幅加速。