【python】实现文档中的多频词统计

案例:三国小说主要人物出场频率统计

首先导入必要的模块:

import jieba
from collections import Counter
from wordcloud import WordCloud

注释:导入模块之前,需要先下载 jieba模块WordCloud模块

pip install jieba
pip install WordCloud

先举个栗子:

import jieba
# 使用 jieba 分词
txt = '我来到北京清华大学'
seg_list = jieba.lcut(txt)
print(seg_list)

这个代码块主要使用了 jieba库 来实现对字符串的分割

输出:

Building prefix dict from the default dictionary ...
Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\ADMINI~1\AppData\Local\Temp\jieba.cache
Loading model cost 0.810 seconds.
Prefix dict has been built succesfully.
['我', '来到', '北京', '清华大学']

Process finished with exit code 0
那么,说完了上面的基本操作,现在进入正题。
  • 第一步:导入电子版文档,存储在sanguo.txt中(当然,也可以使用迭代对象来分次导入,好处是节约内存)
      with open('sanguo.txt','r', encoding='utf-8') as f:
        # 打开文件路径
        txt = f.read() # 这里直接导入
  • 第二步:将字符串分割成等量的中文
words = jieba.lcut(txt)
    print(words)
    # ‘人物名字’:出现次数

输出:

', '汉中', ';', '达', '与', '李严', '曾结', '生死之交', ';', '臣', '回', '成都', '时留', '李', '严守', '永安', '宫', ';', '臣', '已作', '一书', '、', '只', '做', '李严', '亲笔', '令人', '送与', '孟达',, ';', '达', '必然', '推病', '不出', '以慢', '军心', ':', '此', '一路', '又', '不足', '忧', '矣', '。', '又', '知', '曹真', '引兵', '犯', '阳平关', ';', '此地', '险峻',  # 这里只是一部分
  • 第三步:一个小说中,按照常理,主角的名字不会是一个字,所以要筛选出大于1的字符串
counts = {}   #创建空字典
    for word in words:   # 遍历字典
        if len(word) == 1:
            continue
        else:
            # 往字典里添加元素
            #counts['key'] = 888
            counts[word] = counts.get(word, 0) + 1
            # counts['曹操'] = counts.get('曹操', 0) + 1
    print(counts)

输出:

{'正文': 1, '第一回': 1, '桃园': 19, '豪杰': 22, '结义': 14, '黄巾': 40, '英雄': 82, '立功': 22, '滚滚': 5, '长江': 25, '逝水': 1, '浪花': 1, '淘尽': 1, '是非成败': 1, '转头': 2, '青山': 1, '依旧': 11, '几度': 1, '夕阳红': 1, '渔樵': 1, '江渚': 2, '上惯': 1, '秋月春风': 1, }   # 这里只是一部分
  • 第四步:删除 无关词。例如:将军", "却说", "丞相", "二人", "不可", "荆州", "不能", "如此", "商议", "如何", "主公", "军士", "军马", "左右", "次日", "引兵", "大喜", "天下","东吴", "于是", "今日", "不敢", "魏兵", "陛下", "都督", "人马", "不知",...等。

在一篇文章中,除一个字符之外的其他多字符若不是人物名字,需要删除

# 定义无关词集合
    excludes = {"将军", "却说", "丞相", "二人", "不可", "荆州", "不能", "如此", "商议",
                "如何", "主公", "军士", "军马", "左右", "次日", "引兵", "大喜", "天下",
                "东吴", "于是", "今日", "不敢", "魏兵", "陛下", "都督", "人马", "不知",
                '玄德曰', '孔明曰', '刘备', '关公', '孔明曰', '玄德曰', '先主', '此人',
                '上马', '大叫', '后主', '众将', '只见', '一人', '汉中', '太守', '天子',}
    for word in excludes:
        del counts[word]
  • 第五步:将一些字符串整合在一起,比如‘孔明’和‘孔明曰’,‘玄德’和‘玄德曰’等等
    counts['孔明'] = counts.get('孔明') + counts.get('孔明曰')
    counts['玄德'] = counts.get('玄德') + counts.get('玄德曰')
    counts['玄德'] = counts.get('玄德') + counts.get('刘备')
    counts['云长'] = counts.get('关公') + counts.get('云长')
  • 第六步:统计出现频率最高的前10个词
    items = list(counts.items())
    items.sort(key=lambda x: x[1], reverse=True)  # 使用了隐函数
    # print('排序后:', items)
    for i in range(10):
        character, count = items[i]
        print(character, count)

