统计某本小说中人物出场次数,并形成词云图。(至少统计出出场次数最多的前5个人物;词云图与统计的人物次数基本一致)
时间: 2024-01-30 16:08:06 浏览: 206
Python统计西游记主要人物出场次数(使用jieba分词).zip
5星 · 资源好评率100%
好的,我可以帮你完成这个任务。首先,我们需要使用Python中的一些工具来实现这个功能。具体步骤如下:
1. 读取小说文本文件,将其转换为字符串格式。
2. 使用正则表达式或其他方法,从文本中提取人物名字。
3. 统计每个人物在文本中出现的次数。
4. 找出出场次数最多的前5个人物。
5. 使用Python中的词云库,生成词云图。
以下是代码实现的详细步骤:
```python
# 导入所需库和模块
import re
from collections import Counter
import jieba
from wordcloud import WordCloud
import matplotlib.pyplot as plt
# 读取小说文本文件
with open('novel.txt', 'r', encoding='utf-8') as f:
text = f.read()
# 使用正则表达式从文本中提取人物名字
pattern = '[\u4e00-\u9fa5]{2,5}(?:·[\u4e00-\u9fa5]{2,5})*'
names = re.findall(pattern, text)
# 统计每个人物在文本中出现的次数
name_counts = Counter(names)
# 找出出场次数最多的前5个人物
top_names = name_counts.most_common(5)
# 准备词云的文本和权重数据
name_weights = {}
for name, count in top_names:
name_weights[name] = count
# 使用 jieba 分词
text = ' '.join(jieba.cut(text))
# 生成词云图
wc = WordCloud(background_color='white', font_path='msyh.ttc', width=800, height=600)
wc.generate_from_frequencies(name_weights)
plt.imshow(wc)
plt.axis('off')
plt.show()
```
上述代码中,我们使用了正则表达式来提取文本中的人物名字。正则表达式 `[\\u4e00-\\u9fa5]{2,5}(?:·[\\u4e00-\\u9fa5]{2,5})*` 可以匹配2到5个汉字,其中可以包含一个·,表示名和姓之间的分隔符。
然后,我们使用 `collections` 模块中的 `Counter` 类来统计每个人物在文本中出现的次数,并使用 `most_common` 方法找出出场次数最多的前5个人物。
接下来,我们使用 `jieba` 分词库将文本分词,并使用 `WordCloud` 类来生成词云图。`WordCloud` 类的 `generate_from_frequencies` 方法可以从词频字典生成词云图,其中字典的键为词语,值为权重。
最后,我们使用 `matplotlib` 库中的 `imshow` 函数显示生成的词云图,并使用 `axis` 函数关闭坐标轴。
阅读全文