文本分类:
- 预处理
- 特征选择
- DF (Document Frequency)
- 信息增益 (Information Gain, IG)
- 熵 (Entropy)
- 相对熵 (Relative Entropy)
- χ² 统计量 (Chi-Square)
- 互信息 (Mutual Information)
- Robertson & Sparck Jones公式
- 发生比 (Odds)
- Term Strength
- 性能比较
- 计算权重
- tf-idf
- 归一化
- 训练集、测试集的划分
- 注意
- 留出法(hold-out)
- 交叉验证法(cross validation)
- 自助法(bootstrapping)
- 类别不平衡问题的解决
- 分类
- 模型评估
1. 预处理
这一步包含以下几个内容:
- 去除标签:这种情况适用于你拿到的数据是带有html标签的时候。推荐使用Python的
BeautifulSoup
包。 - 数据清洗:去掉不合适的噪声文档或文档内垃圾数据.
- 分词,词性标注、过滤:一般来说文本分类使用的是词特征,所以我们需要对文章进行分词;
为什么要标注词性呢?因为往往具有类别表征能力的词特征往往是名词、动词等(并不绝对)。中文分词工具
广泛使用的是jieba分词。 - 停用词去除:停用词,比如
‘的’
、‘了’
,是一定需要去除的,因为它不具有任何类别表征能力。 - 词干化:英文单词需要词干化。
- 词频统计:词频统计是我们后面进行特征提取、特征权值计算的基础。
实践经验:
词频统计时,你需要统计两种词频:语料库词频
和 文档词频
,推荐使用的数据结构是python中的dict
:
# 数据存储示例
corpus_freq_dict = {
word1: freq1,
word2: freq2,
....
}
doc_freq_dict = {
doc1: {
word1: freq1,
word2: freq2,
...
},
doc2: {
word1: freq1,
word2: freq2,
...
},
...
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
2. 特征选择
用词做特征,不做特征选择这一步的话,很容易出现上万维、甚至几十万维,
这么多的维度对计算来说可能就是个灾难。即使你的计算资源足够应付,
那也是对资源的浪费,因为真正对分类起作用的词,可能就只是一少部分。
一般将维度选择在1000~5000维,这个和特征选择的方法有很大关系。
特征选择有很多方式,包括:
- DF (Document Frequency)
- 信息增益 (Information Gain, IG)
- 熵 (Entropy)
- 相对熵 (Relative Entropy)
- χ² 统计量 (Chi-Square)
- 互信息 (Mutual Information)
- Robertson & Sparck Jones公式
- 发生比 (Odds)
- Term Strength
我们一一介绍:
(1)DF (Document Frequency)
原理:
DF即文档频率:所有文档集合中出现特征term的文档数目。
- Term的DF小于某个阈值去掉(太少,没有代表性)
- Term的DF大于某个阈值也去掉(太多,没有区分度)
基本假设是:低频(DF低)term既对分类预测作用不显著,也不会影响整体性能;如果低频term碰巧是噪声,它也会提高分类准确度。
评价:
这种方法最简单,而且很容易扩大到很大规模的语料库,因为它的时间复杂度是关于训练文档数的线性复杂度。效果也不错,当你没有足够的计算资源时,你能使用它用很低的成本获得较高的准确度。然而,它通常被认为是一种提高精度的临时方法。
(2)信息增益(Information Gain)
回忆一下熵的定义:
假设有一个变量X,它可能的取值有n
多种,分别是x1
,x2
,……,xn
,
每一种取到的概率分别是P1
,P2
,……,Pn
,那么X
的熵就定义为:
再回忆一下条件熵的定义:
信息增益指的是熵的变化。这里我们需要计算的是一个term为整个分类所能提供的信息增益。
(即不考虑任何特征的熵和考虑该特征后的熵的差值)。公式如下:
注意:考虑特征term后的熵用条件熵表示。
条件熵越小,则信息增益越大,则特征越重要。这很容易理解,
因为条件熵越小,说明了在此特征下,类别的不确定性越低。
(3)熵 (Entropy)
公式如下:
你可以看到它其实是条件熵的一部分。
- 熵越大,说明分布越均匀,越有可能出现在多个类别中。
- 熵越小,说明分布越倾斜,越有可能出现在单个类别中。
所以熵越小,特征越重要。
(4)相对熵 (Relative Entropy)
回忆一下相对熵定义:
相对熵(relative entropy)又称为KL散度(Kullback–Leibler divergence,简称KLD)。
它度量两个概率分布P
和Q
差别的非对称性。(离散随机变量)公式:
这里我们需要度量的是文本类别的概率分布和在出现了某个特定词汇条件下的文本类别的概率分布之间的距离。
因此,我们此时的公式为:
相对熵越大,特征词对文本类别分布的影响也越大,特征就越重要。
(5)χ² 统计量 (Chi-Square)
我们先说结论:
我们使用卡方统计度量term和类别独立性的缺乏程度,卡方越大,独立性越小,
相关性越大,特征越重要。公式:
上式其实只是检验了term t
与类别c
的相关性,在多分类下我们需检验t
与所有类别的相关性,然后取加权平均(权值为类的概率),公式:
注意:Max(Chi-square)
的使用也很常见,它不过是取多个类别计算出的卡方的最大值罢了。
推导:
卡方检验最基本的思想就是通过观察实际值与理论值的偏差来确定理论的正确与否。具体做的时候常常先假设两个变量确实是独立的(“原假设”),然后观察实际值(观察值)与理论值(这个理论值是指“如果两者确实独立”的情况下应该有的值)的偏差程度。如果偏差足够小,我们就认为误差是很自然的样本误差,是测量手段不够精确导致或者偶然发生的,两者确确实实是独立的,此时就接受原假设;如果偏差大到一定程度,使得这样的误差不太可能是偶然产生或者测量不精确所致,我们就认为两者实际上是相关的,即否定原假设,而接受备择假设。
理论值为E
,实际值为x
,偏差程度的计算公式为:
这个式子就是卡方检验使用的差值衡量公式。当提供了数个样本的观察值x1
,x2
,……
,xi
,……
,xn
之后,代入到式中就可以求得卡方值,用这个值与事先设定的阈值比较,如果大于阈值(即偏差很大),就认为原假设不成立,反之则认为原假设成立。
在文本分类的特征选择阶段,一般使用“词t与类别c不相关”
来做原假设,计算出的卡方值越大,说明对原假设的偏离越大,我们越倾向于认为原假设的反面情况是正确的。
对照下表:
根据原假设,类别c
中包含t
的文档比例应与所有文档中包含t
的文档比例相同。故,A
的理论值A'
应为:
所以A'
与A
的差值根据差值公式有:
同理,我们可以算出D(B, B')
, D(C, C')
, D(D, D')
。
所以,卡方等于:
注意:这里N=(A+B+C+D)
。我们的目的是比较所有term的卡方值大小,你会发现(A+C)
,(B+D)
,N
在所有term的卡方计算中都是一样的,所以可以去掉这几项,所以你会得到我们结论中的第一个公式。
你可能会有疑问,为什么对于二分类,只需检验与类c
的独立性,不考虑与类~c
的独立性。你可以自己推导下Chi(term,~c)
的公式,它与Chi(term,c)
的公式一模一样。这也很符合常理,只有的两类,你检验c
,就是检验了~c
。
(6)互信息 (Mutual Information)
数学概念:
互信息被定义为:
它度量联合概率P(AB)
和边缘概率之积P(A)P(B)
的距离。这也很容易理解,当A
、B
相互独立时,P(AB)
和P(A)P(B)
是相等的,此时互信息最小,为0
。
文本分类中:
在文本分类中,我们度量P(t^c)
与P(t)P(c)
的距离。公式如下:
互信息越大,距离越小,term与重要。实践场景中下互信息的结果是比较差的。
评价:
互信息的缺点在于得分很容易受term的边缘概率P(t)
的影响。假设两个term的条件概率P(t|c)
相等,根据公式,低频term得分却更高。因此互信息并不适合在频率分布差别较大的情况下。
(7)Robertson & Sparck Jones公式
(8)发生比 (Odds Ratio)
定义:
Odds Ratio compares the odds of a feature occurring in one category with the odds for it occurring in another category. It gives a positive score to features that occur more often in one category than in the other, and a negative score if it occurs more in the other. A score of zero means the the odds for a feature to occur in one category is exactly the same as the odds for it to occur in the other, since ln (1) = 0
.
公式:
(公式并没看懂0.0)
发生比绝对值越大,说明term受类分布影响越大,特征越重要。
(9)Term Strength
Term Strength is a technique for Feature Selection in Text Mining
- it doesn’t need a pre-defined list of Stop Words - it discovers them automatically.
- so it’s a technique for vocabulary reduction in text retrieval.
- this method estimates term importance based on how often a term appears in “related” documents.
Strength of a term t
- measures how informative a word is for identifying two related documents.
s(t)=P(t∈y∣t∈x)
- for two related documents
x
,y
what’s the probability thatt
belongs toy
given it belongs tox
? - estimate
s(t)
on training data using Maximum Likelihood Estimation.(此处存疑惑)
What does it mean “related”?
- if we know the labels of these documents, then related are those that belong to the same category.
- what about Unsupervised Learning?
- use Cosine Similarity to find most related documents.
- set some threshold
t
and let all pairs with cosine>t
be related.
(10)性能比较
注意:LLSF(Linear Least Square Fit)是最小二乘拟合的简写。
从上图我们可以得到以下结论:
- 我们可以看到在特征超过2000维时,
CHI
、IG
、DF
的效果都是很好的(实验证明它们具有较强的相关性),其中CHI
的效果最好。TS
、MI
的效果比较差,其中MI
的效果最差。 TS
和MI
准确率都是可以达到CHI
的,只不过需要的term更多。
总结一下:
注释:favoring common terms
意思是favoring common terms or rare terms
从上表我们可以得出以下结论:
- Common terms are indeed informative for text categorization tasks.
- Using category information for feature selection does not seem to be crucial for excellent performance.
注意:对性能比较有任何疑问请参见原始论文A comparative study on feature selection in text categorization
3. 计算权重
(1)tf-idf
简介:
TF-IDF(term frequency–inverse document frequency)是一种用于资讯检索与文本挖掘的常用加权技术。TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。
原理及公式:
TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。TF-IDF实际上是:TF * IDF
。
- TF
是词频(Term Frequency),它表示词条在文档d
中出现的频率。
- IDF
是逆向文件频率(Inverse Document Frequency)。IDF的主要思想是:如果包含词条t
的文档越少,IDF
越大,则说明词条t
具有很好的类别区分能力。
公式:
注意:idf
分母文件数加1
是为了防止出现分母为0
发生。
4. 归一化
关于归一化请看这篇笔记 归一化
注意:对计算的tf-idf矩阵进行归一化是按sample方向进行的,归一化每一个文档到一个单位长度。其实对tf-idf矩阵按词(特征)进行归一化在计算tfidf值时已经进行了。
为什么要对sample进行归一化?
tfidf用来区分同一文档的不同词。假设doc1计算出的tfidf值[1, 2, 3], doc2计算出的tfidf值[2, 4, 6],假设要聚类,不按sample方向归一化的话,很可能认为这两个文档不相似;实际上它们中的词占(文档)比一样,应该是相似的。
5. 训练集、测试集的划分
(1)注意
在划分训练集和测试集的时候需要考虑或者注意以下几点:
- 划分前先shuffle一下,打乱example顺序。
- 训练集和测试集(以及验证集)要互斥。
- 在划分的时候尽量保持数据分布一致。
(2)留出法(hold-out)
定义:直接将数据集D
划分为两个互斥的集合,其中一个集合作为训练集S
,另一个集合作为测试集T
。在S
上训练出模型后,用T
来评估其测试误差,作为对泛化误差的估计。
注意:留出法你需要考虑是否要还要划分出验证集。验证集用来调模型超参数;一般来讲会在验证集中将模型参数调至最优,然后才在测试集上测试。这么做是为了防止模型在测试集上过拟合。如果数据量较小,可以不用划分验证集。
(3)交叉验证法(cross validation)
定义:交叉验证法先将数据集D
划分为k
个大小相近的互斥子集,每个子集Di
尽可能保持数据分布一致性,即从D
中通过分层采样得到。然后每次用k
个子集的并集作为训练集,余下的那个子集作为测试集;这样可以获得k
组训练/测试集,从而进行k
次训练测试,最终返回k
个测试结果的均值。
注意:交叉验证法是不需要验证集的。它比留出法多了些计算消耗,但不浪费数据。数据量不多,不想额外再分出验证集,可以使用此方法。
(4)自助法(bootstrapping)
定义:给定包含m
个样本的数据集D
,我们对它进行采样产生数据集D'
:每次随即从D
中挑选一个样本,将其拷贝放入D'
,然后再将该样本放回初始数据集中,使此样本在下次仍可能被采样到;重复m
次,我们得到了包含m
个样本的数据集D'
。初始数据集中有约36.8%的样本未出现在D'
中。于是我们将D'
作为训练集(m
个),D - D'
作为测试集。
这三种方法我只说了定义,更为详细的介绍请见我的这篇笔记:模型评估与选择——评估方法
6. 类别不平衡问题的解决
见这篇笔记 分类类别不平衡
7. 分类
8. 模型评估
Ref
A comparative study on feature selection in text categorization