输出:

孔明 1204
玄德 1159
曹操 910
张飞 340
孙权 259
吕布 258
赵云 254
云长 241
司马懿 221
周瑜 216

拓展 : 统计出现频率最高的前10个词--方法2

    roles = Counter(counts)
    role = roles.most_common(10)
    print(role)

输出:

[('孔明', 1204), ('玄德', 1159), ('曹操', 910), ('张飞', 340), ('孙权', 259), ('吕布', 258), ('赵云', 254), ('云长', 241), ('司马懿', 221), ('周瑜', 216)]
  • 第七步:构造词云字符串
    li =[]
    for i in range(10):
        character, count = items[i]
        for _ in range(count):
            li.append(character)
    # print(li)
    cloud_txt = " ".join(li)
    wc = WordCloud(
        background_color='white',
        font_path='msyh.ttc',
        collocations=False  # 是否包含两个词的搭配,默认为Ture
    ).generate(cloud_txt)
    wc.to_file('三国中出现的前十大人物.png')

生成图片如下:


三国中出现的前十大人物.png

完整代码如下:

# 案例:三国小说人物出场词频率统计
import jieba
from collections import Counter
from wordcloud import WordCloud

def parse():
    # 定义无关词集合
    excludes = {"将军", "却说", "丞相", "二人", "不可", "荆州", "不能", "如此", "商议",
                "如何", "主公", "军士", "军马", "左右", "次日", "引兵", "大喜", "天下",
                "东吴", "于是", "今日", "不敢", "魏兵", "陛下", "都督", "人马", "不知",
                '玄德曰', '孔明曰', '刘备', '关公', '孔明曰', '玄德曰', '先主', '此人',
                '上马', '大叫', '后主', '众将', '只见', '一人', '汉中', '太守', '天子',}
    """三国小说人物出场词频率统计"""
    with open('sanguo.txt','r', encoding='utf-8') as f:
        # 打开文件路径
        txt = f.read()
    # print(txt)
    # 将字符串分割成等量的中文
    words = jieba.lcut(txt)
    print(words)
    # ‘人物名字’:出现次数
    counts = {}   #创建空字典
    for word in words:   # 遍历字典
        if len(word) == 1:
            continue
        else:
            # 往字典里添加元素
            #counts['key'] = 888
            counts[word] = counts.get(word, 0) + 1
            # counts['曹操'] = counts.get('曹操', 0) + 1
    print(counts)

    counts['孔明'] = counts.get('孔明') + counts.get('孔明曰')
    counts['玄德'] = counts.get('玄德') + counts.get('玄德曰')
    counts['玄德'] = counts.get('玄德') + counts.get('刘备')
    counts['关公'] = counts.get('关公') + counts.get('云长')

    # 删除 无关词
    for word in excludes:
        del counts[word]
    # 统计出现频率最高的前20个词
    items = list(counts.items())
    items.sort(key=lambda x: x[1], reverse=True)  # 使用了隐函数
    # print('排序后:', items)
    for i in range(10):
        character, count = items[i]
        print(character, count)

    # 统计出现频率最高的前20个词--方法2(拓展)
    roles = Counter(counts)
    role = roles.most_common(10)
    print(role)

#     构造词云字符串
    li =[]
    for i in range(10):
        character, count = items[i]
        for _ in range(count):
            li.append(character)
    # print(li)
    cloud_txt = " ".join(li)
    wc = WordCloud(
        background_color='white',
        font_path='msyh.ttc',
        collocations=False  # 是否包含两个词的搭配,默认为Ture
    ).generate(cloud_txt)
    wc.to_file('三国中出现的前十大人物.png')
parse()
孔明 1204
玄德 1159
曹操 910
张飞 340
孙权 259
吕布 258
赵云 254
云长 241
司马懿 221
周瑜 216
[('孔明', 1204), ('玄德', 1159), ('曹操', 910), ('张飞', 340), ('孙权', 259), ('吕布', 258), ('赵云', 254), ('云长', 241), ('司马懿', 221), ('周瑜', 216)]

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容