Java文本分类问题

我有一组Books对象,类Book定义如下:

Class Book{ String title; ArrayList taglist; } 

标题是书的标题,例如: Javascript for dummies

taglist是我们示例的标签列表: Javascript,jquery,“web dev”,..

正如我所说,有一套书谈论不同的东西:IT,生物,历史……每本书都有一个标题和一组描述它的标签。

我必须按主题将这些书自动分类为分开的集合,例如:

IT书籍:

  • Java for dummies
  • Javascript for dummies
  • 在30天内学习闪光灯
  • C ++编程

历史书:

  • 世界大战
  • 美国在1960年
  • 马丁路德金的一生

生物学书籍:

  • ….

你们知道一种分类算法/方法来申请这类问题吗?

解决方案是使用外部API来定义文本的类别,但问题在于书籍使用不同的语言:法语,西class牙语,英语。

这看起来像是一个相当简单的基于关键字的分类任务。 由于您使用的是Java,因此可以考虑使用Classifier4JWekaLucene Mahout

Classifier4J

Classifier4J支持使用朴素贝叶斯向量空间模型进行分类。

正如在这个使用其朴素贝叶斯分类器进行训练和评分的源代码片段中所看到的,该程序包相当容易使用。 它也是在自由派Apache软件许可下发布的 。

WEKA

Weka是一种非常流行的数据挖掘工具。 使用它的一个优点是,您可以轻松地尝试使用多种不同的机器学习模型将书籍分类为主题,包括朴素贝叶斯决策树支持向量机k近邻逻辑回归 ,甚至是基于规则集的学习者

您将在此处找到有关使用Weka进行文本分类的教程。

然而,Weka是根据GPL分发的。 您将无法将其用于要分发的封闭源软件。 但是,您仍然可以使用它来支持Web服务。

Lucene Mahout

Mahout专为在非常大的数据集上进行机器学习而设计。 它建立在Apache Hadoop之上 ,支持使用朴素贝叶斯进行监督分类。

您将在此处找到有关如何使用Mahout进行文本分类的教程。

与Classifier4J一样,Mahout在自由派Apache软件许可下发布 。

你不想要像这样简单的东西吗?

 Map> m = {}; for (Book b : books) { for (tag t : b.taglist) { m.get(t).add(b); } } 

现在m.get("IT")将返回所有IT书籍等…

当然有些书会出现在多个类别中,但这也会发生在现实生活中……

那么你是否想要制作一个包含书籍集的标签地图?

编辑:

听起来你可能想看一下矢量空间模型来应用类别分类。

Lucene或Classifier4j都提供了一个框架。

您可能想要查找模糊匹配算法,例如Soundex和Levenshtein。