三国演义人名词云: 设计一个程序,读出“三国演义.txt”文件中的三国演义全文,将常见人名进行去重后生成词云,并列出词频最高的10-20个词,并形成词云(可以有不同的形状)。 例:'玄德','刘备','玄德曰','刘皇叔','皇叔'都是同一个人。 任务拓展:利用列表或字典来存储同一个人。学会修改wordcloud.WordCloud()的参数,对形成的词云字体和形状等进行改变。
时间: 2023-12-11 17:04:50 浏览: 76
好的,这是一个比较有趣的任务!首先,我们需要读入《三国演义》的全文,然后对其中的人名进行识别和去重,最后生成词云。这个任务可以分为以下几个步骤:
1. 读入《三国演义》的全文
我们可以使用Python内置的open()函数来读取文本文件。首先,我们需要将《三国演义》的文本文件保存在当前工作目录下,然后用以下代码读取它:
```python
with open('三国演义.txt', 'r', encoding='utf-8') as f:
text = f.read()
```
这里我们使用了`with`语句来打开文件,这样可以保证文件在使用完后自动关闭,避免出现资源泄漏的情况。同时,我们指定了文件的编码格式为`utf-8`,这是因为中文文本文件通常采用这种编码格式。
2. 识别人名并去重
接下来,我们需要对读入的文本进行处理,识别其中的人名并进行去重。这里我们可以使用Python的正则表达式模块`re`来进行匹配。具体来说,我们可以使用如下的代码来识别人名:
```python
import re
# 定义一个正则表达式,用于匹配人名
pattern = re.compile(r'(?:[\u4e00-\u9fa5]{2,3}(?:曰|称|乃|者|也|之|与|和|及)\s)?[\u4e00-\u9fa5]{2,3}(?:\·[\u4e00-\u9fa5]{2,3})*')
# 使用正则表达式匹配人名
names = pattern.findall(text)
```
这里我们使用了一个正则表达式来匹配人名,正则表达式的具体含义是:匹配2到3个汉字,并且后面可能跟着“曰”、“称”、“乃”、“者”、“也”、“之”、“与”、“和”、“及”等字,或者不跟任何字;然后可能跟着一个“·”和2到3个汉字,重复0次或多次。这样,我们就可以将文本中的人名全部匹配出来,并保存在一个列表中。
接下来,我们需要对这个列表进行去重,将不同的称呼和代称都归为同一个人。为此,我们可以使用Python的字典来进行处理。具体来说,我们可以使用如下的代码来进行去重:
```python
# 定义一个空字典,用于存储人名及其出现次数
name_dict = {}
# 对人名进行去重,将不同的称呼和代称都归为同一个人
for name in names:
if name in name_dict:
name_dict[name] += 1
else:
for key in name_dict:
if name in key:
name_dict[key] += 1
break
else:
name_dict[name] = 1
# 按照出现次数从大到小对人名进行排序
sorted_names = sorted(name_dict.items(), key=lambda x: x[1], reverse=True)
```
这里我们定义了一个空字典`name_dict`来存储人名及其出现次数,然后对人名进行遍历,将不同的称呼和代称都归为同一个人,并统计其出现次数。最后,我们按照出现次数从大到小对人名进行排序,并保存在一个列表中。
3. 输出词频最高的人名
为了输出词频最高的人名,我们可以使用如下的代码:
```python
# 输出词频最高的10-20个人名
for i in range(10, min(20, len(sorted_names))):
print(sorted_names[i][0], sorted_names[i][1])
```
这里我们使用了一个for循环来遍历排名在10到20位之间的人名,并输出它们的名称和出现次数。
4. 生成词云
最后,我们可以使用Python的词云库`wordcloud`来生成词云。具体来说,我们可以使用如下的代码来生成词云:
```python
import wordcloud
import jieba
# 将人名列表转换为一个字符串
name_string = ' '.join([name[0] for name in sorted_names])
# 使用jieba库对字符串进行分词
seg_list = jieba.cut(name_string)
# 将分词结果转换为一个列表
word_list = [word for word in seg_list if len(word) > 1]
# 将列表转换为一个字符串
word_string = ' '.join(word_list)
# 创建一个WordCloud对象
wc = wordcloud.WordCloud(
font_path='msyh.ttc', # 字体文件路径
background_color='white', # 背景颜色
width=800, height=600, # 图片宽度和高度
max_words=200, # 最多显示的词数
mask=mask, # 词云形状
contour_width=1, contour_color='steelblue' # 边框宽度和颜色
)
# 生成词云
wc.generate(word_string)
# 保存词云图片
wc.to_file('wordcloud.png')
```
这里我们首先将人名列表转换为一个字符串,并使用jieba库对字符串进行分词,得到一个词语列表。然后,我们将词语列表转换为一个字符串,并创建一个`WordCloud`对象,设置一些参数,如字体、背景颜色、图片大小、最多显示的词数、词云形状等。最后,我们调用`generate()`方法生成词云,并使用`to_file()`方法保存词云图片。
这样,我们就完成了对《三国演义》人名的识别、去重、词频统计和词云生成。如果需要改变词云的字体和形状,可以修改`WordCloud`对象的参数。
阅读全文