1.文本数据的向量化

1.1名词解释

CF:文档集的频率,是指词在文档集中出现的次数

DF:文档频率,是指出现词的文档数

IDF:逆文档频率,idf = log(N/(1+df)),N为所有文档的数目,为了兼容df=0情况,将分母弄成1+df。

TF:词在文档中的频率

TF-IDF:TF-IDF= TF*IDF
 

1.2 TF-IDF算法

TF-IDF(词频-逆文档频率)算法是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。该算法在数据挖掘、文本处理和信息检索等领域得到了广泛的应用,如从一篇文章中找到它的关键词。

 

TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。TF-IDF实际上就是 TF*IDF,其中 TF(Term Frequency),表示词条在文章Document 中出现的频率;IDF(Inverse Document Frequency),其主要思想就是,如果包含某个词 Word的文档越少,则这个词的区分度就越大,也就是 IDF 越大。对于如何获取一篇文章的关键词,我们可以计算这边文章出现的所有名词的 TF-IDF,TF-IDF越大,则说明这个名词对这篇文章的区分度就越高,取 TF-IDF 值较大的几个词,就可以当做这篇文章的关键词。
 

由此可见,当一个词被越多的文档包含,则IDF值就越小,也就是所这个词很常见,不是最重要的能区分文章特性的关键词。

这样,某个词条的TF-IDF的值为 ,即某一个文件中高频出现的词条,以及该词条在整个语料库文件中低频出现的现象,就可以产生高权重的TF-IDF,因此,TF-IDF倾向过滤掉常见的词语,保留重要的词语。即:字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。

 

优缺点

 1. 优点是算法的容易理解,便于实现。

 2.缺点:IDF的简单结构并不能有效地反映单词的重要程度和特征词的分布情况,使其无法很好的完成对权值的调整功能,所以在一定程度上该算法的精度并不是很高。除此之外,算法也没哟体现位置信息,对于出现在文章不同位置的词语都是一视同仁的,而我们知道,在文章首尾的词语势必重要性要相对高点。据此,我们可以或许也可以将处于文章不同位置的词语赋予不同的权重。

 

1.3 文本数据样本集

为了讲解文本数据的向量化,假设我们有4个文本,所有文本一共有6个不同的词,如下所示。

 

 

1.4 使用Sklearn提供的TF-IDF方法

 

import jieba
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer

arr = ['第一天我参观了美术馆',
'第二天我参观了博物馆',
'第三天我参观了动物园',]

arr = [' '.join(jieba.lcut(i)) for i in arr] # 分词
print(arr)
# 返回结果:
# ['第一天 我 参观 了 美术馆', '第二天 我 参观 了 博物馆', '第三天 我 参观 了 动物园']

vectorizer = CountVectorizer()
X = vectorizer.fit_transform(arr)
word = vectorizer.get_feature_names()
df = pd.DataFrame(X.toarray(), columns=word)
print(df)
# 返回结果:
# 动物园  博物馆  参观  第一天  第三天  第二天  美术馆
#  0       0      1     1      0      0       1
#  0       1      1     0      0      1       0
#  1       0      1     0      1      0       0

transformer = TfidfTransformer()
tfidf = transformer.fit_transform(X)
weight = tfidf.toarray()
for i in range(len(weight)): # 访问每一句
    print("第{}句:".format(i))
    for j in range(len(word)): # 访问每个词
        if weight[i][j] > 0.05: # 只显示重要关键字
            print(word[j],round(weight[i][j],2)) # 保留两位小数
# 返回结果 
# 第0句:美术馆 0.65 参观 0.39 第一天 0.65
# 第1句:博物馆 0.65 参观 0.39 第二天 0.65
# 第2句:动物园 0.65 参观 0.39 第三天 0.65

经过对数据X的计算之后,返回了权重矩阵,句中的每个词都只在该句中出现了一次,因此其TF值相等,由于“参观”在三句中都出现了,其IDF较其它关键字更低。Sklearn除了实现基本的TF-IDF算法外,还其行了归一化、平滑等一系列优化操作。详细操作可参见Sklearn源码中的sklearn/feature_extraction/text.py具体实现。
 

1.5 TF-IDF的使用场景

在做特征工程时,常遇到这样的问题:从一个短语或短句中提取关键字构造新特征,然后将新特征代入分类或者回归模型,是否需要使用TF-IDF方法?首先,TF是词频,即它需要在一个文本中出现多次才有意义,如果在短句中,每个词最多只出现一次,那么计算TF不如直接判断其是否存在。

另外,TF-IDF的结果展示的是某一词针对于它所在文档的重要性,而不是对比两文档的差异。比如上例中虽然三个短句都包含“参观”,IDF较小,由于词量小TF较大,其最终得分TF-IDF仍然不太低。如果两个短语属于不同类别,新特征对于提取分类特征可能没有意义,但是对于生成文摘就是有意义的关键字。对于此类问题,建议使用:先切分出关键词,将是否包含该关键词作为新特征,然后对新特征和目标变量做假设检验,以判断是否保留该变量的方法提取新特征。
 

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