哈哈一晃就是一個學期。
開始使用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()