TF-IDF算法的Python语言实现

本博客分享了作者使用Python进行文本处理的经验,包括编写爬虫、文本预处理、词频统计等功能。通过具体案例,介绍了如何利用Python第三方库如BeautifulSoup和requests进行网页抓取,并实现TF-IDF算法计算文本关键词权重。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

哈哈一晃就是一个学期

开始使用python做一些小玩意,比如写了爬虫,写了文本处理的小脚本(文本预处理,词频统计,实体抽取,,tfidf的计算……),但还是有点疑惑,为什么我所应用到python文本处理的程序,都没有使用面向对象呢?这可能是我一个很简单的程序还得写个100多行的原因。不过写python用的比较多的是模块——各种模块,比如BeautifulSoup、requests等,可能是这些开源的模块封装的太好,剩下的就是写过程了?不过,能抓到耗子的就是好猫,能够把结果运行出来的程序就是我要的程序。

最近王老师给买了几本书,感觉只要掌握其中一本书,我就“发”了~……咳咳。

 

努力!

 

———附上我渣渣的tfidf计算程序———

# coding = utf-8
# author:zzh-748
""" 程序功能:遍历名为“赫”的文件夹中所有文件集
			 计算每一篇文档的tfidf值,输出屏幕,并写入文档中
"""

import os
import math

def list_dir(filepath):# 获得当前文件夹下所有文件名
	# dir_names=os.listdir(filepath)
	dir_names=os.walk(filepath)
	return dir_names


def lines_spilt(lines): # 将一篇文献,按照'/'切分,并存入列表tf_list
	t_list=[] # 存储切分词列表
	for line in lines:
		line=line.split('/')
		for i in range(len(line)):
			buf_line=line[i].replace('\n','').replace(' ','').replace('\u3000','')
			if(buf_line!=''):
				t_list.append(str(buf_line))
	return t_list


def Num_in_set(tf_dic):
	global wordNum_in_set # 准备将此篇文献中的词,导入到词出现总数文档中
	for term in tf_dic:
		if term in wordNum_in_set:
			wordNum_in_set[term]+=1
		else:
			wordNum_in_set[term]=1


def dic_fw(a_dic,file,dicname):
	a_dic=sorted(a_dic.items(),key=lambda item:item[1])
	# print(a_dic)
	max_num=a_dic[-1][-1] # 取本文中的最大词频
	fw_path=dicname+'-result\\'+file.split('\\')[-3]+'\\'+file.split('\\')[-2]+'\\'

	if os.path.exists(fw_path)==False:
		os.makedirs(fw_path) 

	if dicname=='tf':
		fw_path=fw_path+file.split('\\')[-1].replace('.txt','-'+dicname+'.txt') # 写入文档位置
		fw=open(fw_path,'w+',encoding='utf-8')
		for term in a_dic:
			fw.write(term[0]+'\t'+str(term[1]/max_num)+'\n')
			# print(term[0]+'\t'+str(term[1]/max_num)) #计算出tf值
	
	if dicname=='tf_idf':
		fw_path=fw_path+file.split('\\')[-1].replace('-tf.txt','-'+dicname+'.txt') # 写入文档位置
		fw=open(fw_path,'w+',encoding='utf-8')
		for term in a_dic:
			fw.write(term[0]+'\t'+str(term[1])+'\n')
			# print(term[0]+'\t'+str(term[1]/max_num)) #计算出tf值
	fw.close()

def tf(lines,file): # 统计一篇文献的词频。lines=[]。获取路径
	global stopword_list # 引入停用词表
	tf_dic={} # 记录tf的初始字典
	t_list=lines_spilt(lines) # 切分后列表
	for term in t_list:
		if term not in stopword_list: # 去掉停用词	
			if term in tf_dic:
				tf_dic[term]+=1
			else:
				tf_dic[term]=1
	
	Num_in_set(tf_dic)
	dic_fw(tf_dic,file,'tf')#写入文档
	
def idf_write():
	global wordNum_in_set
	wordNum_in_set=sorted(wordNum_in_set.items(),key=lambda item:item[1])
	with open('idf.txt','w+',encoding='utf-8') as idf:
		for term in wordNum_in_set:
			idf.write(term[0]+'\t'+str(term[1])+'\n')
	print('词出现次数写入完成---idf.txt')

def get_Doc_path_lists(filepath): # 获取文献地址,返回列表
	filelists=[]
	dir_names=list_dir(filepath)
	for root,dirs,files in dir_names:
		for file in files:
			if '.txt' in file: 
				# print(root+'\\'+file)
				filelists.append(root+'\\'+file) # 加地址	
	return filelists

def tfidf(Doc_Num):
	fw=open("关键词.txt",'a+',encoding='utf-8')

	global wordNum_in_set
	files=get_Doc_path_lists(tf_filepath)#获得tf结果
	for file in files:
		tf_idf_dic={} # 记录结果数字
		with open(file,'r',encoding='utf-8') as f:
			lines=f.readlines()
		try:
			for line in lines:
				word=line.split('\t')[0].replace(' ','').replace('\n','')
				tf=line.split('\t')[1].replace('\n','') # tf值
				buf=float(Doc_Num/(wordNum_in_set[word]+1))
				tf_idf=float(tf)*math.log(buf)
				# print(word)
				tf_idf_dic[word]=tf_idf
			# print(file.replace('.txt','idf.txt')+': tfidf计算完成')
			dic_fw(tf_idf_dic,file,'tf_idf')
			tf_idf_dic=sorted(tf_idf_dic.items(),key=lambda item:item[1])
			fw.write(file.split('\\')[-1].replace('.txt','idf.txt')+' 关键词:'+'\t'+tf_idf_dic[-1][0]+'\t'+tf_idf_dic[-2][0]+'\t'+tf_idf_dic[-3][0]+'\t'+tf_idf_dic[-4][0]+'\t'+tf_idf_dic[-5][0]+'\n')
			print(file.replace('.txt','idf.txt')+' 关键词:'+'\t'+tf_idf_dic[-1][0]+'\t'+tf_idf_dic[-2][0]+'\t'+tf_idf_dic[-3][0]+'\t'+tf_idf_dic[-4][0]+'\t'+tf_idf_dic[-5][0]+'\n')
		except Exception as e:
			pass	
	print('ok')
	fw.close()
def main():
	global stopword_list
	with open('stop.txt','r',encoding='utf-8') as stopf:
		stopword_list = stopf.readlines()
		for i in range(len(stopword_list)):
			stopword_list[i]=stopword_list[i].replace('\n','')
	files=get_Doc_path_lists(filepath)
	Doc_Num=len(files)  #文献总数
	for file in files:
		try:	
			with open(file,'r',encoding='utf-8') as f:
				lines=f.readlines()
			tf(lines,file)
			print(file+': 写入完成')
		except Exception as e:
			print(file+"------------error")
	# idf_write() # 记录idf 
	tfidf(Doc_Num) #计算tf-idf

global filepath # 根地址,可改
filepath=r"D:\python\workspace\tfidf\赫"

global stopword_list # 停用词表
stopword_list=[] 

global wordNum_in_set # 记录出现过某词的文档数
wordNum_in_set={}

global tf_filepath
tf_filepath=r"D:\python\workspace\tfidf\tf-result"

if __name__=='__main__':
	main()


 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值