如何对用lucene索引的文档进行分类

时间:2012-02-27 05:50:27

标签: java lucene machine-learning classification

我已将一组文档与Lucene分类(字段:内容,类别)。每个文档都有自己的类别,但其中一些标记为未分类。有没有办法在java中轻松地对这些文档进行分类?

3 个答案:

答案 0 :(得分:3)

分类是机器学习/统计领域的一个广泛问题。在阅读了你的问题后,我觉得你已经使用了一种SQL group by子句(虽然在Lucene中)。如果您希望机器对文档进行分类,而不是您需要了解机器学习算法,如神经网络,贝叶斯,SVM等。在Java中可以使用优秀的库来完成这些任务。为此,您将需要一些功能(从数据中提取的一组属性),您可以在其上训练算法,以便它可以预测您的分类标签。

Java中有一些很好的API(它允许你专注于代码而不需要过多地理解这些算法背后的数学理论,不过如果你知道这将是非常有利的)。 Weka很好。我还看到了Manning的几本书,他们很好地处理了这些任务。你走了:

行动中的集体智慧第10章(分类):http://www.manning.com/alag/

智能网算法的第5章(分类):http://www.manning.com/marmanis/

这些对于分类来说绝对是非常棒的材料(对于Java人来说)特别适合那些不想深入了解理论的人(虽然非常重要:))并且很快就会想要一个有效的代码。

Collective Intelligence in Action解决了使用JDM和Weka进行分类的问题。因此,请看看这两个任务。

答案 1 :(得分:3)

是的,你可以使用MoreLikeThisQuery class为这类事情实现的相似性查询(假设你的lucene索引的文档中有一些大的文本字段)。请查看基础MoreLikeThis class的javadoc,了解其工作原理的详细信息。

要将lucene索引转换为文本分类器,您有两种选择:

  1. 对于分类器的任何新文本,查询具有至少一个类别的前10个或50个最相似的文档,对这些“邻居”中的类别出现进行求和,并在这些类别中查找前3个常见类别文件(例如)。

  2. 或者,您可以通过连接此类别文档的文本(全部或样本)来索引一组新的聚合文档,每个文档对应一个文档。然后运行相似性查询,直接在那些“假”文档上输入文本。

  3. 第一种策略在机器学习中被称为k-Nearest Neighbors分类。第二个是黑客攻击:)

    如果您有许多类别(比如说超过1000个),第二个选项可能会更好(分类更快)。我没有进行任何干净的绩效评估。

    您可能还会找到此blog post interesting

    如果您想使用Solr,则需要启用MoreLikeThisHandler并在内容字段中设置termVectors=true

    python的sunburnt Solr客户端能够执行mlt查询。这是一个原型python分类器,它使用Solr进行分类,使用维基百科类别的索引:

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

答案 2 :(得分:3)

从Lucene 5.2.1开始,您可以使用indexed documents to classify new documents。开箱即用,Lucene提供了一个朴素的贝叶斯分类器,一个k-最近邻分类器(基于MoreLikeThis类)和一个基于Perceptron的分类器。

缺点是所有这些类都标有实验警告,并记录了维基百科的链接。