20

我有一大堆大约 500 字长的短篇小说,我想将它们归为 20 个类别之一:

  • 娱乐
  • 食物
  • 音乐
  • ETC

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

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

4

8 回答 8

24

一个朴素的贝叶斯很可能对你有用。方法是这样的:

  • 修复多个类别并获得(文档,类别)对的训练数据集。
  • 您文档的数据向量将像一袋单词。例如,取除“the”、“and”等词外的 100 个最常见的词。每个单词都获得数据向量的一个固定分量(例如,“食物”位于第 5 位)。一个特征向量是一个布尔数组,每个都指示该词是否出现在相应的文档中。

训练:

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

决定:

  • 给定一个未分类的文档,它属于 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 ) + 日志 P(F2|C) + ... + 日志 P(F500|C)。
于 2010-04-23T08:11:32.150 回答
10

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

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

这种方法会很快让你获得大约 80%-90% 的准确率。然后,您可以手动标记正确的(或更重要的是:错误),然后根据您的选择进行监督学习。

于 2010-04-25T19:42:09.870 回答
6

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

于 2010-04-23T07:16:54.383 回答
3

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

这是一个很好的概述:http ://www.cs.utexas.edu/users/hyukcho/classificationAlgorithm.html 我使用该页面上提到的 Rainbow 对我在 .com 项目中编写的搜索引擎原型进行文本分类。

于 2011-01-15T16:14:14.213 回答
2

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

除非类别非常相似(以“食物”和“意大利食物”为例),否则我认为非常幼稚的启发式方法可以很好地工作。

为每个类别构建一个常用词表(对于食物:“potato”、“food”、“cook”、“tomato”、“restaurant”……),并为每个文本计算哪个类别的词匹配最多。您可以从文本中抽取一个样本(比如 100 个),手动对它们进行分类,然后让算法挑选出单词,然后确保删除所有集合之间共有的单词,而不是手动构建字典(因为它们不提供任何信息)。这实质上是一个非常简单的“学习”系统。

如果你真的想要一个机器学习系统,有很多分类方法。缺点是虽然大多数方法实现起来都相当简单,但难的是选择一个好的方法、正确的特征和好的参数。

于 2010-04-23T06:12:39.960 回答
2

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

如果您喜欢各种机器学习算法的结果,并且您仍然对实现自己的算法感兴趣,那么您可以实现您最喜欢的算法。这也将帮助您消除在构建 ML/AI 算法之前通常会产生的一些“它会真正起作用”的感觉。

于 2010-04-23T06:24:36.607 回答
1

我们可以在这里使用 NLP。以下是我在此处将电子邮件分类为不同类别的步骤: 1. 词形还原:这将删除不必要的细节并将所有单词转换为其基本形式或根形式。就像,它将工作转化为工作,将跑步转化为奔跑,将马转化为马等。为此,我们可以使用斯坦福 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 个旅游类单词,那么它很可能属于食物类,因此它是一个食物故事. 使用上述方法,我的电子邮件分类得到了很好的结果。
于 2016-11-30T00:44:04.930 回答
0

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

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

http://www.sqlserverdatamining.com

于 2010-04-26T23:06:46.687 回答