1 、TFIDF简介
TF-IDF(term frequency–inverse document frequency)是一种用于信息检索与数据挖掘的常用加权技术。TF意思是词频(Term Frequency),IDF意思是逆文本频率指数(Inverse Document Frequency)。
TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF-IDF加权的各种形式常被搜索引擎应用,作为文件与用户查询之间相关程度的度量或评级。除了TF-IDF以外,因特网上的搜索引擎还会使用基于链接分析的评级方法,以确定文件在搜寻结果中出现的顺序。(来自百度百科)
image.png
其中, TFij指第i类在第j区域中出现的频率(第i个词在所属文档中出现的频率):
nij :第i类 在 第j区域中出现的次数(第i类词在所属文档中出现的次数)
∑nkj :第j区域 包含所有类的个数(文档的总ci)
IDFi :第i类 的逆文档频率:
D : 所有区域数(总文档数)
{j}: 包含第i类的区域数(包含词i 的文档数)
TFIDF的原理介绍到此:
2、python 实现TFIDF算法
2.1、数据预处理
原始数据为:
image.png
id 相当于词编号 (地名编号)
type 相当于具体词(地名类别,不同地名属于相同类别)
number 相当于词所属文档编号(区域编号)
#读取原始数据,将数据转化为python 格式
with open(filename,'r',encoding='utf-8') as f:
data = json.load(f)
读取到的数据格式为:
[
{
'id': '199728',
'type': 'a',
'number': '1',
'lon': '528.8833008',
'lat': '118.7771963'
}
]
数据处理步骤:
新建字典number_counts,存储处理后的数据
对列表中的数据做遍历,number_counts的key为文档编号;统计文档编号中词i出现的次数,将词i和相应出现的次数作为 键值对,并将其作为文档编号的value值。
for l in data:
if l["number"] not in number_counts.keys():
number_counts[l["number"]] = {}
if l["type"] not in number_counts[l["number"]].keys():
number_counts[l["number"]][l["type"]] = 1
else:
if l["type"] not in number_counts[l["number"]].keys():
number_counts[l["number"]][l["type"]] = 1
else:
number_counts[l["number"]][l["type"]] += 1
数据整理成如下格式:
{
“文档编号”:{
“词”:出现次数
}
}
2.2、计算TF值
对number_counts(对每篇文档)遍历,每类词的次数 除以 所有词次数总和
#计算TF值(TF=当前分区含有的I类POI数目/当前分区含有的POI数目)
def tf(number_counts):
for m in number_counts:
fenmu = 0
for j in number_counts[m]:
fenmu += number_counts[m][j]
for k in number_counts[m]:
number_counts[m][k] = number_counts[m][k]/fenmu
return number_counts
2.3、IDF值的计算
image.png
#计算IDF的值
def idf(number_counts):
#idf为出现每个词的文档数
idf = {"a":0,"b":0,"c":0,"d":0,"e":0,"f":0,"g":0,"h":0}
for l in idf:
count = 0
D = 0
for m in number_counts:
D += 1
if l in number_counts[m].keys():
count+=1
idf[l] = math.log(D/count)
return idf
2.3、计算TFIDF
image.png
TF-IDF是TF与IDF的乘积
#计算TF-IDF的值
def tf_idf(tf,idf):
for m in tf:
for k in idf:
if k in tf[m].keys():
tf[m][k] = tf[m][k]*idf[k]
return tf-idf
至此,每个词的TF-IDF值已经算出
输出格式为:
{
'1': {'a': 1.3698359575918795},
'2': {
'b': 0.631153666392926,
'd': 0.050841089560931516,
'e': 0.10032153974552628,
'f': 0.07109147765658877,
'a': 0.04643511720650439}
}
表示 为"a"在文档1中的TFIDF值为1.3698359575918795