参数化装饰器实现快速分词及生成词云图

import pandas as pd
import jieba

def lcut_from_excel(filetype: str, col_name: str = None,
                    encoding: str = 'utf-8'):
    def inner(func):
        def wrapper():
            filepath = func()
            review_list = read_reviews(filepath)
            words_dict = {}
            words_list = [jieba.lcut(word) for word in review_list]
            for words in words_list:
                for word in words:
                    if len(word) > 1:
                        words_dict[word] = words_dict.get(word, 0) + 1

            return words_dict

        def read_reviews(filepath):
            match filetype:
                case 'csv':
                    df = pd.read_csv(filepath, encoding=encoding)
                case 'xlsx':
                    df = pd.read_excel(filepath)
                case _:
                    raise ValueError('filetype error')
            review_list = df[col_name].tolist()
            return review_list

        return wrapper

    return inner


# 简易食用方式如下
@lcut_from_excel(filetype='csv', col_name='评论文本')
def lc():
    return r'xxx.csv'


result = lc()
print(result)
>>>{'怀疑': 1, '虚假': 1, '优惠': 2, '嫌疑': 1, '标高': 1, '价格': 8, ... }

同时也可以进一步编写wordcloud装饰器

import wordcloud
import matplotlib.pyplot as plt

def init_plt(func):
    def wrapper():
        # 解决中文乱码与负号问题
        plt.rcParams["font.sans-serif"] = "SimHei"
        plt.rcParams["axes.unicode_minus"] = False
        plt.figure(figsize=(10, 6))
        func()
        plt.show()

    return wrapper


def wc_c(title=None, save=None):
    def wc_i(func):
        @init_plt
        def wrapper():
            d = func()
            wc = wordcloud.WordCloud(
                font_path='simfang.ttf',
                max_words=100,  # 最多显示词数
                max_font_size=150,  # 字体最大值
                background_color='white',
                width=800, height=600,
                prefer_horizontal=1.0,
            )
            wc.generate_from_frequencies(d)
            plt.imshow(wc)
            plt.title(title, fontdict={'size': 18, 'weight': 'bold'})
            if save:
                plt.savefig(save)

        return wrapper
    return wc_i

合在一起食用方法如下:

@lcut_from_excel(filetype='csv', col_name='评论文本')
def lc():
    return r'xxx.csv'
result = lc()
@wc_c()
def wcc():
    return result
wcc()

# 这里参数还没设置好,参考就行

当然,如果不考虑到词频的后续使用,可以将两个装饰器合在一起,也可以通过减少参数设置达到更偷懒的食用效果。

# 注:其中的match/case模式匹配语句需要python3.10+版本

# 参考书籍:流畅的python(第2版)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值