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版)