# TF-IDF
词频-逆文档频率(Term Frequency-Inverse Document Frequency,TF-IDF)是一种用于资讯检索和文本挖掘的常用加权技术
TF-IDF是一种统计方法,用以评估一个词对于一个文件集或者一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降
主要思想:如果某个词或者短语在一篇文章中出现的TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用于分类
TF-IDF加权的各种形式常被搜索引擎应用,作为文件与用户查询之间相关程度的度量和评级
# 词频(Term Frequency,TF)
指的是某一个给定词语在该文件中出现的频率,这个数字是对词数的归一化,以防止偏向更长的文件
TF = 词语在文章中出现的次数/文章中全部词数
# 逆文档频率(Inverse Document Frequency,IDF)
是一个词语普遍重要性的度量,某一次与的IDF,可以由总文档数目除以包含该词语的文档数目,再将商取对数得到
表示文档集中文档总数,表示文档集中包含词语的文档数
import pandas as pd
import math
class TF_IDF:
def __init__(self):
pass
def compute_tf(self, word_dict, bow):
tf = {}
n = len(bow)
for word, count in word_dict.items():
tf[word] = count / n
return tf
def compute_idf(self, word_dict_list):
"""
计算IDF = log10((N+1)/(Ni+1)),如果每个文档中都存在某个词,则IDF=0
:param word_dict_list:
:return: IDF
"""
idf = {}.fromkeys(word_dict_list[0], 0)
N = len(word_dict_list)
for word_dict in word_dict_list:
for word, count in word_dict.items():
if count > 0:
idf[word] += 1
for word, ni in idf.items():
idf[word] = math.log10((N+1)/(ni+1))
return idf
def compute_tf_idf(self, tf, idf):
tf_idfs = {}
for word, tfval in tf.items():
tf_idfs[word] = tfval*idf[word]
return tf_idfs
# 有两个文档
doc_a = "The cat sat on my bed"
doc_b = "The dog sat on my knees"
# 对两个文档分词
bow_a = set(doc_a.split(" "))
bow_b = set(doc_b.split(" "))
# 统计每个文档的词典
word_set = bow_a.union(bow_b)
word_dict_a = dict.fromkeys(word_set, 0)
word_dict_b = dict.fromkeys(word_set, 0)
for word in bow_a:
word_dict_a[word] += 1
for word in bow_b:
word_dict_b[word] += 1
# 计算TF-IDF
tf_idf = TF_IDF()
tf_a = tf_idf.compute_tf(word_dict_a, bow_a)
tf_b = tf_idf.compute_tf(word_dict_b, bow_b)
idf = tf_idf.compute_idf([word_dict_a, word_dict_b])
tf_idf_a = tf_idf.compute_tf_idf(tf_a, idf)
tf_idf_b = tf_idf.compute_tf_idf(tf_b, idf)
print(pd.DataFrame([tf_idf_a, tf_idf_b]))
结果如下:
其中文档1中的关键词是cat和bed;文档2中的关键词是knees和dog
← 协同过滤 逻辑回归和多项式模型 →