使用python jieba库,批量统计某文件夹下所有docx文件内的关键词的词频,并且支持自定义词库。
其中 'D:/2.txt' 为自定义的关键词文本。之所以要自定义关键字,还是因为jieba对都写关键词的统计还不够人性化。例如'中国人民', 如果不自定义的话,jieba可能会将这个词拆分成 '中国'和'人民'两个关键词。但是如果你想把'中国人民'作为一个关键词来统计的话,你可以在这个txt文件中 写入'中国人民',多个关键词换行或者空格隔开即可(记住只需要写入关键词,不要把引号也带上)
out2.txt和out3.txt是将输出结果写入本地的。
d:\nnword 就是你要遍历的docx文件的地址。
只需要将你的docx文件全部放到指定的文件夹下(d:\nnword)。然后自定义一个词库问文本文件(D:/2.txt) 然后直接运行代码就行。
代码如下:
import jieba
import os
from docx import Document
# 创建关键词列表
keywords = []
jieba.load_userdict('D:/2.txt') # 增加自定义词库
key_open = open('D:/2.txt', 'r', encoding='utf-8')
for words in key_open:
keywords.append(words.strip())
key_open.close()
print(keywords)
word_dict2 = {}
word_lst = []
def word_list(word_dict, word_lst):
# 统计词
for item in word_lst:
if item not in word_dict:
word_dict[item] = 1
else:
word_dict[item] += 1
return word_dict
with open('D:/out1.txt', 'w') as wf1:
for info in os.listdir(r'd:\nnword'): # 'd:\nnword' 是docx文档的地址
domain = os.path.abspath(r'd:\nnword')
print('《' + info + '》') # 打印出docx的文件名
print('------------------------------')
info1 = os.path.join(domain, info) # 拼接路径
document = Document(info1)
word_lst1 = []
word_dict1 = {}
# 打开 docx 文件
for paragraph in document.paragraphs: # 遍历每一个docx文档
tags = jieba.cut(paragraph.text)
for t in tags:
if len(t) > 1:
word_lst.append(t)
word_lst1.append(t)
# 统计每篇文章的输出结果,并排序
word_list(word_dict1, word_lst1)
word_sort1 = sorted(word_dict1.items(), key=lambda x: x[1], reverse=True)
wf1.write(str('*' * 5) + info + str('*' * 5) + '\n') # 打印题目
# 将每篇文章的 统计结果输出到文本
for i in range(len(word_sort1)):
if word_sort1[i][0] in keywords:
wf1.write(str(word_sort1[i][0] + '\t\t' + str(word_sort1[i][1]) + '\n'))
# 总的统计结果,
word_list(word_dict2, word_lst)
word_sort = sorted(word_dict2.items(), key=lambda x: x[1], reverse=True)
with open("D:/out2.txt", 'w') as wf2, open("D:/out3.txt", "w") as wf3:
for i in range(len(word_sort)):
# 总的分词结果
wf2.write(str(word_sort[i][0]) + '\t\t' + str(word_sort[i][1]) + '\n')
if word_sort[i][0] in keywords:
# 符合关键词的
wf3.write("{0:15}\t{1:10}".format(str(word_sort[i][0]), str(word_sort[i][1]), chr(12288)) + '\n')
wf2.close()
wf3.close()