非结构化文本分类

数据挖掘 机器学习 分类 文本挖掘 初学者
2021-09-24 03:03:56

我将对非结构化文本文档进行分类,即未知结构的网站。我要分类的类的数量是有限的(在这一点上,我相信不会超过三个)。有没有人建议我如何开始?

“词袋”方法在这里可行吗?稍后,我可以添加另一个基于文档结构(可能是决策树)的分类阶段。

我对 Mahout 和 Hadoop 有点熟悉,所以我更喜欢基于 Java 的解决方案。如果需要,我可以切换到 Scala 和/或 Spark 引擎(ML 库)。

3个回答

让我们从头开始。分类(也称为分类)是监督学习的一个例子。在监督学习中,你有:

  • 模型- 近似数据内部结构的东西,使您能够对其进行推理并做出有用的预测(例如预测对象的类别);通常模型具有您想要“学习”的参数
  • 训练测试数据集- 用于训练模型(找到合适的参数值)和进一步评估的对象集
  • 训练分类算法——首先描述如何从训练数据集中学习模型,其次展示如何在给定训练模型的情况下派生新对象的类

现在让我们来看一个简单的垃圾邮件分类案例。您的训练数据集是电子邮件 + 相应标签的语料库 - “垃圾邮件”或“非垃圾邮件”。测试数据集具有相同的结构,但由一些独立的电子邮件组成(通常一个人只是拆分他的数据集,例如,其中 9/10 用于训练,1/10 - 用于测试)。对电子邮件进行建模的一种方法是将它们中的每一个表示为一组(袋)单词。如果我们假设单词是相互独立的,我们可以使用朴素贝叶斯分类器,即计算每个单词和每个类别的先验概率(训练算法),然后应用贝叶斯定理找到新文档所属的后验概率特定的类。

所以,基本上我们有:

raw model + training set + training algorithm -> trained model
trained model + classification algorithm + new object -> object label

现在请注意,我们将对象(文档)表示为一个词袋。但这是唯一的方法吗?事实上,我们可以从原始文本中提取更多内容。例如,我们可以使用它们的词干或引理代替单词,丢弃嘈杂的停用词,添加单词的POS 标签,提取命名实体,甚至探索文档的 HTML 结构。事实上,文档(以及通常任何对象)的更一般表示是特征向量例如对于文本:

actor, analogue, bad, burn, ..., NOUN, VERB, ADJ, ..., in_bold, ... | label
    0,        0,   1,    1, ...,    5,    7,   2, ...,       2, ... | not spam
    0,        1,   0,    0, ...,    3,   12,  10, ...,       0, ... | spam

这里第一行是可能的特征列表,随后的行显示该特征在文档中出现的次数。例如,在第一个文档中,没有出现单词“actor”、单词“burn”出现 1 个、5 个名词、2 个形容词和 2 个粗体文本。最后一列对应于结果类标签。

使用特征向量,您可以合并文本的任何属性。虽然找到一组好的特性可能需要一些时间。

那么模型和算法呢?我们是否必须使用朴素贝叶斯。一点也不。逻辑回归SVM决策树——仅举几个流行的分类器。(注意,我们说的“分类器”在大多数情况下是指模型+用于训练和分类的相应算法)。

至于实现,您可以将任务分为两部分:

  1. 特征提取 - 将原始文本转换为特征向量。
  2. 对象分类 - 建立和应用模型。

第一点在许多NLP 库中都得到了很好的解决。其次是关于机器学习,因此,根据您的数据集,您可以使用WekaMLlib

主题建模将是解决您的问题的一种非常合适的方法。主题模型是一种无监督学习/发现形式,其中指定(或发现)数量的主题由很可能一起出现的单词列表定义。在单独的步骤中,您可以使用主题专家标记每个主题,但出于您的目的,这不是必需的,因为您只对获得三个集群感兴趣。

您将每个文档视为一袋单词,并进行预处理以删除停用词等。使用最简单的方法,您可以预先指定主题的数量。在您的情况下,您可以指定“3”,这是您对类别的固定限制,或者选择更多的主题(10 到 100 之间),然后在单独的步骤中,为文档形成三个集群,共同强调话题。可以使用 K-means 或其他聚类方法。(我推荐后一种方法)

您无需从头开始编写主题建模软件。这是一个包含许多资源的网页,包括软件库/包

Java 中没有一个,但有一些方法可以在 Java 下运行 C++ 和 Python。

这里有几个非常棒的用于文本分类的开源软件包,它们应该可以帮助您入门:

  • MALLET是一个 CPL 许可的基于 Java 的机器学习工具包,由 UMass 构建,用于处理文本数据。它包括几种分类算法的实现(例如,朴素贝叶斯、最大熵、决策树)。
  • 斯坦福 NLP 小组的斯坦福分类器是一个 GPL 许可的 Java 实现,它是一个最大熵分类器,旨在处理文本数据。