🍝一、前言
之前写过一个文本关键字分析的脚本,但是那个脚本还绑定了一些其他的功能,相当于有些冗杂了☠,这里我将文本分词功能拎出来单独写,然后还在之前的文本分词中添加了一些其他的功能😎,像是添加停用词以及添加分词等功能。
🍛二、开发历程
1.需求分析🥝
首先我希望它能有这么几个功能🙄:
- 统计一篇文章中,每个词出现的次数并以
词:次数
的形式在终端输出,并以这种形式保存在文件夹中。 - 根据词出现的次数对词进行排序,可以自定义排序的方向,升序或者降序。
- 筛选出指定长度的词,比如说只筛选出一篇文章中长度大于3的词。
- 自定义展示以及保存排序后的前多少个词。
- 可以 添加停用词,添加停用词是什么意思呢? 就是除去分词产生的一些不需要的词,像是因为、所以、例如、即使这类没有意义的词,就在分词结果中去除掉。
- 可以 自定义词语,自定义词语是什么意思? 比如"中国的"是一个词,"年轻人"是一个词,当直接使用jieba库进行分词时,可能就会把"中国的年轻人"分成两个词,但是我们处于某种需求需要将"中国的年轻人"作为一个词,而不需要将它分开,这个时候就要将"中国的年轻人"这个词告诉jieba分词的时候不对它进行拆开,这就相当于自定义词语。
根据上述的需求,我就写了一个拥有六个参数的类:
# 开发时间:2021/10/29 18:49
import jieba
class keywords_analysis(object):
def __init__(self, filename, stop_words_filename=None, user_dict_filename=None, up_or_down=True,list_keywords=10, len_keywords=2):
# self.filename用于存储待分析txt文件的名称
self.filename = filename
# self.words_dic(dict)用于存储关键词及关键词出现的次数
self.words_dic = {}
# self.word_length(int)用于限制关键词的长度 默认关键词的长度为2
self.len_keywords = len_keywords
# 将self.words_dic中的字典数据转换成列表数据并且排序好存给变量self.sort_lst(list)
self.sort_lst = None
# self.up_or_down(bool)用于决定根据关键词次数排序时是升序还是降序 默认是降序排序
self.up_or_down = up_or_down
# list_keywords(int)参数是默认的展示的关键字条数以及存储的关键字条数,默认值为10,即默认展示和存储前10个关键字,当真实关键字条数小于list_keywords,将真实关键字条数赋值给list_keywords
self.list_keywords = list_keywords
# self.stop_words_filename接收txt文件(除去不需要的词) 默认值为空
self.stop_words_filename = stop_words_filename
# self.stopwords_lst(list)是用于存储停用词的列表
self.stopwords_lst=[]
# self.user_dict用于接收txt文件(添加分词) 默认值为空
self.user_dict_filename = user_dict_filename
def get_filename(self):
'''从文件路径中获取文件名'''
pass
def stop_words_list(self):
"""
创建停用词列表,未传入文件名时默认为空列表
:return:
"""
if self.stop_words_filename:
self.stopwords_lst = [word.strip() for word in open('stop_words/{}'.format(self.stop_words_filename),"r", encoding='UTF-8').readlines()]
# print(self.stopwords_lst)
def get_words_dict(self):
"""
获取每个关键词及其出现次数存储在字典中
:return:
"""
f = open("wait_to_analysis/{}".format(self.filename),"r",encoding="utf8")
content = f.read()
f.close()
if self.user_dict_filename:
jieba.load_userdict("add_words_to_jieba/{}".format(self.user_dict_filename))
words_lst = jieba.lcut(content)
for word in words_lst:
if word not in self.stopwords_lst:
if len(word)<self.len_keywords:
continue
else:
self.words_dic[word] = self.words_dic.get(word,0) + 1
else:
continue
return None
def sort_words(self):
"""
将self.words_dic转换成列表形式 进行排序 默认采用降序排序
:return:
"""
items = list(self.words_dic.items())
self.sort_lst = sorted(items,key=lambda x:x[1],reverse=self.up_or_down)
return None
def up_to_file(self):
"""
将关键词及关键词次数存储进文件
:return:
"""
f = open("analysis_result/(result){}".format(self.filename),"w",encoding="utf8")
if len(self.sort_lst) < self.list_keywords:
self.list_keywords = len(self.sort_lst)
for i in range(self.list_keywords):
k, v = self.sort_lst[i]
f.write("{}:{}\n".format(k, v))
f.close()
# for k,v in self.sort_lst:
# f.write("{}:{}\n".format(k,v))
# f.close()
def output(self):
"""
将分析关键词及关键词出现次数输出
:return:
"""
if len(self.sort_lst)< self.list_keywords:
self.list_keywords = len(self.sort_lst)
for i in range(self.list_keywords):
k, v = self.sort_lst[i]
if i < self.list_keywords - 1:
print("{}:{}".format(k, v), end=",")
else:
print("{}:{}".format(k, v))
return None
# for k,v in self.sort_lst:
# print("{}:{}".format(k,v))
# return None
def main(self):
"""
主函数
:return:
"""
self.stop_words_list()
self.get_words_dict()
self.sort_words()
self.up_to_file()
self.output()
if __name__=="__main__":
obj = keywords_analysis(filename="test.txt",user_dict_filename="user_dict.txt",stop_words_filename="stopword.txt")
obj.main()
注意:
👺在运行上述代码之前,需要先在代码文件的同级目录下创建add_words_to_jieba、analysis_result、stop_words、wait_to_analysis这四个文件夹,add_words_to_jieba文件夹用于存储添加词的txt文本,
analysis_result文件夹用于存储文本分词后的分析结果,stop_words文件夹用于存储停用词的txt文本,wait_to_analysis文件夹用于存储待分词的txt文本👾。
项目的目录结构像是这样:
----judge_text_by_analysis_keywords\
|----.idea\
|----add_words_to_jieba\ # 用于存储添加词的txt文本
| |----readme.md
| |----user_dict.txt
|----analysis_result\ # 用于存储文本分词后的分析结果
| |----(result)test.txt
| |----readme.md
|----main.py # 主函数
|----stop_words\ # 用于存储停用词的txt文本
| |----readme.md
| |----stopword.txt
|----wait_to_analysis\ # 用于存储待分词的txt文本
| |----readme.md
| |----test.txt
2.参数说明🥥
keywords_analysis类有六个参数🐱🏍:
- filename - 用于存储待分析txt文件的名称,注意传入这个参数的时候,只需要传入文件名+后缀即可不需要带上路径,例"test.txt"千万不要写出"./wait_to_analysis/test.txt",因为我在代码中默认写了是从wait_to_analysis文件夹下读取文件,所以注意要将待分析的文本放在wait_to_analysis文件夹下再进行操作。
- stop_words_filename - 用于接收停用词的txt文件,注意传入的txt文件,需要放在stop_words文件夹下,传入这个参数的时候,只需要传入文件名+后缀即可不需要带上路径,例"stopword.txt"千万不要写出"./stop_words/stopword.txt",因为我在代码中默认写了是从stop_words文件夹下读取停用词txt文件,所以注意要将停用词文本放在stop_words文件夹下再进行操作。
- user_dict_filename - 用于接收用户自定义词的txt文件,注意传入的txt文件,需要放在add_words_to_jieba文件夹下,传入这个参数的时候,只需要传入文件名+后缀即可不需要带上路径,例"userdict.txt"千万不要写出"./add_words_to_jieba/userdict.txt",因为我在代码中默认写了是从add_words_to_jieba文件夹下读取用户自定义词的txt文件,所以注意要将停用词文本放在add_words_to_jieba文件夹下再进行操作。
- up_or_down - up_or_down(bool)参数用来选择是升序排列还是降序排列,升序和降序是相对于关键词在文章中的出现次数来排序的(up_or_down的类型是bool类型),传入True表示升序,传入False表示降序,默认是True。
- list_keywords - list_keywords(int)参数是设置展示的关键词条数以及存储的关键词条数,默认值为10,即默认展示和存储前10个关键词,当真实关键词条数小于list_keywords,将真实关键词条数赋值给list_keywords。
- len_keywords - len_keywords(int)参数是用于筛选关键词长度大于等于len_keywords的关键词,默认值为3,即默认筛选长度大于3的关键词,就是筛选出大于指定长度的关键词。
3.演示效果🍇
待分词文本:
“躺平”,当下在中国的年轻人中成为了一个网络流行语,意思是他们更愿意躺下,降低自己的消费欲望,远离名利竞争。
激烈的升学竞争,紧张忙碌的996工作时间表(从早上9点工作到晚上9点,一周六天),还有飞涨的房价都让很多年轻人感到十分沮丧。有些人甚至认为无论他们怎样努力都无法成功,既然如此,干嘛不先躺下呢?
这些声音反映了当代中国社会年轻人对生活的不同态度。它一方面警示我们不要让国人变得不思进取、无欲无求;另一方面,它更多的是自嘲。不过我们不应夸大这种悲观情绪,政府正在积极寻求办法,试图解决年轻人关心的问题,这是件好事。
与一些人选择消极躺下相比,更多的年轻人则选择对工作恪尽职守。六万七千多名科学家和工程师献身于中国的航天事业,他们的平均年龄只有36岁,这比发达国家的同行们大约年轻了15岁。
成功不应该仅仅用名利来衡量。年轻人,如果累了就躺下,但不要让自己被压垮。
分词结果:
年轻人:5
工作:3
名利:2
竞争:2
成功:2
中国:2
选择:2
躺平:1
中国的年轻人:1
网络:1
