2011-05-19 38 views
0

我們正在開發一個應用程序來檢測抄襲。我們使用Apache lucene進行文檔索引。我需要使用我們創建的索引爲每個文檔創建一個出現向量。我想知道是否有辦法使用apache lucene來做到這一點。我試圖使用TermFreqVectors,但我找不到合適的方法。任何建議或幫助,高度讚賞。使用Apache Lucene創建一個發生向量

謝謝。

+0

你能三言兩語形容這個次數載體應該看怎麼樣?你的意思是檢索一組定義的術語發生的文檔嗎? – csupnig 2011-05-19 07:01:41

+0

csupnig,謝謝你的考慮。假設有一個單詞w = {a,b,c,d,e},並且如果文檔D1 = {a,b,c}用單詞a寫2次,b寫2次,c寫1次。那麼發生向量應該是V(D1)= <2, 2, 1>。謝謝。 – KasunKP 2011-05-19 08:20:43

回答

0

如果你想達到這個目的,你可以使用一個RAMDirectory存儲你的文檔(假設你只想爲一個文檔執行此操作)。 然後,您可以使用IndexReader.termDocs(術語術語)來獲取此目錄的TermDocs,其中包含文檔ID(只有一個,如果您存儲一個文檔)以及術語在文檔中的頻率。 然後,您可以爲每個術語執行此操作,以創建您的發生向量。

你也可以爲多於一個文檔做到這一點,並一次創建多個發生向量。

http://lucene.apache.org/java/3_1_0/api/all/org/apache/lucene/index/IndexReader.html

正如我敢肯定你想找到的文檔相似性=>類似的文件,你可能想對MoreLikeThis實現的Lucene的樣子:http://lucene.apache.org/java/3_1_0/api/all/org/apache/lucene/search/similar/MoreLikeThis.html

1

TermFreqVector類完成我想,你想要什麼。它甚至可以給你任期的位置,以便你可以檢測有序的單詞序列。要生成向量,你需要在索引時間像這樣來指定這個:

String text = "text you want to index; you could also use a Reader here"; 
Document doc = new Document(); 
doc.add(new Field("text", text, Store.NO, Index.ANALYZED, TermVector.WITH_POSITIONS)); 

在檢索的時候,你可以運行短語查詢(例如,「ABC」〜25)或SpanQuery S(你必須構建在程序上)。

要獲得長期的頻率和位置信息從索引,做這樣的事情:

TermPositionVector v = (TermPositionVector) this.reader.getTermFreqVector(docnum, this.textField); 
int wordIndex = v.indexOf("want"); 
int[] positions = v.getTermPositions(wordIndex); // should return the position(s) of the word "want" in your text