我将对非结构化文本文档进行分类,即结构未知的网站。我要分类的课程数量有限(目前,我相信不超过三个)。有人对我的入门提出建议吗?
在这里“言语袋”方法可行吗?后来,我可以基于文档结构(也许是决策树)添加另一个分类阶段。
我对Mahout和Hadoop有点熟悉,所以我更喜欢基于Java的解决方案。如果需要,我可以切换到Scala和/或Spark引擎(ML库)。
我将对非结构化文本文档进行分类,即结构未知的网站。我要分类的课程数量有限(目前,我相信不超过三个)。有人对我的入门提出建议吗?
在这里“言语袋”方法可行吗?后来,我可以基于文档结构(也许是决策树)添加另一个分类阶段。
我对Mahout和Hadoop有点熟悉,所以我更喜欢基于Java的解决方案。如果需要,我可以切换到Scala和/或Spark引擎(ML库)。
Answers:
让我们从头开始研究。分类(也称为分类)是监督学习的一个例子。在监督学习中,您有:
现在,让我们举一个简单的垃圾邮件分类案例。您的训练数据集是电子邮件的主体+相应的标签-“垃圾邮件”或“非垃圾邮件”。测试数据集具有相同的结构,但是是由一些独立的电子邮件组成的(通常只有一封电子邮件会拆分他的数据集,例如,将其中的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,决策树 -仅提及一些流行的分类器。(请注意,在大多数情况下,我们称“分类器”是指模型+相应的训练和分类算法)。
至于实现,您可以将任务分为两部分:
主题建模将是解决您的问题的非常合适的方法。主题模型是无监督学习/发现的一种形式,其中指定(或发现)数量的主题是由出现在一起的可能性很高的单词列表定义的。在一个单独的步骤中,您可以使用主题专家来标记每个主题,但是出于您的目的,这不是必需的,因为您仅对进入三个类感兴趣。
您将每个文档视为一袋单词,并进行预处理以删除停用词等。使用最简单的方法,您可以预先指定主题数。在您的情况下,您可以指定“ 3”(这是类别的固定限制),也可以选择更多的主题(10到100之间),然后在单独的步骤中为三个文档共同形成三个类,重点是话题。可以使用K均值或其他聚类方法。(我建议使用后一种方法)
您无需从头开始编写主题建模软件。这是一个包含许多资源的网页,包括软件库/软件包。
Java中没有,但是有一些方法可以在Java下运行C ++和Python。
这里有一些非常不错的用于文本分类的开源软件包,它们将帮助您入门: