一、实验目的

  1. 理解列表概念并掌握Python中列表的使用。
  2. 理解字典概念并掌握Python中字典的使用。
  3. 运用列表管理采集的信息,构建数据结果。
  4. 运用字典处理复杂的数据信息。
  5. 运用组合数据类型进行文本词频统计。

二、实验内容

《红楼梦》人物统计

[问题描述]

编写程序统计《红楼梦》中前10位出场最多的人物

[基本要求]

  1. 使用jieba库进行中文分词
  2. 采用字典数据结构统计词语出现频率
  3. 采用函数对获取和整理文本进行封装
  4. 完善代码,排除与人名无关的高频词
  5. 附加题,可选做:使用第三方库Wordcloud,构建红楼梦词云。

[测试数据]

《红楼梦》全文文本,遮罩图片(可自选)。

参考代码

import cv2
import jieba
import numpy as np
from PIL import Image
from wordcloud import WordCloud


def get_words(file_name, exclude):
    """
    词频统计
    :param file_name: txt文件
    :param exclude: 排除的词语
    :return: items: 词频list  counts: 词频dict
    """
    txt = open(file_name, "r", encoding='utf-8').read()
    words = jieba.lcut(txt)
    counts = {}
    for word_ in words:
        if len(word_) == 1:
            continue
        counts[word_] = counts.get(word_, 0) + 1
    for word_ in exclude:
        del (counts[word_])
    items = list(counts.items())
    items.sort(key=lambda x: x[1], reverse=True)
    return items, counts


def binary(file_path):
    """
    图片二值化
    :param file_path: 图片路径
    """
    img = cv2.imread(file_path)
    GrayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 中值滤波
    retval, dst = cv2.threshold(GrayImage, 127, 255, cv2.THRESH_BINARY)
    cv2.imwrite('binary.jpg', dst)


def get_word_cloud(mask_file_path, frequencies):
    """
    生成词云
    :param mask_file_path: 遮罩图片
    :param frequencies: 词频dict
    """
    pic_mask = np.array(Image.open(mask_file_path))
    wc = WordCloud(
        font_path='STXINGKA.TTF',
    background_color='white',
        repeat=True,
        margin=1,
        min_font_size=1,
        max_words=1000,
        mask=pic_mask,
        color_func=lambda *args, **kwargs: (255, 0, 0),
        scale=5
    )
    wc.generate_from_frequencies(frequencies)
    wc.to_file('红楼梦_词云.png')


if __name__ == '__main__':
    excludes = {"什么", "一个", "我们", "那里", "如今", "你们", "说道", "知道", "起来", "这里", "姑娘", "出来", "他们", "众人"}
    counts_list, counts_dict = get_words('红楼梦.txt', excludes)
    binary('hlm.png')
    get_word_cloud('binary.jpg', counts_dict)
    for i in range(6):
        word, count = counts_list[i]
        print("{0:<10}{1:>5}".format(word, count))

运行结果

宝玉         3674
贾母         1187
凤姐         1023
王夫人        1002
老太太         950
奶奶          836

图片

原图

二值化图片

词云效果

最后修改:2022 年 04 月 13 日
愿君多打钱,此物最相思