2010-06-29 41 views
5

我想用Lucene獲取一些經常出現的短語。我從TXT文件中獲得一些信息,並且由於沒有關於短語的信息而丟失了很多上下文。 「信息檢索」被索引爲兩個單獨的詞。如何用Lucene獲取經常出現的短語

獲得這樣的短語的方法是什麼?我無法在互聯網上找到任何有用的東西,所有的建議,鏈接,提示尤其是例子,非常感謝!

編輯:我存儲我的文檔只是標題和內容:爲我做的最重要的,因爲

Document doc = new Document(); 
doc.add(new Field("name", f.getName(), Field.Store.YES, Field.Index.NOT_ANALYZED)); 
doc.add(new Field("text", fReader, Field.TermVector.WITH_POSITIONS_OFFSETS)); 

是該文件的內容。標題通常根本不具描述性(例如,我有許多標題爲代碼或數字的PDF學術論文)。

我迫切需要從文本內容中索引出現的頂級短語,剛纔我看到這個簡單的「包字」方法效率不高。

回答

7

朱莉婭,看來你所尋找的是n-grams,特別是Bigrams(也稱爲搭配)。

這是來自Manning和Schutze的Foundations of Statistical Natural Language Processingchapter about finding collocations (PDF)

爲了做到這一點與Lucene,我建議使用SolrShingleFilterFactory。 詳情請參閱this discussion

+0

是的,我需要的是ngrams ....我希望我不會過多地進入NLP:/ ..但我可以問你,請在我走之前在本書的章節中,如果我使用的是你推薦的工具(如果我管理的話),在搜索時間內找到ngrams,而不是在索引時間內? 作爲最終結果,我可以獲得一個索引,和頻繁的ngram? 因爲我正在做一些概念與本體匹配,並且這將是最好的解決方案(如果可能的話) Thanx! – Julia 2010-06-29 12:57:13

+0

+1正確識別問題m ... :) – Favonius 2010-06-29 13:20:16

+0

@Julia:我認爲你可以在索引期間應用ShingleFilterFactory。也許你可以使用Luke(http://wiki.apache.org/solr/LukeRequestHandler)查看結果。希望你現在有足夠的能力讓你走。 – 2010-06-30 12:36:25

0

您可以發佈您編寫的任何代碼嗎?

基本上很大程度上取決於您在lucene中創建字段和存儲文檔的方式。

讓我們考慮一個情況,我有兩個字段: ID和註釋;並且在我的ID字段中,我允許這樣的值「查找nemo」,即帶有空格的字符串。而「評論」是一個自由流動的文本字段,即我允許任何事情和我的鍵盤允許的任何內容以及lucene可以理解的內容。

現在在現實生活中,使我的ID變得沒有意義:將'nemo'作爲兩個不同的可搜索字符串。而我想在評論中對所有內容進行索引。

所以我會做的是,我將創建一個文件(org.apache.lucene.document.Document)對象來照顧這......這樣的事情

Document doc = new Document(); 
doc.add(new Field("comments","Finding nemo was a very tough job for a clown fish ...", Field.Store.YES, Field.Index.ANALYZED)); 
doc.add(new Field("id", "finding nemo", Field.Store.YES, Field.Index.NOT_ANALYZED)); 

所以,基本上我已經創建了兩個領域:

  1. 評論:我哪裏有最好分析它通過使用Field.Index.ANALYZED
  2. ID:凡我針對Lucene的存儲,但不要分析它Field.Index.NOT_ANALYZED

這是你如何自定義lucene默認Tokenizer和分析器。否則,您可以編寫自己的Tokenizer和分析器。

鏈接(補) http://darksleep.com/lucene/

希望這將幫助你... :)

+0

謝謝你的回覆Favonius!我編輯了我的帖子,所以你可以看到我如何索引文檔。如果我明白你在說什麼,只使用標題中的信息,將不適合我的情況..? :( – Julia 2010-06-29 12:47:18

+0

@Julia:其實我的回答是部分正確的,我誤解了n-gram問題是一個簡單的索引問題:o。儘管只考慮'id'(你的案例中的'title')可能不合適。 。我認爲你已經認識到了...... – Favonius 2010-06-29 13:18:30

0

那麼丟失短語上下文的問題可以通過使用PhraseQuery來解決。

只要您沒有通過使用omitTermFreqAndPositions選項建立索引來創建純布爾 字段,則默認情況下索引包含術語的位置信息。 PhraseQuery使用此信息來查找條款相互之間的距離在一定範圍內的文檔。

例如,假設一個字段中包含短語「快速棕色狐狸跳過懶狗」。不知道確切的短語,您仍然可以通過搜索具有快速和狐狸彼此附近字段的文檔來找到此文檔。當然,一個簡單的TermQuery會找到這個文檔來知道這些單詞中的任何一個,但在這種情況下,我們只希望文檔中包含單詞並排(快速狐狸)或單詞之間有一個單詞的短語快[無關]狐狸)。 被視爲匹配的術語之間的最大允許位置距離稱爲斜面。 距離是按順序重構短語的位置移動項的數量。

退房Lucene's JavaDoc for PhraseQuery

See this example code which demonstrates how to work with various Query Objects:

您也可以嘗試不同的查詢類型與BooleanQuery類的幫助相結合。

關於短語的頻率,我猜想Lucene的評分考慮了文檔中出現的術語的頻率。