我有一大堆大约 500 字长的短篇小说,我想将它们归为 20 个类别之一:
- 娱乐
- 食物
- 音乐
- ETC
我可以手动分类一堆,但我想实现机器学习来最终猜测类别。解决这个问题的最佳方法是什么?我应该使用机器学习的标准方法吗?我认为决策树不能很好地工作,因为它是文本数据......我在这个领域是全新的。
任何帮助将不胜感激,谢谢!
我有一大堆大约 500 字长的短篇小说,我想将它们归为 20 个类别之一:
我可以手动分类一堆,但我想实现机器学习来最终猜测类别。解决这个问题的最佳方法是什么?我应该使用机器学习的标准方法吗?我认为决策树不能很好地工作,因为它是文本数据......我在这个领域是全新的。
任何帮助将不胜感激,谢谢!
一个朴素的贝叶斯很可能对你有用。方法是这样的:
训练:
决定:
我已经分类了数以万计的短文本。我最初所做的是使用 tf-idf 向量空间模型,然后对这些向量进行 k-means 聚类。这是探索性数据分析的一个很好的初始步骤,可以很好地处理您的数据集。我用来集群的包是cluto:http ://glaros.dtc.umn.edu/gkhome/views/cluto/
要执行 tf-idf,我只是在 perl 中编写了一个快速脚本来标记非字母数字。然后,每个文档都由一袋单词组成。每个文档都表示为它包含的单词的向量。向量的每个索引的值是词频 (tf) * 逆文档频率 (idf)。它只是文档中该单词/术语的计数乘以包含该单词的文档分数的倒数的乘积。(因为像“the”这样的词是非常不具信息性的。)
这种方法会很快让你获得大约 80%-90% 的准确率。然后,您可以手动标记正确的(或更重要的是:错误),然后根据您的选择进行监督学习。
我认为论文“自动文本分类中的机器学习”(您可以谷歌并下载 PDF 文件)值得一读。本文讨论了两个关键部分:一个用于特征选择(将文本翻译到特征空间),另一个用于在特征空间上构建分类器。有很多特征选择方法,以及几种分类方法(决策树、朴素贝叶斯、kNN、SVM 等)。您可以尝试一些组合,看看它是否适用于您的数据集。
我之前做过类似的事情,我使用 Python 进行文本操作、特征选择和特征加权。和橙色用于分类器。Orange 和 Weka 已经包含了朴素贝叶斯、kNN...,但是现在我可以直接用 Python 脚本编写分类器,应该也不会很难。
希望这可以帮助。
大多数人会说统计文本分析(如朴素贝叶斯方法)是标准方法:“统计自然语言处理基础”、Manning 和 Schuetze 以及“语音和语言处理”、Jurafsky 和 Martin 是标准参考。统计文本分析在 90 年代后期成为标准方法,因为它们很容易胜过符号系统。然而,一些符号系统包含统计元素,您实际上也可以使用连接主义方法(有几篇论文证明了这一点)。您也可以使用余弦相似度(k-Nearest Neighbor 的一种形式),尽管朴素贝叶斯通常表现最好。
这是一个很好的概述:http ://www.cs.utexas.edu/users/hyukcho/classificationAlgorithm.html 我使用该页面上提到的 Rainbow 对我在 .com 项目中编写的搜索引擎原型进行文本分类。
除非您将来有机会再进行 500 次分类,否则我不确定我是否会采用机器学习方法。
除非类别非常相似(以“食物”和“意大利食物”为例),否则我认为非常幼稚的启发式方法可以很好地工作。
为每个类别构建一个常用词表(对于食物:“potato”、“food”、“cook”、“tomato”、“restaurant”……),并为每个文本计算哪个类别的词匹配最多。您可以从文本中抽取一个样本(比如 100 个),手动对它们进行分类,然后让算法挑选出单词,然后确保删除所有集合之间共有的单词,而不是手动构建字典(因为它们不提供任何信息)。这实质上是一个非常简单的“学习”系统。
如果你真的想要一个机器学习系统,有很多分类方法。缺点是虽然大多数方法实现起来都相当简单,但难的是选择一个好的方法、正确的特征和好的参数。
试试Weka ……它是一个免费的数据挖掘工具,实现了很多机器学习算法。它有一个 GUI 和一个 API,因此您可以直接在数据集上使用它,也可以针对它进行编程。
如果您喜欢各种机器学习算法的结果,并且您仍然对实现自己的算法感兴趣,那么您可以实现您最喜欢的算法。这也将帮助您消除在构建 ML/AI 算法之前通常会产生的一些“它会真正起作用”的感觉。
我们可以在这里使用 NLP。以下是我在此处将电子邮件分类为不同类别的步骤: 1. 词形还原:这将删除不必要的细节并将所有单词转换为其基本形式或根形式。就像,它将工作转化为工作,将跑步转化为奔跑,将马转化为马等。为此,我们可以使用斯坦福 Lemmatizer。 http://stanfordnlp.github.io/CoreNLP/
Wordnet 过滤:我们只能使用 Wordnet 中存在的那些单词。为此,我使用了 Java Wordnet 接口。只需过滤掉wordnet中找不到的单词并取出其余单词。 http://projects.csail.mit.edu/jwi/
查找同义词和进一步的同义词:对于上面提到的上述 5 或 6 个类别中的每一个,形成包含这些类别的同义词的单独集合。例如,形成一个包含娱乐同义词的集合,然后是找到的娱乐同义词的更多同义词。我们也可以使用网络爬虫来增加这个集合。
如果您正在寻找现成的东西,您可能想在 SQL Server 中尝试 Microsoft 的数据挖掘算法:
http://msdn.microsoft.com/en-us/library/ms175595%28v=SQL.100%29.aspx