什么是分类文本文档的好方法?

bod*_*ydo 7 text nlp words similarity measure

我编写了一个测量文本重要性的应用程序.它需要一篇文章文章,将其分成单词,删除停用词,执行词干,并计算词频和文档频率.字频是衡量给定单词在所有文档中出现次数的度量,而文档频率是计算给定单词出现的文档数量的度量.

这是两个文章文章的示例:

  • 第一条)"狐狸跳过另一只狐狸."
  • 第二条)"一个猎人看到了一只狐狸."

第一条被分成了一些词语(后来阻止和删除停用词):

  • ["狐狸","跳","另一个","狐狸"].

第二条分为两个词:

  • ["猎人","看","狐狸"].

这两篇文章产生了以下词频和文档频率计数器:

  • fox (字频:3,文档频率:2)
  • jump (字频:1,文档频率:1)
  • another (字频:1,文档频率:1)
  • hunter (字频:1,文档频率:1)
  • see (字频:1,文档频率:1)

鉴于新的文章文章,我如何衡量本文与以前的文章有多相似?

我已经阅读了关于df-idf测量但是它不适用于这里,因为我正在删除停用词,因此像"a"和"the"这样的单词不会出现在计数器中.

例如,我有一篇新的文章文章说"猎人爱狐狸",我怎么想出一个措施,说这篇文章与之前看到的很相似?

另一个例子,我有一篇新的文章说"鹿很有趣",然后这篇文章是一篇全新的文章,相似性应为0.

我想我在某种程度上需要对词频和文档频率计数器值进行求和,但是什么是一个好的公式?

Deb*_*sis 6

标准解决方案是应用朴素贝叶斯分类器,其在给定文档D的情况下估计C类的后验概率,表示为P(C = k | D)(对于二元分类问题,k = 0和1).

这是由训练集类标记的文件,在给定的文档计算先验估计d我们知道它的类Ç.

P(C|D) = P(D|C) * P(D)              (1)
Run Code Online (Sandbox Code Playgroud)

朴素贝叶斯认为术语是独立的,在这种情况下你可以写P(D | C)为

P(D|C) = \prod_{t \in D} P(t|C)     (2)
Run Code Online (Sandbox Code Playgroud)

P(t | C)可以简单地通过计算某个术语在给定类中出现的次数来计算,例如,您希望足球这个词在属于类(类别)体育的文档中会出现很多次.

当涉及到其他因素P(d) ,可以通过计算标记的文件有多少来自每个类特定估计的话,可能是你有更多的运动比文章财务的,它让你相信,有较高的可能性一份看不见的文件,分类为体育类别.

将因子重要性(idf)或术语依赖性等因素纳入等式(1)非常容易.对于idf,您可以将其作为术语采样事件添加到集合中(与该类无关).对于术语依赖性,您必须插入形式为P(u | C)*P(u | t)的概率,这意味着您对不同的术语u进行采样并将其更改(转换)为t.

Naive Bayes分类器的标准实现可以在Stanford NLP包中找到,WekaScipy可以在许多其他包中找到 .


Dav*_*ale 6

您似乎正在尝试回答几个相关问题:

  1. 如何衡量文件A和B之间的相似性?(指标学习)
  2. 与某些文档集合相比,如何衡量文档C的异常程度?(异常检测)
  3. 如何将一组文档拆分成类似的组?(聚类)
  4. 如何预测文档属于哪个类?(分类)

所有这些问题通常分两步解决:

  1. 提取功能:文档 - >表示(通常是数字向量)
  2. 应用模型:表示 - >结果(通常是单个数字)

功能工程和建模都有很多选项.这里仅仅是少数.

特征提取

  1. 一袋词:文件 - >每个单词出现的次数(即术语频率).这是基本选项,但不是唯一的选项.
  2. 一袋n-gram(在单词级或字符级):考虑几个令牌的共同出现.
  3. 一袋词+语法特征(例如POS标签)
  4. 一袋词嵌入(由外部模型学习,例如word2vec).您可以使用嵌入作为序列或采用加权平均值.
  5. 无论你能发明什么(例如基于字典查找的规则)......

可以预处理特征以减少其中的相对噪声量.预处理的一些选项是:

  • 除以IDF之外,如果你没有一个坚硬的停用词列表或相信单词可能或多或少"停止"
  • 将每列标准化(例如,字数)以具有零均值和单位方差
  • 记录字数以减少噪音
  • 将每行标准化以使L2范数等于1

您无法事先知道哪个选项最适合您的特定应用 - 您必须进行实验.

现在您可以构建ML模型.4个问题中的每一个都有自己的好解决方案.

对于分类,研究得最好的问题,可以使用多种模型,包括朴素贝叶斯,k近邻,逻辑回归,SVM,决策树和神经网络.同样,您无法提前知道哪个会表现最佳.

这些模型中的大多数可以使用几乎任何类型的功能.但是,KNN和基于内核的SVM要求您的特征具有特殊结构:在欧几里德距离度量的意义上,一类文档的表示应该彼此接近.这有时可以通过简单的线性和/或对数归一化来实现(见上文).更困难的情况需要非线性变换,原则上可以通过神经网络学习.学习这些变换人们称之为度量学习的东西,通常它是一个尚未解决的问题.

最传统的距离度量确实是欧几里德.然而,其他距离度量是可能的(例如曼哈顿距离),或不同的方法,不基于文本的向量表示.例如,您可以尝试根据将一个文本转换为另一个文本所需的操作数量计算文本之间的Levenstein距离.或者,您可以计算"单词移动距离" - 单词对与最近嵌入的距离之和.

对于群集,基本选项是K-means和DBScan.这两种模型都要求您的特征空间具有此Euclidean属性.

对于异常检测,您可以使用由各种概率算法产生的密度估计:分类(例如朴素贝叶斯或神经网络),聚类(例如高斯模型的混合)或其他无监督方法(例如概率PCA).对于文本,您可以利用顺序语言结构,估计每个单词在前一个单词条件下的可能性(使用n-gram或卷积/递归神经网络) - 这称为语言模型,它通常比bag-of更有效朴素贝叶斯的词假设,忽略了词序.几种语言模型(每个类一个)可以组合成一个分类器.

无论你解决什么问题,强烈建议使用已知的" 基本事实 "来设置一个好的测试集:哪些文档彼此接近,或属于同一类,或者(通常).使用此集,您可以评估特征工程和建模的不同方法,并选择最佳方法.

如果您没有资源或不愿意进行多次实验,我建议您选择以下方法之一来评估文本之间的相似性:

  • 字数+ idf归一化+ L2归一化(相当于@mcoav的解)+欧几里德距离
  • 意思是word2vec嵌入文本中的所有单词(嵌入字典可以用google搜索和下载)+欧几里德距离

基于这些表示之一,您可以为其他问题构建模型 - 例如用于分类的KNN或用于聚类的k均值.


小智 4

我建议使用 tf-idf 和余弦相似度

如果删除停用词,您仍然可以使用 tf-idf。甚至很可能是否包含停用词不会产生如此大的差异:逆文档频率度量会自动降低停用词的权重,因为它们非常频繁并且出现在大多数文档中。

如果您的新文档完全由未知术语组成,则每个已知文档的余弦相似度将为 0。