我想要一台机器来学习对短文本进行分类

时间:2010-04-23 05:23:43

标签: machine-learning nlp classification

我有大约500字的短篇小说,我想将它们分为20个类别中的一个:

  • 娱乐
  • 食物
  • 音乐

我可以对其中的一些进行手工分类,但我想实现机器学习以最终猜测类别。什么是最好的方法来解决这个问题?我应该使用机器学习的标准方法吗?我认为决策树不会很好,因为它是文本数据......我在这个领域是全新的。

任何帮助将不胜感激,谢谢!

8 个答案:

答案 0 :(得分:24)

naive Bayes最有可能适合您。方法是这样的:

  • 修复多个类别并获取(文档,类别)对的训练数据集。
  • 您的文档的数据向量将像一袋文字。例如除了“the”,“and”之类的单词之外,请使用100个最常用的单词。每个单词都会获得数据向量的固定组成部分(例如“食物”是位置5)。然后,一个特征向量是一个布尔数组,每个布尔值指示该单词是否出现在相应的文档中。

训练:

  • 对于您的训练集,计算每个特征和每个类的概率:p(C)= C类文档/文档总数。
  • 计算类中要素的概率:p(F | C)=具有给定要素的类的文档数(=文本中的“食物”一词)/给定类中的文档数。

决定:

  • 给定一个未分类的文件,它属于C类的概率与P(C | F1,...,F500)= P(C)* P(F1 | C)* P(F2 | C)成正比* ...... * P(F500 | C)。选择最大化此术语的C.
  • 由于乘法在数值上是困难的,你可以使用日志的总和代替,它在相同的C处最大化:log P(C | F1,...,F500)= log P(C)+ log P( F1 | C)+ log P(F2 | C)+ ... + log P(F500 | C)。

答案 1 :(得分:10)

我已经分类了成千上万的短文。我最初做的是使用tf-idf向量空间模型,然后对这些向量进行k均值聚类。这是探索性数据分析的一个非常好的初始步骤,可以很好地处理您的数据集。我用来聚类的包是cluto:http://glaros.dtc.umn.edu/gkhome/views/cluto/

要做tf-idf,我只是在perl中写了一个快速脚本来标记非字母数字。然后,每个文件都包含一个单词。每个文档都表示为它包含的单词的向量。向量的每个索引的值是术语频率(tf)*逆文档频率(idf)。它只是文档中该单词/术语计数乘以包含该单词的文档分数的倒数的乘积。 (因为像“the”这样的词语非常缺乏信息。)

这种方法可以快速达到80%-90%的准确率。然后,您可以手动标记正确的(或更重要的是:错误的),然后在您选择时进行监督学习。

答案 2 :(得分:6)

我认为论文“自动文本分类中的机器学习”(可以谷歌和下载PDF文件)值得一读。本文讨论了两个关键部分:一个用于特征选择(将文本转换为特征空间),另一个用于在特征空间上构建分类器。 有很多特征选择方法,以及几种分类方法(决策树,朴素贝叶斯,kNN,SVM等)。您可以尝试使用某种组合来查看它是否适用于您的数据集 之前我做过类似的事情,我使用Python进行文本操作,功能选择和功能加权。和Orange分类器。 Orange和Weka已经包含了朴素的贝叶斯,kNN ......,但是现在我可能直接用Python脚本编写分类器,它也不应该太难。
希望这会有所帮助。

答案 3 :(得分:3)

大多数人会说统计文本分析(如朴素的贝叶斯方法)是标准方法:“统计自然语言处理的基础”,Manning和Schuetze以及“语音和语言处理”,Jurafsky和Martin是标准参考。统计文本分析成为90年代后期的标准方法,因为它们很容易超越符号系统。然而,一些符号系统包含统计元素,您也可以实际使用连接主义方法(有一些论文证明了这一点)。你也可以使用余弦相似性(k-Nearest Neighbor的一种形式),虽然天真的贝叶斯通常是表现最好的。

以下是一个很好的概述:http://www.cs.utexas.edu/users/hyukcho/classificationAlgorithm.html我在该网页上提到的彩虹用于我在dot com项目上编写的搜索引擎原型上的文本分类。

答案 4 :(得分:2)

除非您将来有可能再进行500次分类,否则我不确定是否会采用机器学习方法。

除非类别非常相似(以“食物”和“意大利食物”为例),我认为一个非常天真的启发式方法可以很好地运作。

对于每个类别,建立一个常用词汇表(用于食物:“马铃薯”,“食物”,“厨师”,“番茄”,“餐馆”,...)以及每个文本计数哪个类别得到最多单词匹配。 您可以手动构建字典(例如100个),然后手动对其进行分类,然后让算法挑出单词,然后确保删除所有集合之间通用的单词(因为它们不是没有提供信息)。从本质上讲,这是一个非常简单的“学习”系统。

如果您真的想要机器学习系统,可以使用多种方法进行分类。缺点是虽然大多数方法实现起来都很简单,但难点在于选择一种好的方法,正确的特性和良好的参数。

答案 5 :(得分:2)

尝试Weka ...它是一个免费的数据挖掘工具,可以实现许多机器学习算法。它有一个GUI和一个API,因此您可以直接在数据集上使用它,也可以对它进行编程。

如果您喜欢各种机器学习算法的结果,并且您仍然对实现自己的算法感兴趣,那么您可以实现您最喜欢的算法。这也可以帮助你删除在构建ML / AI算法之前通常会得到的“它实际上会有效”的感觉。

答案 6 :(得分:1)

我们可以在这里使用NLP。以下是我实施的在不同类别中对电子邮件进行分类的步骤: 1.词形还原:这将删除不必要的细节,并将所有单词转换为基本形式或根形式。比如,它会将工作转化为工作,跑步,马匹转为马等。我们可以为此目的使用Stanford Lemmatizer。 http://stanfordnlp.github.io/CoreNLP/

  1. Wordnet过滤:我们只能使用Wordnet中存在的那些词。我为此目的使用了Java Wordnet接口。只需过滤掉wordnet中找不到的单词,然后取出其余的单词。 http://projects.csail.mit.edu/jwi/

  2. 查找同义词和更多同义词:对于上述5或6个类别中的每一个,形成包含这些类别的同义词的同义词的单独集合。例如,形成一个包含娱乐同义词的集合,然后是发现的娱乐同义词的进一步同义词。我们也可以使用网络抓取来增加此设置。

  3. 提供数据:获取特定故事的词形还原和Wordnet过滤后的所有单词,并检查每个类别集中匹配的单词数。例如,如果一个故事包含100个单词,并且它与娱乐类别中的35个单词相匹配,40个单词与食物相匹配,30个单词与旅行相匹配,则很可能属于食物类别,因此它将成为食物故事。 使用上述方法,我的电子邮件分类效果很好。

答案 7 :(得分:0)

如果您正在寻找现成的东西,您可能想在SQL Server中尝试Microsoft的数据挖掘算法:

http://msdn.microsoft.com/en-us/library/ms175595%28v=SQL.100%29.aspx

http://www.sqlserverdatamining.com