2015-04-07 83 views
0

我需要爲我的應用程序創建簡單的搜索引擎。讓我們簡化爲以下內容:我們有一些文本(很多),我需要搜索並顯示相關結果。信息檢索中的Porter stemmer算法

我基於這個偉大的article擴展了一些東西,它適用於我。

但我有詞幹術語的問題。舉例言之「註釋」,「註釋」等將被梗爲「ANNOT」,但是想象一下,你嘗試搜索一些東西,你會看到意想不到的結果:

  • 「阿魯」 - 沒有什麼
  • 「annota 「 - 無 等

只有單詞」annot「會給出相關結果。那麼,我應該如何改進搜索以提供預期的結果?因爲「annot」包含「anno」,「annota」比「annot」略多。使用包含所有的時間顯然不是解決方案

如果在第一種情況下,我可以使用一些Ternary search tree,在第二種情況下,我不知道該怎麼辦。

任何想法都會非常有幫助。

UPDATE

oleksii指出我的n-gram here,這可能對我的作品,但我不知道如何正確地指數正克。

所以問題

  • 哪些數據結構是最適合我的需要
  • 如何正確索引我正克

回答

1

詞幹也許並不多與此有關。詞幹會將複數轉換爲單數形式。

鑑於你有一個記號器,一個詞幹分析器和一個清理器(可以刪除停用詞,也許標點符號和數字,簡短的單詞等),你正在看的是一個全文搜索。我會建議你得到一個現成的解決方案(如Elasticsearch,Lucene,Solr),但是如果你喜歡DIY方法,我可以推薦以下簡單的實現。

第1步
創建一個搜索導向的記號。一個例子是n-gram記號器。這將需要你的話,並分爲以下順序:

 
annotation 
1 - [a, n, o, t, a, i] 
2 - [an, nn, no, ot, ...] 
3 - [ann, nno, not, ota, ...] 
4 - [anno, nnot, nota, otat, ...] 
.... 

步驟2
排序正克更有效的查找

步驟3
搜索正克精確匹配使用二進制搜索

+0

這使得sence,謝謝。也許你可以指出如何執行n-gram的索引? – nrudnyk