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

Java 如何对使用lucene索引的文档进行分类,java,lucene,machine-learning,classification,Java,Lucene,Machine Learning,Classification,我用Lucene对一组文档进行了分类(字段:内容、类别)。每个文档都有自己的类别,但其中一些文档被标记为未分类。在java中有什么方法可以轻松地对这些文档进行分类吗?分类是机器学习/统计领域的一个广泛问题。在阅读了您的问题之后,我觉得您使用了某种SQL group by子句(尽管是在Lucene中)。如果您希望机器对文档进行分类,那么您需要了解机器学习算法,如神经网络、贝叶斯、SVM等。Java中有用于这些任务的优秀库。为了实现这一点,您需要特征(从数据中提取的一组属性),您可以在这些特征上训练

我用Lucene对一组文档进行了分类(字段:内容、类别)。每个文档都有自己的类别,但其中一些文档被标记为未分类。在java中有什么方法可以轻松地对这些文档进行分类吗?

分类是机器学习/统计领域的一个广泛问题。在阅读了您的问题之后,我觉得您使用了某种SQL group by子句(尽管是在Lucene中)。如果您希望机器对文档进行分类,那么您需要了解机器学习算法,如神经网络、贝叶斯、SVM等。Java中有用于这些任务的优秀库。为了实现这一点,您需要特征(从数据中提取的一组属性),您可以在这些特征上训练您的算法,以便它可以预测您的分类标签

Java中有一些很好的API(它允许您专注于代码,而不必过多地理解这些算法背后的数学理论,尽管如果您知道这将非常有利)。韦卡很好。我还看到了曼宁的几本书,它们很好地处理了这些任务。给你:

第10章(分类)行动中的集体智慧:

第五章智能网算法分类:

这些绝对是很棒的分类材料(对于Java用户来说),特别适合那些不想深入研究这个理论(虽然非常重要:)并且很快就想要一个工作代码的人


集体智能行动解决了使用JDM和Weka进行分类的问题。因此,请在您的任务中查看这两个方面。

是的,您可以使用相似性查询,例如由实现的,用于这类事情(假设您的lucene索引的文档中有一些较大的文本字段)。查看底层的javadoc,了解其工作原理的详细信息

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

  • 对于任何要分类的新文本,查询至少有一个类别的前10个或50个最相似文档,将这些“邻居”中出现的类别相加,并在这些相似文档中选择前3个最常见的类别(例如)

  • 或者,您可以为一组新的聚合文档编制索引,通过连接(所有或一个样本)此类文档的文本,每个类别一个。然后运行相似性查询,直接在这些“假”文档上输入文本

  • 第一种策略在机器学习中称为k近邻分类。第二个是黑客:)

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

    你可能也会发现这个

    如果要使用Solr,需要启用MoreLikeThishHandler并在内容字段上设置
    termVectors=true

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


    从Lucene 5.2.1开始,您可以使用。Lucene提供了一个开箱即用的朴素贝叶斯分类器、一个k-最近邻分类器(基于类)和一个基于感知器的分类器


    缺点是,所有这些类都标有实验性警告,并附有指向维基百科的链接。

    当然,我可以从Lucene生成的索引中提取特征。让我看看这本书,我会回来的;)我认为许多ML的问题在于,它们产生单标签分类,而多标签分类是理想的。我可能错了,但Weka很好地实现了这一点。其余的似乎不是他们做的。谢谢你的建议,但是有大约10^6个文档需要分类,第一个选项好吗?我认为第一个选项更容易实现:你不需要在索引中添加任何新对象。如果它对您的应用程序来说不够好,也可以尝试后者。我没有足够的经验来确定。要分批对这么多示例进行分类可能需要一些时间。根据max query term上的数字(我使用30),如果使用shingle和索引中具有类别的文档数量,单个查询时间可能相当长,比如300ms。训练mahout SGD分类器并在一次性特征提取上批量预测可能会更快。