1、假设
(1)共有m篇文档
(2)第i篇文档,包含Ki个词
(3)第i篇文档,词j出现的次数,记为Ci,j
(4)含有词j的文档一共有Lj篇
2、数据解释
TF:Term frequency(词频):某个词在该文档中出现的频率
IDF:Inverse document frequency(逆文档频率):总文档数m与含有词i的文档数的比值的对数
3、计算:以第i篇文档中的词j为例
TF = Ci,j/Ki
IDF = log(m/(1 + Lj)) //分母’+1’时防止Lj为0
TF-IDF = TF * IDF
4、代码的说明
(1)只用一个文档作为求解TF-IDF过程的说明,因此,TF、IDF的计算式的理解,也有了一些变化。实际应用在多文档中,需要调整
(2)这篇文档中,每行都是一个评论,共100行。(测试用,我删了很多)
(2)TF的计算,分母就取了这个文档所含总词数
(3)IDF的计算中,则m=100,L的含义也变成了含有词j的评论数量(评价均在一个文档中)
(4)代码包含一些预处理步骤:如去掉评论中的停止词和换行等字符、jieba分词等等。
代码如下
import jieba
import nltk
import math
# 按行读取,每一个非空行作为list的一个元素
def load_txt(filename):
lists = []
with open(filename, mode='r', encoding='utf-8', errors='ignore') as f:
for each in f.readlines():
if each != '':
lists.append(each.strip('\n'))
return lists # list[str1,str2,...]
# 按行读取,去掉每行的换行和回车后,每行作为list的一个元素
def load_stopwords(filename):
stopwords = []
with open(filename, mode='r', encoding='utf-8'