TF-IDF算法的Python語言實現

哈哈一晃就是一個學期

開始使用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()


 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章