2018年“达观杯”复盘——任务2
注:本文为任务1的后续,主要介绍TF-IDF的原理和python实现,数据预处理及数据观察赛题思考查看任务1: https://blog.csdn.net/weixin_41151521/article/details/89048032
一、TF-IDF原理和主要思想
1.TF-IDF主要思想和应用
- TF-IDF(Term Frequency-Inverse Document Frequency) 主要应用于资讯检索和资讯探勘的常用加权技术。TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF-IDF加权的各种形式常被搜寻引擎应用,作为文件与用户查询之间相关程度的度量或评级。
- 词频(term frequency, TF) 指的是某一个给定的词语在该文件中出现的次数。这个数字通常会被归一化(分子一般小于分母区别于IDF),以防止它偏向长的文件。
- 逆向文件频率 (inverse document frequency, IDF) 是一个词语普遍重要性的度量。某一特定词语的IDF,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取对数得到。某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语。
- TF-IDF的主要思想: 如果某个词或短语在一篇文章中出现的频率(TF)很高,但在其他文章中很少出现,则认为此词或者短语具有很好的区分能力。
2.TF-IDF数学定义
- T F = 特 定 词 汇 在 本 文 出 现 次 数 本 文 的 词 条 总 数 TF = \frac{特定词汇在本文出现次数}{本文的词条总数} TF=本文的词条总数特定词汇在本文出现次数
-
I
D
F
=
l
o
g
(
研
究
所
含
文
章
总
数
包
含
特
定
词
汇
的
文
章
数
)
IDF =log{ (\frac{研究所含文章总数}{包含特定词汇的文章数})}
IDF=log(包含特定词汇的文章数研究所含文章总数)
上面对于IDF的定义对于一些特殊情况会有一些问题,比如某一个生僻词在语料库中没有,则分母变为0,IDF就没有意义了,所以常用的IDF需要做一些平滑,使得语料库中没有出现的词也可以得到一个合适的IDF值。下面定义一种常见的平滑方法: - I D F = l o g ( 研 究 所 含 文 章 总 数 + 1 包 含 特 定 词 汇 的 文 章 数 + 1 ) + 1 IDF =log{ (\frac{研究所含文章总数+1}{包含特定词汇的文章数+1})}+1 IDF=log(包含特定词汇的文章数+1研究所含文章总数+1)+1
- T F − I D F = T F ∗ I D F TF-IDF = TF*IDF TF−IDF=TF∗IDF
二、python实现
一般的比赛我们是要自己分词,而且分词的效果对模型和结果影响较大。主办方已经分好词了,直接使用’word_seg’即可。当然这只是一个比较简略的版本,如果要进行后续工作的话,我觉得可以把’article’也用上,至少可以用来做模型融合,投票选最优等工作。
# 导入工具包
import pandas as pd
import pickle
from sklearn.feature_extraction.text import TfidfVectorizer
# 设置随机种子
random.seed(2019)
## 计算TF-IDF
vectorizer = TfidfVectorizer(ngram_range=(1, 2), min_df=3, max_df=0.9, sublinear_tf=True)
vectorizer.fit(train_dataset['word_seg'])
x_train = vectorizer.transform(train_dataset['word_seg'])
x_test = vectorizer.transform(test_dataset['word_seg'])
参考文献:
1.https://blog.csdn.net/qq_39493274/article/details/80460054
2.https://blog.csdn.net/gzmfxy/article/details/78891139
3.https://github.com/Heitao5200/DGB/blob/master/feature/feature_code/tfidf.py