2010-05-12 69 views
10

我有一组书籍的对象,班组长定义如下:Java的文本分类问题

Class Book{ 

String title; 
ArrayList<tags> taglist; 

} 

冠军是书的标题,例如:的Javascript傻瓜

标记列表是我们的示例的标签列表:的Javascript,jQuery的,“网站开发”,...

正如我说的是有一个帐套谈论不同的事情:IT,生物,历史,... 每本书都有一个标题和描述它的一套标签..

我不得不automaticaly那些书分为分割出的主题,例如:

IT书籍:

  • 的Java傻瓜
  • 的Javascript傻瓜
  • 学习Flash 30天
  • C++编程

史书:

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

生物学书籍:

  • ....

难道你们知道的分类算法/方法申请那样的问题?

一种解决方案是使用外部API定义文本的范畴,但这里的问题是,书是不同的语言:法语,西班牙语,英语..

+0

是的,但有是书籍之间的一些共同标签:( – Youssef 2010-05-12 19:03:43

+0

相关问题:http://stackoverflow.com/questions/2781752/naive-bayesian-for-topic-detection-using-bag-of-words-approach/2783356#2783356 – dmcer 2010-05-12 19:26:41

+0

不错谢谢你(y) – Youssef 2010-05-12 21:22:47

回答

29

这看起来像是一个相当简单的基于关键词的分类任务。由于您使用的是Java,因此要考虑的良好软件包为Classifier4J,WekaLucene Mahout

Classifier4J

Classifier4J支持使用naive Bayesvector space模型分类。

正如在source code snippet关于使用朴素贝叶斯分类器的训练和评分中看到的,该软件包相当易于使用。它也在自由派Apache Software License下分发。

Weka的

Weka的是数据挖掘的一个非常受欢迎的工具。使用它的一个优点是,您将能够轻松尝试使用众多的different machine learning models将书籍分类为主题,包括naive Bayes,decision trees,support vector machines,k-nearest neighbor,logistic regression,甚至是rule set based learner

你会发现关于使用Weka进行文本分类的教程here

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

Lucene的亨利马乌

亨利马乌是专为做机器学习上非常大的数据集。它建立在Apache Hadoop之上,并支持使用朴素贝叶斯的监督分类。

你会发现一个教程,涵盖如何使用Mahout的文本分类here

和Classifier4J一样,Mahout在自由派Apache Software License下发行。

+0

好暗示谢谢 – Youssef 2010-05-12 21:22:19

+0

使用classfier4j,VectorClassifier为我工作最好 – Indraneel 2015-08-19 04:43:33

-1

你可能想查找fuzzy matching algorithms如Soundex和Levenshtein。

+0

酷,这是一个很好的方法来计算2个字符串之间的距离,谢谢 – Youssef 2010-05-12 19:06:43

+0

你能详细说明你将如何使用Soundex和Levenshtein将关键字列表映射到主题? – dmcer 2010-05-12 19:25:28

0

所以你正在寻找一个持有书籍集合的标签地图?

编辑:

听起来像是你可能想看看一个Vector Space Model申请类别的分类。

LuceneClassifier4j提供了一个框架。

+0

我正在寻找一个书籍对象的地图,其中的关键是类别名称。 – Youssef 2010-05-12 19:03:13

+0

@yox:制作地图。这是你的答案。 – 2010-05-12 19:18:38

+0

我不想通过标签书籍..我想通过主题(地图键)这里不存在的书籍,这将是一个人工生成的字符串 – Youssef 2010-05-12 21:03:44

0

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

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

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

当然有些书会出现在多个类别,但这种情况发生在现实生活中,太多......

+0

不,标签是如果你想在书中的重要单词列表.. 这将有助于分组书籍。 – Youssef 2010-05-12 21:01:10

+0

@yox:啊所以你想根据书中的标签分类主题?或基于书本文字?并且标签/书本文本可以使用不同的语言? – Claudiu 2010-05-12 21:23:19

+0

exaclty,我想分类只使用标签和标签是在不同的语言。 – Youssef 2010-05-13 13:19:35