python TF-IDF词频算法实现文本关键词提取代码
TF(TermFrequency)词频,文章中出现次数最多的词,但文章中出现次数多的词不一定是关键词,如一般来说,停用词对文章本身没有多大意义。所以我
TF(词频)指的是文章中出现次数最多的词。然而,文章中出现次数较多的词不一定是关键词。例如,常见的停用对于项目本身来说没有什么意义。单词。所以我们需要一个重要性调整系数来衡量一个词是否是常用词。这个权重就是IDF(逆文档频率),它的大小与一个词的共性成反比。我们得到词频(TF)和逆文档频率(IDF)后,将两个值相乘就得到一个词的TF-IDF值。一个词对文章越重要,它的 TF-IDF 值就越高。越大,所以前几个词就是文章的关键词。
TF-IDF算法的优点是简单、快速,结果更符合实际情况。然而,单纯通过“词频”来衡量一个词的重要性是不够全面的。有时重要的单词可能不会出现很多次,这种算法无法反映单词的位置信息。较早出现的单词和较晚出现的单词被认为同等重要,这是不合理的。
TF-IDF算法步骤:
(1)、计算词频:
词频 = 某词在文章中出现的次数
文章长度考虑了差异考虑不同文章之间的比较,将词频标准化
词频=某词在文章中出现的次数/文章总词数
词频=某词出现的次数单词在文章中出现的单词/文章中出现次数最多的单词
(2),逆文档频率
的计算需要语料库来模拟语言使用环境。
逆文档频率 = log(语料库中文档总数/(包含该单词的文档数量+1))
(3),计算TF-IDF
TF-IDF = 词频(TF ) * 逆文档频率(IDF)
详细代码如下:
#!/usr/bin/env python
#-*- coding:utf-8 -*-
'''
计算文档的TF-IDF
'''
import codecs
import os
import math
import shutil
#读取文本文件
def readtxt(path):
with codecs.open(path,"r",encoding="utf-8") as f:
content = ().strip()
return content
#统计词频
def count_word(content):
word_dic ={}
words_list = ("/")
del_word = ["\r\n","/s"," ","/n"]
for word in words_list:
if word not in del_word:
if word in word_dic:
word_dic[word] = word_dic[word]+1
else:
word_dic[word] = 1
return word_dic
#遍历文件夹
def funfolder(path):
filesArray = []
for root,dirs,files in os.walk(path):
for file in files:
each_file = str(root+"//"+file)
(each_file)
return filesArray
#计算TF-IDF
def count_tfidf(word_dic,words_dic,files_Array):
word_idf={}
word_tfidf = {}
num_files = len(files_Array)
for word in word_dic:
for words in words_dic:
if word in words:
if word in word_idf:
word_idf[word] = word_idf[word] + 1
else:
word_idf[word] = 1
for key,value in word_dic.items():
if key !=" ":
word_tfidf[key] = value * (num_files/(word_idf[key]+1))
#降序排序
values_list = sorted((),key = lambda item:item[1],reverse=True)
return values_list
#新建文件夹
def buildfolder(path):
if os.path.exists(path):
(path)
(path)
print("成功创建文件夹!")
#写入文件
def out_file(path,content_list):
with codecs.open(path,"a",encoding="utf-8") as f:
for content in content_list:
(str(content[0]) + ":" + str(content[1])+"\r\n")
print("well done!")
def main():
#遍历文件夹
folder_path = r"分词结果"
files_array = funfolder(folder_path)
#生成语料库
files_dic = []
for file_path in files_array:
file = readtxt(file_path)
word_dic = count_word(file)
(word_dic)
#新建文件夹
new_folder = r"tfidf计算结果"
buildfolder(new_folder)
#计算tf-idf,并将结果存入txt
i=0
for file in files_dic:
tf_idf = count_tfidf(file,files_dic,files_array)
files_path = files_array[i].split("//")
#print(files_path)
outfile_name = files_path[1]
#print(outfile_name)
out_path = r"%s//%"%(new_folder,outfile_name)
out_file(out_path,tf_idf)
i=i+1
if __name__ == '__main__':
main() 版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
code前端网