python:TF-IDF计算

在构建语料库的时候,把每篇文献的关键词抽取出来,接下来是要利用语料库计算文本特征,打算从TF-IDF和拓扑特征两个角度计算,再将二者合并在一起,计算文献之间的相似度。
目前拓扑特征还在无限当机中…TF-IDF的概念很熟悉网上也有很多现成的代码,之前查资料的时候看到已经有现成的包可以之间计算TF-IDF,但是我个人觉得用自己编写内部机理可能更加自如吧~
重点计算的原理参考链接是:https://blog.csdn.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')

效果如下:python:TF-IDF计算

因为后期要用向量计算矩阵相似度,所以构建了一个所有单词的字典:

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)

结果如下:
python:TF-IDF计算

就可以根据这个词典,计算每篇文档的向量了(数据量大的可以试那么几个)。不过实际运作中会发现print时后面的向量会覆盖前面的向量,所以我建议把计算的向量一个一个写入文档中(看需要,我是组会上要汇报成果,所以有点实在的效果比较好)
python:TF-IDF计算

就酱~