2010-02-03 118 views
4

如何爲 標籤集描述的項目實現「類似項目」系統?如何高效地實現文檔相似性搜索系統?

在我的數據庫中,我有三個表,Article,ArticleTag和Tag。每個 文章通過多對多的關係與多個標籤相關。對於每篇文章,我想找到五個最相似的 文章來實施「如果你喜歡這篇文章,你也會喜歡這些 太」系統。

我熟悉Cosine similarity 並且使用該算法效果很好。但這是一種緩慢的方式。對於 每篇文章,我需要對所有文章進行迭代,計算文章對的餘弦相似度 ,然後選擇具有最高相似性評分的五篇 文章。

隨着200k條和30k標籤,它需要我半分鐘到 計算單篇文章的類似文章。所以我需要 另一種算法,其產生的結果大致與cosine 相似,但可以實時運行,並且不需要 me每次遍歷整個文檔語料庫。

也許有人可以爲此提出一個現成的解決方案?我查看的搜索引擎大部分都是 ,它們不會啓用文檔相似性 搜索。

+0

Bjorn,請看看[simbase](https://github.com/guokr/simbase/tree/develop),它仍在開發中,但目的只是你的問題。它已經完成,最後一項工作是持久層和性能調整。如果你有時間,你可以試試。謝謝。 – Mountain 2013-12-29 22:23:21

回答

1

一些問題,

  • 是如何從ArticleTag不同的標籤?或者是M2M映射表?
  • 您可以勾畫出您是如何實現餘弦匹配算法的嗎?
  • 爲什麼不將文檔標籤存儲在某種內存數據結構中,僅使用它來檢索文檔ID?這樣,您只需在檢索時間點擊數據庫。
  • 根據文檔添加的頻率,該結構可以設計用於快速/慢速更新。

對於答案的初始直覺 - 我想說,一個在線聚類算法(也許對共生矩陣做一個主成分分析,它將近似一個K均值聚類?)。一旦你回答了上面的一些問題,就會更好地完善。

乾杯。

+0

1.是ArticleTag是M2M表格。 2.它的實現像維基百科文章規定的那樣。文章的標籤 被視爲向量,其中標籤的出現次數爲1,其值爲0,省略0。 3.我在內存中存儲文檔ID及其標籤ID,這當然是 加快了這個過程,但它仍然很慢。 我認爲k-means聚類可能是我需要的,但我不能很好地看到 如何在這種情況下使用它 – 2010-04-08 11:51:33

0

您可以使用Lemur工具包。使用KeyfileIncIndex,您必須從其來源重新檢索文檔; IndriIndex支持從索引中檢索文檔。

但無論如何,你要索引你的文檔,然後你從你想要找到類似文檔的文檔中建立一個查詢。然後,您可以使用該查詢進行搜索,並將其他文檔評分爲相似度。我的經驗非常快。它將源文檔和基本查詢都視爲文檔,因此找到相似之處確實如此(除非您使用Indri解析器的東西 - 這有點不同,我不確定它是如何工作的)。

+0

這與普通文本搜索引擎的工作方式沒有什麼不同。問題的實質在於要找到十個最佳匹配項,必須找到搜索查詢與數據庫中每個文檔之間的相似性分數。然後,你必須在相似度上排序他們,並採取十個最好的。因爲你必須瀏覽每篇文章的完整數據庫,所以你想找到相似的地方,這樣會變慢。 – 2010-04-08 11:44:30