刚开始学TF-IDF的时候,总是被各种分解概念搞得很糊涂。也对其内里是怎么计算的一知半解。学知识最怕一知半解,所以今日就来一一拆解,弄清楚究竟是怎么回事。
文中的代码notebook:
https://github.com/haomingsama/NLP/blob/master/spam_detector/sms_spam.ipynbgithub.com什么是Document-term matrix
要了解IF-IDF之前,我们要先明白什么是Document-term matrix. 他就长下面这样。
这个matrix的每一行,都代表着一个数据,这个数据可以是评论,可以是邮件,可以是任何句子。
每一列,代表一个词,所以如果数据量很大,词很多,那么列也会有很多。
那么每一个entry代表什么呢?这个就要取决于这个矩阵是关于Count的,TF的还是 TF-IDF的
Count, TF, DF, IDF, TF-IDF 的区别
Count 意思是数数。document-term 矩阵里面的每一个entry(i,j),就表示在这封在第i封邮件中,j号词出现了几次。一行数据的所有列加总,等于这封邮件的总字数。比如下图
在sklearn中,如果要将数据进行count处理,应该使用CountVectorizer,将拿到的raw text data向量化。比如
from sklearn.feature_extraction.text import CountVectorizer
Count_Vectorizer = CountVectorizer(decode_error = 'ignore')
X = Count_Vectorizer.fit_transform(data['text']) # X 已经是经过向量化的矩阵了
X.todense()