Python 用一行代码完成词频统计与分析,词频分析如此简单

文章目录

  • 1 前言
  • 2 先看效果
  • 3 上源码
  • 3.1 庐山真面目(源码)
  • 3.2 `MsgLoad`类介绍(非源码)
  • 3.3 `Words`类介绍(非源码)
  • 1 前言

    (郑重声明:本博文版权归扫地僧-smile所有,博文禁止转载!)

    (关注博主,不定期更新博客,每一篇都是精品哦,满满干货!!!)

    扫地僧-smile 潜心打造保姆级知识点博客,从提出疑问到全面解决,仅看此就够了。本博客汇聚以下优势

  • 问题相关知识齐全

  • 解决问题逻辑清晰

  • 所有演示代码均可用:无乱码,注释清晰,可复制,全部代码均自己开发,测试无误后上传。

  • 依赖的三方模块
    # 全局环境安装
    pip install pandas jieba openpyxl -i https://mirror.baidu.com/pypi/simple/
    
    # 虚拟环境安装(PyChram创建)
    cd 项目根目录
    .\venv\Scripts\activate
    pip install pandas jieba openpyxl -i https://mirror.baidu.com/pypi/simple/
    

    2 先看效果

  • 分析词频效果如图所示:
  • 以上效果只因一行代码,看代码。
  • if __name__ == '__main__':
        MsgLoad("./wechat.csv").words_column_values("content").to_excel()
    
  • 你没有看错,真的只需这1行代码,点击运行即可完成。
  • 我们先理解一下这行代码,首先我们创建 MsgLoad("./wechat.csv")实例对象,读取出 wechat.csv的内容,然后,我们使用 MsgLoad 类的 words_column_values方法读取 wechat.csv“content”字段的值,并生成 Words类的实例,最后我们使用 Words类的to_excel 方法自动生成excel表完成词频统计。
  • 我们读取的文件也不仅限于CSVEXCEL文件也可以哦。我们输出的类型页不仅限于EXCEL,还可以ListSetDataFrame输出哦。
  • 上面的过程确实很简单,但 MsgLoadWords类到底是啥呢?都有什么作用呢?
  • 3 上源码

    3.1 庐山真面目(源码)

    # -*- coding:utf-8 -*-
    # Author : 扫地僧-smile
    # Data : 2022/7/26 15:01
    
    import pandas as pd
    from concurrent.futures import ThreadPoolExecutor
    import jieba
    import os
    import random
    
    
    class Words:
    
        def __init__(self, data):
            """
            :param data: 可迭代对象,item为字符串类型
            """
            self.__jieba = jieba  # 初始化加载模型,提高引用效率
            self.__data = data
            self.__word_list = list()
            self.__word_set = set()
            self.__result_list = list()
            self.__core()
            self.__result()
    
        def __str__(self):
            return str(self.__data)
    
        def __split(self, data):
            _temp_list = self.__jieba.cut(data)
            for word in _temp_list:
                if len(word) >= 2:
                    self.__word_list.append(word)
    
        def __core(self):
            self.__pool = ThreadPoolExecutor(100)
            for i in self.__data:
                self.__pool.submit(self.__split, i)
            self.__pool.shutdown(True)
            del self.__pool
    
        def __count(self, data):
            times = self.__word_list.count(data)
            self.__word_list.remove(data)
            self.__result_list.append([data, times])
    
        def __result(self):
            self.__pool = ThreadPoolExecutor(100)
            for word in self.word_set():
                self.__pool.submit(self.__count, word)
            self.__pool.shutdown(True)
            del self.__pool
    
        def word_list(self) -> list:
            """
            :return: 返回所有单词的列表,包含重复
            """
            return self.__word_list
    
        def word_set(self) -> set:
            """
            :return: 返回所有单词的集合,滤除重复
            """
            self.__word_set = set(self.__word_list)
            return self.__word_set
    
        def word_result(self) -> list:
            """
            :return: 返回所有单词以及出现次数的列表,例如:[['姑娘', 1], ['亲爱', 2], ['自己', 38], ['smile', 1], ['我爱你', 1]]
            """
            return self.__result_list
    
        def to_excel(self):
            if not os.path.exists("./Words"):
                os.mkdir("./Words")
            _name_list = random.sample('0123456789abcdef',10)
            _name = ""
            for i in _name_list:
                _name = _name + i
            _name = "./Words/{}.xlsx".format(_name)
            return self.to_dataframe().to_excel(_name)
    
        def to_dataframe(self):
            """
            :return: DataFrame格式输出
            """
            result = pd.DataFrame(self.__result_list, columns=["words", "times"])
            result = result.sort_values(by="times", ascending=False, ignore_index=True)
            return result
    
    
    class MsgLoad:
    
        def __init__(self, filepath, sheet=0, header=0, skiprows=0):
            """
            :param filepath: 文件路径
            :param sheet: 工作簿名,也可以用0,1,2,3.....表示(.xlsx .xls使用)
            :param header: 字段名所在的行,从0开始(.xlsx .xls使用)
            :param skiprows : 从第几行读取数据,从0开始(.xlsx .xls使用)
            """
            _ex_name = os.path.splitext(filepath)[1]
            if _ex_name == (".xlsx" or ".xls"):
                self.__pd = pd.read_excel(filepath, sheet_name=sheet, header=header, skiprows= skiprows)
            elif _ex_name == ".csv":
                self.__pd = pd.read_csv(filepath)
            else:
                pass
    
        def __str__(self):
            return str(self.__pd)
    
        def get_column_values(self, arg) -> list:
            """
            :param arg: 输入column名
            :return:  输出List对象,指定列的值在此列表内
            """
            msg_content = [content for content in self.__pd.loc[:, arg].values]
            return msg_content
    
        def get_row_values(self, arg) -> list:
            """
            :param arg: 输入index
            :return: 输出List对象,指定行的值在此列表内
            """
            return list(self.__pd.loc[arg, :].values)
    
        def words_column_values(self, arg) -> Words:
            """
            :param arg: 输入column名
            :return:  输出Words对象,指定列的值的列表输入其内
            """
            msg_content = [content for content in self.__pd.loc[:, arg].values]
            return Words(msg_content)
    
        def words_row_values(self, arg) -> Words:
            """
            :param arg: 输入index
            :return: 输出Words对象,指定行的值的列表输入其内
            """
            msg_content = list(self.__pd.loc[arg, :].values)
            return Words(msg_content)
    
    
    if __name__ == '__main__':
        MsgLoad("./wechat.csv").words_column_values("content").to_excel()
    
    
  • 庐山真面目我们终于获知。实现词频统计,我们依赖 MsgLoadWords这两个类。那这两个类具体怎么用?接下来我们一一详解。
  • 3.2 MsgLoad类介绍(非源码)

    class MsgLoad:
        """
        该类用于读取CSV或EXCEL文件,以及筛选出该文件的某些字段,方便后续的数据处理
        """
    
        def __init__(self, filepath, sheet=0, header=0, skiprows=0):
            """
            初始化加载文件,生成DataFrame类型。
            """
    
        def __str__(self):
            return str(self.__pd)
    
        def get_column_values(self, arg) -> list:
            """
            填入字段名,将会返回该字段所有值的列表形式
            """
    
        def get_row_values(self, arg) -> list:
            """
            填入DataFrame的Index,将会返回该行所有值的列表形式
            """
    
        def words_column_values(self, arg) -> Words:
            """
            填入字段名,将会返回该字段所有值的Words类型
            """
    
        def words_row_values(self, arg) -> Words:
            """
            填入字段名,将会返回该字段所有值的Words类型
            """
    

    3.3 Words类介绍(非源码)

    class Words:
        """
        该类用于对输入内容的分词,词频技术,排序,输出结果的类型转换。
        """
    
        def __init__(self, data):
            """
            data为可迭代对象,迭代项目item应全部为字符串类型
            """
    
        def __str__(self):
            return str(self.__data)
    
        def __split(self, data):
            # 中间运算,请忽略
    
        def __core(self):
            # 中间运算,请忽略
    
        def __count(self, data):
            # 中间运算,请忽略
    
        def __result(self):
            # 中间运算,请忽略
    
        def word_list(self) -> list:
            """
            结果输出:内容为所有分词的列表,未删除重复分词
            """
    
        def word_set(self) -> set:
            """
            结果输出:内容为所有分词的集合,没有重复,无序
            """
    
        def word_result(self) -> list:
            """
            结果输出:内容为所有分词的二维表,没有重复,无序,内容包含分词和出现的次数
            例如:
            [
            ["爱你",16]
            ["吃饭",28]
            ]
            """
    
        def to_excel(self):
            """
             结果输出:输出Excel表,词序按照次数降序排列,表格的名称自动生成,表格自动存在./Words/目录下
            """
    
    
        def to_dataframe(self):
            """
            结果输出:输出Excel表,内容同to_excel
            """
    
    
  • 好啦,各方法已经讲解完毕。欢迎大家使用哦,有疑问可以在评论区发出,我会不断解答和更新此博客哦。
  • 来源:扫地僧-smile

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python 用一行代码完成词频统计与分析,词频分析如此简单

    发表评论