使用Python分析《水浒传》里面人物出现次数并生成词云图

使用Python分析《水浒传》里面人物出现次数并生成词云图
2021年09月06日 02:03 癡心不改冰彤

《水浒传》相信大家都不陌生吧,作为四大名著之一,读完之后无不为108个英雄的悲惨命运扼腕叹息,今天我们不讨论英雄们的悲惨命运,只对108条好汉在原著《水浒传》中出现的次数进行一个排名。

程序的思路很简单,分为以下几个步骤:

【第一步】获取108个好汉的名字【第二步】对原著《水浒传》进行分词统计【第三步】将《水浒传》中多余的词语删除后剩余108个好汉的出现次数【第四步】对108个好汉出现次数进行词云展示现在分步骤逐个击破

【第一步】提取108个好汉的名字

一个一个从网上复制粘贴?No,如果那样的话我们学习Python干什么?不如不学了。我从网上复制了一段含有108人绰号和名字的文本保存在本机,然后通过一段代码,逐个抽取出了108人的名字。代码及效果如下。

# coding:utf-8

name_lst = []

f = open('names.txt', 'r')

for item in f.readlines():

if item != "\n":

name_lst.append(item.split(' ')[-1].strip())

f.close()

f = open('name_lst.txt', 'w')

f.writelines('\n'.join(name_lst))

f.close()

我们将108人名字存储在本地name_lst.txt文件中。

【第二步】对原著《水浒传》进行分词统计操作

这一段不再赘述,上面已经讨论了很多篇幅,有疑问的童鞋请查看本人的其他博文,有不少相关讨论内容,我们直接分步骤上代码。需要提醒的是,在获取《水浒传》全文内容之后,建议在使用jieba分词前,添加上108个人的名字,以提高匹配度。之前,我做了几次实验(其中,乐和、呼延灼、李衮三个人没有匹配上)。添加自定义分词的方法是jieba.add_word(‘名字’)。

首先获得《水浒传》文件,并替换掉多余的标点符号

# 打开《水浒传》文件

#text_temp = codecs.open('水浒传.txt', 'r', encode='utf-8', errors='ignore')

text_temp = open("水浒传.txt", 'r', encoding='gbk', errors='ignore').read()

# 构造要替换的正则表达式字符

pattern= re.compile(u'\t|\n|\.|-|\”|;|\)|\(|\?|\“|。|;|,|、|\ |\  |\(|\)|\∶')

# 去除文本中无效字符

text_temp = re.sub(pattern, '', text_temp)

2.获取108人的名字,并存储在列表内

name_lst=[]

try:

with open('name_lst.txt', 'r') as f:

for line in f.readlines():

name_lst.append(line.strip())

except Exception as e:

print('Error')

3.将108个名字逐个添加到jieba自定义词中以便增加名字的匹配度

for item in name_lst:

jieba.add_word(item.strip())

4.进行分词处理,因为先前添加了人名,这时就能匹配全部任务名字

cut_text = jieba.cut(text_temp)

print(cut_text)

5.统计词数

text_dict = collections.Counter(list(cut_text))

【第三步】将《水浒传》中多余的词语删除后剩余108个好汉的出现次数

result_dict = {}

for item in text_dict.keys():

if item in name_lst:

result_dict[item] = text_dict.get(item, '没获取到数据')

最终,我们得到result_dict字典,里面只是保留了人名出现的次数。

【第四步】对108个好汉出现次数进行词云展示

path_image='timg.jpg'

font_path="SIMLI.ttf"

background_image = np.array(Image.open(path_image))

wd = WordCloud(

max_font_size = 500,

random_state=10,

font_path=font_path,

background_color="white",

mask=background_image

).generate_from_frequencies(result_dict)

wd.to_file('shuihurenwu.png')

plt.imshow(wd,interpolation="bilinear")

plt.axis("off")

plt.show()

原来宋江、李逵、武松、吴用等人出现次数比较多,怎么样,Python处理这些内容是不是很方便?

财经自媒体联盟更多自媒体作者

新浪首页 语音播报 相关新闻 返回顶部