您的位置:首页 > 编程语言 > Python开发

python学习笔记002

2017-06-11 12:48 471 查看
哈哈一晃就是一个学期

开始使用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()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python tfidf