文本分词脚本

🍝一、前言

之前写过一个文本关键字分析的脚本,但是那个脚本还绑定了一些其他的功能,相当于有些冗杂了☠,这里我将文本分词功能拎出来单独写,然后还在之前的文本分词中添加了一些其他的功能😎,像是添加停用词以及添加分词等功能

🍛二、开发历程

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

🍕三、脚本的发文平台及开源平台

github仓库地址🙈
gitee仓库地址🙉
博客首页🙊

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

布兹学长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值