第三十六节课:Python文本词频统计实例详解

Python文本词频统计实例详解

目录

  • 问题分析
  • 英文词频统计(哈姆雷特)
  • 中文词频统计(三国演义)
  • 举一反三
  • 小结

一、问题分析

核心需求

  1. 英文文本:统计单词出现频率
  2. 中文文本:统计人物出场次数
  3. 数据清洗:处理标点、大小写、停用词
  4. 结果展示:输出最高频词TopN

技术难点

  • 英文:大小写统一、标点处理
  • 中文:准确分词、人名归一化
  • 通用:高效统计与排序

二、英文词频统计(哈姆雷特)

实现步骤

  1. 文本规范化处理
  2. 单词分割与统计
  3. 结果排序输出

核心代码

def get_text():
    # 读取文件并规范化处理
    with open("hamlet.txt", "r") as f:
        text = f.read().lower()
    
    # 替换标点为空格
    for ch in '!"#$%&()*+,-./:;<=>?@[\\]^_`{|}~':
        text = text.replace(ch, " ")
    return text

hamletTxt = get_text()
words = hamletTxt.split()

# 词频统计
counts = {}
for word in words:
    counts[word] = counts.get(word, 0) + 1

# 排序输出
items = list(counts.items())
items.sort(key=lambda x: x[1], reverse=True)
for i in range(10):
    word, count = items[i]
    print(f"{word:<10}{count}")

输出示例

the        1138
and         965
to          754
of          669
you         550
a           542
my          514
hamlet      471
in          451
it          419

完整代码

def getText():
    txt = open('hamlet.txt','r').read()
    txt = txt.lower() #将文本中所有字母转换成小写
    for ch in '!"#$%&()*+,-./:;<=>?@[\\]^_{|}~': 
        txt = txt.replace(ch,"") #及去掉各种特殊符号,用空格替代
    return txt #处理完函数,形成规范结果

hamletTxt = getText()
words = hamletTxt.split()
counts = {}
for word in words:
    counts[word] = counts.get(word,0) + 1
items = list(counts.items())
items.sort(key=lambda x:x[1],reverse=True)
for i in range(10):
    word,count = items[i]
    print('{0:<10}{1:>5}'.format(word,count))

输出示例

the        1137
and         963
to          736
of          669
you         546
i           540
a           527
my          513
hamlet      459
in          435
>>> 

三、中文词频统计(三国演义)

实现步骤

  1. 使用结巴分词
  2. 建立人物同名词典
  3. 设置排除词库
  4. 统计与结果优化

核心代码

import jieba

# 读取文件
with open("threekingdoms.txt", "r", encoding="utf-8") as f:
    text = f.read()

# 中文分词
words = jieba.lcut(text)

# 人物同名词典
name_dict = {
    "孔明曰": "孔明", 
    "关公": "关羽",
    "玄德曰": "刘备"
}

# 排除词库
excludes = {"将军", "却说", "二人", "不可", "荆州"}

# 词频统计
counts = {}
for word in words:
    if len(word) == 1:  # 过滤单字
        continue
    # 名称归一化
    word = name_dict.get(word, word)
    counts[word] = counts.get(word, 0) + 1

# 过滤排除词
for word in excludes:
    del counts[word]

# 排序输出
items = list(counts.items())
items.sort(key=lambda x: x[1], reverse=True)
for i in range(15):
    word, count = items[i]
    print(f"{word:<5}{count}")

优化后输出

曹操    1451
孔明    1387
刘备    1252
关羽    784 
张飞    358 
吕布    300 
孙权    295 
赵云    278 
司马懿   266 
周瑜     265 
袁绍     223 
马超     198 
魏延     181 
黄忠     168 
诸葛亮   159

举一反三

扩展应用场景

  1. 其他名著分析:红楼梦人物关系分析
  2. 舆情分析:新闻热点词提取
  3. 学术研究:论文关键词统计
  4. 社交网络:微博话题词频统计

技术扩展方向

方向 推荐工具
词云可视化 wordcloud库
情感分析 SnowNLP
文本摘要 jieba.analyse
大规模文本处理 多线程/分布式计算

小结

关键技术点

  1. 数据清洗:使用字符串替换处理标点
  2. 高效统计:字典存储词频信息
  3. 结果排序sorted()配合lambda表达式
  4. 中文处理:结巴分词+名称归一化

最佳实践建议

  1. 渐进式开发:先完成基础统计,再逐步添加过滤规则
  2. 交互式调试:使用Jupyter Notebook实时查看中间结果
  3. 版本管理:不同优化阶段的代码保存为不同版本
  4. 性能优化:对于超长文本使用生成器替代列表

学习资源推荐:官方文档(jieba、wordcloud) + 真实文本数据集(Gutenberg项目)

你可能感兴趣的:(python,python,c#,windows)