Python中内容分类的Orange与NLTK对比
我们需要一个内容分类的模块。贝叶斯分类器看起来正是我想要的。我们应该选择Orange还是NLTK呢?
3 个回答
NLTK是一个工具包,用于支持自然语言处理的四个基本步骤:
- 分词:把字符组合成单词。这一步可以很简单,比如用正则表达式,也可以处理像“can't”这样的缩写形式。
- 标注:给每个单词加上词性标签(比如“NN”表示名词,“VBG”表示动名词)。通常是通过在一个训练语料库上训练模型来完成的,这个语料库就是一大堆已经标注好的句子。
- 短语提取/解析:把每个标注好的句子提取成一个树状结构(比如名词短语)。这可以根据手写的语法规则,或者根据训练好的模型来进行。
- 信息提取:遍历这棵树,提取出数据。这一步就是把具体的“橙子=水果”这样的信息提取出来。
NLTK还支持WordNet,这是一个巨大的语义词典,用来分类单词。例如,“橙子”这个词有五种定义(水果、树、色素、颜色、南非的河流)。每种定义都有一个或多个“上位词路径”,这些路径是分类的层级关系。比如,“橙子”的第一种含义有两个路径:
- orange/citrus/edible_fruit/fruit/reproductive_structure/plant_organ/plant_part/natural_object/whole/object/physical_entity/entity
和
- orange/citrus/edible_fruit/produce/food/solid/matter/physical_entity/entity
根据你的应用领域,你可以把橙子识别为水果、食物或植物的某种东西。然后你可以利用提取出的树状结构来进一步判断(比如谁对这个水果做了什么,等等)。
我不太了解Orange,但我觉得NLTK很不错,给它加个赞:
我之前用过NLTK里的分类工具来对文本和相关的元数据进行分类。默认使用的是贝叶斯算法,但还有其他选择,比如最大熵算法。因为它是一个工具包,你可以根据自己的需要进行定制,比如创建自己的特征(我就是这样做的,针对元数据)。
NLTK还有几本不错的书,其中一本是可以在知识共享协议下获取的(还有O'Reilly出版的书)。
根据文档的说明,每个库中的朴素贝叶斯实现都很简单易用,那为什么不试着用这两个库来处理你的数据,然后比较一下结果呢?
Orange和NLTK都是成熟且稳定的库(每个库都有超过10年的开发历史),它们起源于大型大学,主要共享一些机器学习算法的共同特性。不过,除了这些,它们在范围、目的和实现上有很大的不同。
Orange是一个通用的平台——它并不针对某个特定的学科或商业领域,而是把自己宣传为一个完整的数据挖掘和机器学习平台。它的重点在于工具本身,而不是这些工具在某个特定学科中的应用。
它的功能包括输入输出、数据分析算法和数据可视化画布。
而NLTK则是一个学术项目,最初是在一所大型大学的计算语言学系开发的。你提到的任务(文档内容分类)和你选择的算法(朴素贝叶斯)正好是NLTK功能的核心。NLTK确实有机器学习和数据挖掘算法,但这只是因为它们在计算语言学中有特定的用处。
当然,NLTK包含一些机器学习算法,但仅仅是因为它们在计算语言学中有用,还有文档解析器、分词器、词性分析器等等——这些都是NLTK的一部分。
也许Orange中的朴素贝叶斯实现也很不错,但我还是会选择NLTK的实现,因为它显然是为你提到的特定任务进行了优化。
关于NLTK,尤其是它的朴素贝叶斯在内容分类中的应用,有很多教程。例如,Jim Plus的博客和streamhacker.com上的另一篇文章,提供了很好的NLTK朴素贝叶斯使用教程;第二篇文章还逐行讨论了访问这个模块所需的代码。这两篇文章的作者都报告说使用NLTK得到了不错的结果(前者92%,后者73%)。