TF-IDF(termfrequency–inversedocumentfrequency,词频-逆向文件频率)是一种用于信息检索(informationretrieval)与文本挖掘(textmining)的常用加权技术。
TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。
TF是词频(TermFrequency):词频(TF)表示词条(关键字)在文本中出现的频率。
逆向文件频率(IDF):某一特定词语的IDF,可以由总文件数目除以包含该词语的文件的数目,再将得到的商取对数得到。如果包含词条t的文档越少,IDF越大,则说明词条具有很好的类别区分能力。
TF-IDF实际上是:TF*IDF。某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语。
1.2,TF-IDF计算方法
TF-IDF计算步骤分成以下三个图:
1.计算词频计算词频
2.计算逆文档频率计算逆文档频率
3.计算TF-IDF计算TF-IDF
1.3,测试数据
为了简化测试步骤,在网页上找了一段新闻文本,手工取了一些词做测试。
2,引入sklearn库及下面的子库
Scikit-learn(简记sklearn),是面向Python的免费机器学习库。Sklearn包含了很多种机器学习的方式:如分类、回归、聚类算法以及降维、模型选择和数据预处理等机器学习算法。Sklearn同时支持NumPy和SciPy数据结构和Matplotlib库。
Sklearn是机器学习中一个常用的Python第三方模块,能够为用户提供各种机器学习算法接口,可以让用户简单、高效地进行数据挖掘和数据分析。
sklearn库共分为6大部分,分别用于完成分类任务、回归任务、聚类任务、降维任务、模型选择以及数据的预处理。
#coding:utf-8
fromsklearnimportfeature_extraction
fromsklearn.feature_extraction.textimportTfidfTransformer
fromsklearn.feature_extraction.textimportCountVectorizer
3,构造用作测试的文本
为了简化测试步骤,在网上找了一段新闻文本,手工取一些词,构造成3个文本文档,便于观察。
corpus=["此次南京禄口机场出现保洁人员系外包公司的工作人员",
"机场作为境外防控的第一道防线人流物流高度集中风险较高的场所",
"在全国疫情防控的大趋势下为何却在对保洁人员的防疫管理上失守"]
4,生成关键词矩阵
4.1,定义CountVectorizer类的对象
这个对象将文本中的词语转换为词频矩阵,矩阵元素a[i][j]表示j词在i类文本下的词频
vectorizer=CountVectorizer()
4.1,将文本转换成关键词矩阵
使用vectorizer的fit_transform方法将文本转为词频矩阵
X=vectorizer.fit_transform(corpus)
5,计算tf-idf
5.1,定义TfidfTransformer类的对象
该对象会统计每个词语的tf-idf权值
transformer=TfidfTransformer()
5.2,计算tf-idf
使用transformer的fit_transform方法计算tf-idf
tfidf=transformer.fit_transform(X)
6,获取词袋模型中的所有词语
word=vectorizer.get_feature_names()
7,取td-idf矩阵
将tf-idf矩阵抽取出来,元素a[i][j]表示j词在i类文本中的tf-idf权重
weight=tfidf.toarray()
8,输出tf-idf词语权重
foriinrange(len(weight)):
print("-------这里输出第",i,u"条文本的词语tf-idf权重------")
print(list(zip(word,weight[i])))
print("\n")
输出结果是:
-------这里输出第0条文本的词语tf-idf权重------
[('为何',0.0),('人流',0.0),('作为',0.0),('保洁人员',0.29651988085384556),('全国',0.0),('出现',0.3898880096169543),('南京',0.3898880096169543),('场所',0.0),('境外防控',0.0),('外包公司',0.3898880096169543),('大趋势下',0.0),('失守',0.0),('工作人员',0.3898880096169543),('机场',0.0),('此次',0.3898880096169543),('物流',0.0),('疫情',0.0),('禄口机场',0.3898880096169543),('第一道',0.0),('管理',0.0),('较高',0.0),('防控',0.0),('防疫',0.0),('防线',0.0),('集中',0.0),('风险',0.0),('高度',0.0)]
-------这里输出第1条文本的词语tf-idf权重------
[('为何',0.0),('人流',0.2886751345948129),('作为',0.2886751345948129),('保洁人员',0.0),('全国',0.0),('出现',0.0),('南京',0.0),('场所',0.2886751345948129),('境外防控',0.2886751345948129),('外包公司',0.0),('大趋势下',0.0),('失守',0.0),('工作人员',0.0),('机场',0.2886751345948129),('此次',0.0),('物流',0.2886751345948129),('疫情',0.0),('禄口机场',0.0),('第一道',0.2886751345948129),('管理',0.0),('较高',0.2886751345948129),('防控',0.0),('防疫',0.0),('防线',0.2886751345948129),('集中',0.2886751345948129),('风险',0.2886751345948129),('高度',0.2886751345948129)]
-------这里输出第2条文本的词语tf-idf权重------
[('为何',0.3414262179382391),('人流',0.0),('作为',0.0),('保洁人员',0.2596634391575384),('全国',0.3414262179382391),('出现',0.0),('南京',0.0),('场所',0.0),('境外防控',0.0),('外包公司',0.0),('大趋势下',0.3414262179382391),('失守',0.3414262179382391),('工作人员',0.0),('机场',0.0),('此次',0.0),('物流',0.0),('疫情',0.3414262179382391),('禄口机场',0.0),('第一道',0.0),('管理',0.3414262179382391),('较高',0.0),('防控',0.3414262179382391),('防疫',0.3414262179382391),('防线',0.0),('集中',0.0),('风险',0.0),('高度',0.0)]