2010-05-27 42 views
3

我想寫一個免費的文本搜索算法,以找到牆上的特定帖子(與Facebook使用類似類型的牆壁)。用戶假設能夠在搜索字段中寫入一些單詞並獲得包含該單詞的帖子的命中;根據比賽得分,最佳匹配在最上面,然後其他帖子按降序排列。寫一個後期搜索算法

我使用編輯距離(Levenshtein)「e(x,y)= e」來計算每個帖子與查詢詞「x」和帖子詞「y」相比的得分,根據:score (x,y)= 2 ^(2-e)(1-min(e,| x |)/ | x |),其中「| x |」是查詢字中的字母數。

帖子中的每個單詞都會貢獻該特定帖子的總分。當帖子尺寸大致相同時,這種方法似乎運作良好,但某些時候,某些大型帖子設法將得分僅僅歸因於他們中有很多詞,而實際上與查詢無關。

我是以錯誤的方式接近這個問題,還是有一些方法來規範我沒有想到的分數?

回答

1

是的。有許多可以使用的標準化方法。這是一個經過深入研究的領域!

看看the vector space model。 TDF/IDF可能與你正在做的事情有關。它與你使用的方法沒有嚴格的關係,但可以給你一些標準化的線索。

另請注意,比較每個帖子將O(N),可能會變得非常緩慢。與stemmming可能會有更好的結果,而不是字符串距離。然後,您可以將其放入VSM倒排索引。

許多數據庫(包括MySQL和Postgres)都有全文搜索。這可能比自己做得更實際。

+0

謝謝,tf-idf看起來很有前途。我只需要將它應用於我的問題,因爲我使用的搜索查詢可以由幾個單詞組成,如果它們存在於同一個帖子中,它們的出現應該更加重要。在牆上的帖子數量是非常適度的(最多10000個帖子),但由於我需要比較每個搜索詞與所有帖子中的所有單詞,我得到O(N^3)...也許它只是簡單地使用全文搜索併入MS SQL 2008數據庫中。我開始研究它的原因是因爲我想要一個模糊詞搜索,但也許數據庫可以處理這個問題? – MdaG 2010-05-27 14:56:42

+0

我不知道MSSQL,但Postgres一個非常好,非常可定製。我試圖做類似於你的事情(模糊字符串匹配文檔,但不是文本)。目前的解決方案是將模糊匹配算法分解到中心,並在中間放置向量空間搜索。似乎爲我工作! folktunefinder.com – Joe 2010-05-27 15:07:24