2012-02-27 58 views
5

索引的文檔分類我已經歸入與Lucene的一組文檔(領域:內容,類別)。每個文檔都有自己的類別,但其中一些文檔被標記爲未分類。有沒有辦法在java中輕鬆分類這些文檔?如何使用Lucene

回答

3

分類是機器學習/統計領域的廣泛問題。讀完你的問題後,我覺得你已經使用了一種SQL group by子句(儘管在Lucene中)。如果您希望機器對文檔進行分類,則需要了解機器學習算法,如神經網絡,貝葉斯,SVM等。Java中有這些優秀的庫用於這些任務。爲了這個工作,你將需要特徵(從數據中提取的一組屬性),你可以在其上訓練算法,以便它可以預測你的分類標籤。

有一些Java API良好的(它允許你專注於代碼,而無需瞭解這些算法背後的數學理論,但如果你知道這將是非常有利的,太多的事情)。 Weka很好。我也遇到了Manning的幾本書,它們很好地處理了這些任務。在這裏你去:

第10章集體智慧(分類)在行動:智能Web的算法http://www.manning.com/alag/

第5章(分類):http://www.manning.com/marmanis/

這是絕對精彩的材料(用於Java的人)在分類特別適合那些只是不想深入理論的人(儘管非常重要:)),並且很快需要一個有效的代碼。在行動

集體智慧解決了分類的使用JDM和Weka的問題。所以看看這兩個爲你的任務。

+0

當然,我可以從我的索引產生的Lucene提取功能。讓我看看這本書,我會回來;) – orezvani 2012-02-28 08:03:43

+0

我認爲這些ML中的許多問題是,他們產生單標籤分類,它是理想的多標籤分類。我可能是錯的,但Weka很好地實現了這一點。其餘的人看起來並不像他們做的那樣。 – 2013-10-20 19:22:32

3

是的,你可以使用相似的查詢,如由MoreLikeThisQuery class對於這樣的事情(假設你有文件爲您Lucene索引一些大的文本字段)來實現。查看底層MoreLikeThis class的javadoc,瞭解它的工作原理。

要打開你的Lucene索引到一個文本分類,你有兩個選擇:

  1. 對於任何新文本分類,查詢有至少一個類別中的前10名或50名最相似的文檔,總和這些「鄰居」之間的類別出現次數,並從這些類似文件中挑選前3個頻繁類別(例如)。

  2. 或者,您可以通過連接(該類別的文檔的全部或一部分)每個類別一個索引一組新的聚合文檔。然後運行相似性查詢,直接在這些「假」文檔上輸入文本。

第一種策略在機器學習中稱爲k-最近鄰居分類。第二個是破解:)

如果你有很多類別(比如超過1000),第二個選項可能會更好(分類速度更快)。儘管如此,我還沒有進行任何清潔績效評估。

您也可能會發現這個blog post interesting

如果您想使用Solr,則需要啓用MoreLikeThisHandler並在內容字段上設置termVectors=true

python的sunburnt Solr客戶端能夠執行mlt查詢。下面是使用維基百科類的索引,使用Solr的分類原型蟒蛇分類:

https://github.com/ogrisel/pignlproc/blob/master/examples/topic-corpus/categorize.py

+0

謝謝你的建議,但是大概有10^6個文件需要分類,是第一個選擇好嗎? – orezvani 2012-02-28 08:04:33

+0

我認爲第一個更容易實現:你不需要任何新的對象在你的索引。如果它不適合您的應用程序,請嘗試使用後者。我沒有足夠的經驗可以肯定地知道。 要對批量分類中的許多示例進行分類可能需要一些時間。根據最大查詢條件(我使用30)的數量,如果使用帶狀皰疹和索引中具有類別的文檔數量,則單個查詢時間可能會很長,例如300毫秒。 培訓mahout SGD分類器和批量預測一次性特徵提取可能會更快。 – ogrisel 2012-02-28 08:56:31