非结构化文本分类


12

我将对非结构化文本文档进行分类,即结构未知的网站。我要分类的课程数量有限(目前,我相信不超过三个)。有人对我的入门提出建议吗?

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

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

Answers:


14

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

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

现在,让我们举一个简单的垃圾邮件分类案例。您的训练数据集是电子邮件的主体+相应的标签-“垃圾邮件”或“非垃圾邮件”。测试数据集具有相同的结构,但是是由一些独立的电子邮件组成的(通常只有一封电子邮件会拆分他的数据集,例如,将其中的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”的出现,1个单词“ burn”的出现,5个名词,2个形容词和2个粗体文本。最后一列对应于结果类标签。

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

那么模型和算法呢?我们是否绑定到朴素贝叶斯。一点也不。Logistic回归SVM决策树 -仅提及一些流行的分类器。(请注意,在大多数情况下,我们称“分类器”是指模型+相应的训练和分类算法)。

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

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

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


原始海报使用“分类”一词,但“集群”是对他的问题的更准确描述,因为他没有先验的类别定义。因此,这不一定是监督学习问题。
MrMeritology

@MrMeritology:嗯,从上下文出发,我想说作者只是不确定他将要使用的具体类,但仍然希望分类而不是聚类。无论如何,他是唯一知道真相的人:)
朋友2014年

也许我当时还不清楚。类别将在建议中选择,因此它不是分类而是聚类问题。创建一个复杂的特征向量的想法似乎是很合理的-特别是,有些特定的标签很可能会快速对某些样本进行分类。我不确定SVM是否会解决这个问题,因为我预测高度非线性,但是决策树和贝叶斯似乎适用。我也开始考虑混合算法(基于SVM的决策树)的应用。
Grzegorz E.

@GrzegorzE。-如果您的类别是预先定义的,请在问题中列出这三个类别。我认为,您过于专注于ML算法,而对问题的性质和数据的性质还不够。例如,您预测结构未知的网站的功能中的“非线性”。为什么?另外,您正在将标签与带有who-knows-what-else的网页文本混合使用,它们具有不同的语义含义。
MrMeritology 2014年

@GrzegorzE。-我强烈建议您的分类方法应主要由先验类别的性质和数据的性质决定。有无数种方法可以将任意网站分为3类。每种分类方式都会建议数据中的显着特征或显着模式。不能替代手动分析单个数据元素(网页)及其上下文的方法。
MrMeritology

5

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

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

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

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


4

这里有一些非常不错的用于文本分类的开源软件包,它们将帮助您入门:

  • MALLET是UMass构建的基于CPL许可的基于Java的机器学习工具包,用于处理文本数据。它包括几种分类算法的实现(例如,朴素贝叶斯,最大熵,决策树)。
  • Stanford NLP集团的Stanford分类器是GPL许可的最大熵分类器的Java实现,旨在用于文本数据。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.