【问题标题】:I want a machine to learn to categorize short texts我想要一台机器学习对短文本进行分类
【发布时间】:2011-02-11 09:20:07
【问题描述】:

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

  • 娱乐
  • 食物
  • 音乐

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

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

【问题讨论】:

  • 这是一个很好的问题,在这个领域——我也是——我也是个暴君。您想要的关键词是“自然语言处理”和“分类”。我现在在打猎,我自己。
  • 我认为您想要的是贝叶斯分类器,但我对它们没有经验。

标签: machine-learning nlp classification


【解决方案1】:

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

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

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

如果您真的想要一个机器学习系统,可以使用多种分类方法。缺点是虽然大多数方法实现起来都相当简单,但难的是选择一个好的方法、合适的特征和好的参数。

【讨论】:

  • 这是一个很好的观点。机器学习可能不是最好的方法。一路正则表达式!
【解决方案2】:

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

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

【讨论】:

  • 谢谢,这是个好主意。我之前用过Weka,但对后端不太了解;也许我可以深入挖掘。
【解决方案3】:

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

【讨论】:

  • 感谢链接,讨论很有趣。
【解决方案4】:

naive Bayes 很可能对您有用。方法是这样的:

  • 修复多个类别并获得(文档、类别)对的训练数据集。
  • 文档的数据向量会像一袋单词。例如取除“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) + log P(F2|C) + ... + log P(F500|C)。

【讨论】:

  • 酷,感谢您的解释。我在 Raghavan、Schütze 和 Manning 的书中读到了类似的内容:nlp.stanford.edu/IR-book/information-retrieval-book.html,这是有道理的。
  • 训练集的类别不能改变,我说得对吗?可能我有点懒得做扩展研究。
  • 不,他们不能。但是一旦你这样做了,无论如何你都可以训练一个新的分类器。
【解决方案5】:

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

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

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

【讨论】:

  • 这很酷,感谢程序化解释,我想我可以轻松地将它移植到我最喜欢的语言中。
【解决方案6】:

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

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

http://www.sqlserverdatamining.com

【讨论】:

    【解决方案7】:

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

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

    【讨论】:

      【解决方案8】:

      我们可以在这里使用 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 个旅游类单词,那么它很可能属于食物类,因此它是一个食物故事. 使用上述方法,我的电子邮件分类得到了很好的结果。

      【讨论】:

        猜你喜欢
        • 2018-08-15
        • 1970-01-01
        • 2020-03-18
        • 2017-03-14
        • 2020-05-29
        • 2015-01-16
        • 2020-02-08
        • 2021-06-17
        • 2019-01-27
        相关资源
        最近更新 更多