python:TF-IDF计算
在构建语料库的时候,把每篇文献的关键词抽取出来,接下来是要利用语料库计算文本特征,打算从TF-IDF和拓扑特征两个角度计算,再将二者合并在一起,计算文献之间的相似度。
目前拓扑特征还在无限当机中…TF-IDF的概念很熟悉网上也有很多现成的代码,之前查资料的时候看到已经有现成的包可以之间计算TF-IDF,但是我个人觉得用自己编写内部机理可能更加自如吧~
重点计算的原理参考链接是:https://blog.****.net/zhb_bupt/article/details/40985831#commentBox
博文里面有很详细的算法实现的思路(在TF-IDF算法模块那一节)
结合我自己的需要,我的初步代码如下:
import math
def TFIDF(import_url,export_url,*words):
#export_url是为了需要把计算结果写出来用,看后续需要,初步代码中没有这个部分
data_source=open(import_url,'r')
data=data_source.readline()
word_in_afile_stat={}
word_in_allfiles_stat={}
files_num=0
while(data!=""):
data_temp_1=[]
data_temp_2=[]
data_temp_1=data.split("\t")
data_temp_2=data_temp_1[1].split(",")
file_name=data_temp_1[0]
data_temp_len=len(data_temp_2)
files_num+=1
for word in words:
if word in data_temp_2:
if word not in word_in_allfiles_stat:
word_in_allfiles_stat[word]=1
else:
word_in_allfiles_stat[word]+=1
if file_name not in word_in_afile_stat:
word_in_afile_stat[file_name]={}
if word not in word_in_afile_stat[file_name]:
word_in_afile_stat[file_name][word]=[]
word_in_afile_stat[file_name][word].append(data_temp_2.count(word))
word_in_afile_stat[file_name][word].append(data_temp_len)
data=data_source.readline()
data_source.close()
if(word_in_afile_stat)and (word_in_allfiles_stat)and(files_num):
TF_IDF_result={}
for filename in word_in_afile_stat.keys():
TF_IDF_result[filename]={}
for word in word_in_afile_stat[filename].keys():
word_n=word_in_afile_stat[filename][word][0]
word_sum=word_in_afile_stat[filename][word][1]
with_word_sum=word_in_allfiles_stat[word]
TF_IDF_result[filename][word]=((word_n/word_sum))*(math.log10(files_num/with_word_sum))
print(TF_IDF_result)
TFIDF('URL','','oper')
效果如下:
因为后期要用向量计算矩阵相似度,所以构建了一个所有单词的字典:
def corpus(import_url):
corpus=[]
data_source=open(import_url,'r')
data=data_source.readline()
while(data!=""):
data=data.strip('\n')
data_temp=[]
dataset=[]
data_temp=data.split("\t")
dataset=data_temp[1].split(",")
for word in dataset:
if word in corpus: continue
else:
corpus.append(word)
data=data_source.readline()
return corpus
outport=open('要写入字典的文档地址','w')
dic=' '.join(corpus("预处理过的文档地址"))
outport.write(dic)
结果如下:
就可以根据这个词典,计算每篇文档的向量了(数据量大的可以试那么几个)。不过实际运作中会发现print时后面的向量会覆盖前面的向量,所以我建议把计算的向量一个一个写入文档中(看需要,我是组会上要汇报成果,所以有点实在的效果比较好)
就酱~