引言
正在做LintCode上的垃圾邮件分类,使用朴素贝叶斯方法解决,涉及到文本特征的提取。
TF-IDF(词频-逆文档频率)算法是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。
计算步骤
词频(TF)
Term Frequency
,就是某个关键字出现的频率,具体来讲,就是词库中的某个词在当前文章中出现的频率。那么我们可以写出它的计算公式:
其中,表示关键词在文档中的出现次数。
单纯使用TF来评估关键词的重要性忽略了常用词的干扰。常用词就是指那些文章中大量用到的,但是不能反映文章性质的那种词,比如:因为、所以、因此等等的连词,在英文文章里就体现为and、the、of等等的词。这些词往往拥有较高的TF,所以仅仅使用TF来考察一个词的关键性,是不够的。
逆文档频率(IDF)
Inverse Document Frequency
,文档频率就是一个词在整个文库词典中出现的频率,逆文档频率用下式计算
其中,表示总的文档数目,表示关键词出现过的文档数目
scikit-learn
内为
词频-逆文档频率(TF-IDF)
举例
例如有如下个文本
1 | 文本1:My dog ate my homework. |
提取字典,一般需要处理大小写、去除停用词a
,处理结果为
1 | ate, cat, dog, dolphin, homework, my, sandwich, the |
故各个文本的词数向量为
1 | 文本1:[1, 0, 1, 0, 1, 2, 0, 0] |
各个文本的词频向量(TF)
1 | 文本1:[0.2 , 0. , 0.2 , 0. , 0.2 , 0.4 , 0. , 0. ] |
各词出现过的文档次数
1 | [3, 1, 1, 1, 2, 2, 1, 2] |
总文档数为,各词的逆文档频率(IDF)向量
这里使用
scikit-learn
内的方法求解
1 | [1. , 1.69314718, 1.69314718, 1.69314718, 1.28768207, 1.28768207, 1.69314718, 1.28768207] |
故各文档的TF-IDF向量为
1 | 文本1: |
经单位化后,有
1 | 文本1: |
1 | >> import numpy as np |
验证
使用scikit-learn
机器学习包计算结果
1 | >> from sklearn.feature_extraction.text import TfidfVectorizer |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LOUIS' BLOG!
评论