设计一个程序,读出“三国演义.txt”文件中的三国演义全文,将常见人名进行去重后生成词云,并列出词频最高的10-20个词,并形成词云(可以有不同的形状)。 例:'玄德','刘备','玄德曰','刘皇叔','皇叔'都是同一个人。 任务拓展:利用列表或字典来存储同一个人。学会修改wordcloud.WordCloud()的参数,对形成的词云字体和形状等进行改变。
时间: 2023-12-18 18:02:44 浏览: 183
好的,这个问题是一个非常有趣的任务。我们可以使用Python编程语言来完成这个任务。首先我们需要安装一些必要的库,如jieba、wordcloud、numpy等等。安装方法可以使用pip命令,例如:
```
pip install jieba
pip install wordcloud
pip install numpy
```
接下来我们可以编写以下代码来实现读取文件、分词、去重、统计词频及生成词云的功能:
```python
import jieba
import numpy as np
from PIL import Image
from wordcloud import WordCloud
# 读取文件并进行分词
with open('三国演义.txt', 'r', encoding='utf-8') as f:
text = f.read()
words = jieba.lcut(text)
# 去重,将常见人名存储在字典中
names = {}
for word in words:
if len(word) == 2 and word[0] != ' ': # 选取长度为2的词,排除空格
if word in names:
names[word] += 1
else:
names[word] = 1
# 将同一个人名存储在一个列表中
name_lists = []
for name in names:
if name == '玄德曰':
continue # 跳过'玄德曰',因为这个词不是人名
for n in name_lists:
if name in n:
n.append(name)
break
else:
name_lists.append([name])
# 统计词频,将同一个人名的词频相加
name_freqs = []
for names in name_lists:
freq = 0
for name in names:
freq += names[name]
name_freqs.append((names[0], freq))
# 对词频进行排序
name_freqs = sorted(name_freqs, key=lambda x: x[1], reverse=True)
# 输出词频最高的10-20个词
for name, freq in name_freqs[:20]:
print(name, freq)
# 加载背景图像
mask = np.array(Image.open('cloud.png'))
# 生成词云
wc = WordCloud(
font_path='msyh.ttc', # 设置字体
background_color='white', # 设置背景颜色
mask=mask, # 设置背景图像
max_words=500, # 设置最大词数
max_font_size=100, # 设置最大字体大小
contour_width=2, # 设置轮廓线宽度
contour_color='steelblue' # 设置轮廓线颜色
)
# 生成词云图像
wc.generate_from_frequencies(dict(name_freqs))
# 保存词云图像
wc.to_file('wordcloud.png')
```
这段代码会先读取文件并进行分词,然后去重将常见人名存储在字典中,再将同一个人名存储在一个列表中,最后将同一个人名的词频相加得到最终的词频列表。根据词频列表,可以输出词频最高的10-20个词,并生成词云图像。在生成词云时,可以设置字体、背景颜色、背景图像、最大词数、最大字体大小、轮廓线宽度和轮廓线颜色等参数,以生成不同的词云效果。
需要注意的是,在上面的代码中,我们使用了一个名为cloud.png的背景图像来生成词云。你可以将其替换为其他不同的图像,以生成不同形状的词云。
阅读全文