用Python写三国演义人名词云。 设计一个程序,读出“三国演义.txt”文件中的三国演义全文,将常见人名进行去重后生成词云,并列出词频最高的10-20个词,并形成词云(可以有不同的形状)。 例:'玄德','刘备','玄德曰','刘皇叔','皇叔'都是同一个人。
时间: 2023-12-03 18:03:33 浏览: 116
好的,我可以帮你完成这个任务。
首先,我们需要读取三国演义的全文,然后对人名识别和去重。我们可以使用jieba分词库和Python的Counter类来实现。
接下来,我们需要将词频最高的人名用Python的wordcloud库生成词云图。这个库可以将每个词转换为一个图片,然后将这些图片拼成一个词云图。
以下是完整的代码实现:
```python
import jieba
from collections import Counter
from wordcloud import WordCloud, ImageColorGenerator
import matplotlib.pyplot as plt
from PIL import Image
# 读取三国演义全文
with open('三国演义.txt', 'r', encoding='utf-8') as f:
text = f.read()
# 使用jieba分词库对全文进行分词
words = jieba.cut(text)
# 人名列表,用于去重
names = []
# 对分词结果进行处理,提取人名
for word in words:
if len(word) == 2 and word[0] != word[1]: # 人名通常为两个字,且两个字不相同
names.append(word)
# 对人名进行去重
names = list(set(names))
# 统计人名出现的次数
name_counts = Counter(names)
# 输出词频最高的10-20个人名
print(name_counts.most_common(20))
# 生成词云图
mask = np.array(Image.open('cloud.png')) # 选择词云图形状
wordcloud = WordCloud(mask=mask, background_color='white', font_path='msyh.ttc', max_words=2000, max_font_size=200, random_state=42)
# 将词频作为词云图的参数
wordcloud.generate_from_frequencies(name_counts)
# 生成词云图并显示
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.show()
# 保存词云图
wordcloud.to_file('result.png')
```
在这个代码中,我们首先使用jieba分词库对三国演义全文进行分词,并提取所有两个字的人名。然后对人名进行去重,统计每个人名出现的次数,并输出词频最高的10-20个人名。
接下来,我们使用Python的wordcloud库生成词云图。我们选择了一个云朵的形状,将词频作为参数,生成了一个词云图,并将其显示在屏幕上。
最后,我们将词云图保存到文件中。
请注意,由于人名可能会有多种不同的写法,例如'玄德','刘备'和'玄德曰'都是同一个人,但是在代码中它们被认为是不同的名字。因此,生成的词云图可能会包含多种不同的写法。