news 2026/6/26 18:15:30

【自然语言处理】单字与双字字频统计算法设计

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【自然语言处理】单字与双字字频统计算法设计

目录

一、题目描述

二、算法设计思路

核心目标

算法流程

三、完整开发流程

(一)整体架构与核心流程

(二)模块 1:全局环境配置(解决中文显示核心痛点)

(三)模块 2:文本预处理函数(preprocess_text)

(四)模块 3:单字 + 双字字频统计函数(count_char_freq)

子功能 1:单字字频统计

子功能 2:双字字频统计(滑动窗口法)

输出:

(五)模块 4:多维度可视化函数(visualize_freq,核心功能模块)

可视化优化功能:

(六)模块 5:主函数(__main__)

子功能 1:示例文本定义

子功能 2:流程执行与控制台输出

(七)额外核心特性

(八)输入输出总结

典型应用场景

四、单字与双字字频统计算法设计的Python代码完整实现

五、程序运行结果展示

六、总结


一、题目描述

设计一个算法,同时实现单字和双字字频统计。

二、算法设计思路

核心目标

同时完成单字字频双字字频统计,核心逻辑分为【文本预处理→单字统计→双字统计→结果可视化】四步,确保统计结果仅针对汉字,排除标点、数字、字母等干扰。

算法流程

  1. 文本预处理:通过正则表达式提取纯汉字,过滤所有非汉字字符(如标点、数字、西文、空格等),得到仅含连续汉字的文本序列。
  2. 单字字频统计:遍历预处理后的汉字序列,用计数器记录每个汉字的出现次数。
  3. 双字字频统计:遍历预处理后的汉字序列,滑动截取连续两个汉字组成「双字对」,用计数器记录每个双字对的出现次数(如 “中国”“发展”)。
  4. 结果可视化:通过条形图、直方图、词云、热力图、网络图等多维度图表展示统计结果,直观呈现汉字及双字对的分布规律。

三、完整开发流程

这是一套面向中小规模中文文本的单字 / 双字字频统计与多维度静态可视化工具,核心目标是从原始中文文本中提取纯汉字、统计单字 / 双字出现频次,并通过 6 类差异化图表直观展示字频特征,最终输出高清可视化图片与控制台统计结果。以下是其所有功能的详细拆解:

(一)整体架构与核心流程

按照 “环境配置 → 文本预处理 → 字频统计 → 多维度可视化 → 主函数执行” 的逻辑分层设计,核心流程为:原始中文文本→ 提取纯汉字 → 统计单字 / 双字字频 → 多维度静态可视化 → 输出统计结果 + 高清图片

(二)模块 1:全局环境配置(解决中文显示核心痛点)

该模块为全流程中文兼容提供基础保障,所有配置均围绕 “消除中文乱码、统一绘图风格” 设计:

配置项功能说明
plt.rcParams['font.sans-serif'] = ['SimHei']指定 Matplotlib 使用 “黑体” 显示中文,解决图表中中文标签 / 标题乱码问题
plt.rcParams['axes.unicode_minus'] = False修复负号(-)在中文环境下显示为方块的问题
plt.rcParams['font.family'] = 'sans-serif'统一字体族为无衬线字体,适配中文显示逻辑
sns.set_style("whitegrid")设置 Seaborn 绘图风格为 “白色网格”,提升图表可读性
sns.set(font='SimHei')强制 Seaborn 库使用黑体,避免子图中文仍乱码

(三)模块 2:文本预处理函数(preprocess_text

核心功能:过滤原始文本中的非汉字字符(如标点、数字、英文、换行符等),仅保留纯汉字并拼接为连续字符串,为后续字频统计扫清噪音。

  • 输入:任意中文文本字符串(可含标点、换行、数字等冗余字符);
  • 输出:仅由连续汉字组成的字符串;
  • 实现逻辑:
    1. 用正则表达式r'[\u4e00-\u9fa5]+'匹配所有汉字字符(覆盖 Unicode 所有中文汉字区间);
    2. 将匹配到的汉字片段拼接为无间隔的纯汉字字符串;
  • 示例效果:输入含标点的文本"人工智能,是科技革命的驱动力!",输出"人工智能是科技革命的驱动力"

(四)模块 3:单字 + 双字字频统计函数(count_char_freq

核心功能:基于预处理后的纯汉字文本,同时完成单字、双字的频次统计,返回可直接用于可视化的频次计数器。

子功能 1:单字字频统计
  • 逻辑:直接将纯汉字字符串传入collections.Counter,自动统计每个汉字的出现次数;
  • 示例:输入"人工智能人工智能",输出Counter({'人':2, '工':2, '智':2, '能':2})
子功能 2:双字字频统计(滑动窗口法)
  • 核心逻辑:以 “连续两个汉字” 为单位,通过滑动窗口截取所有双字对并统计频次;
  • 边界处理:先判断文本长度≥2,避免索引越界(长度 < 2 时返回空 Counter);
  • 示例:输入"人工智能",截取"人工"+"工智"+"智能",输出Counter({'人工':1, '工智':1, '智能':1})
输出:

返回两个Counter对象:

  • single_counter:单字字频计数器(键 = 汉字,值 = 出现次数);
  • pair_counter:双字字频计数器(键 = 双字对,值 = 出现次数)。

(五)模块 4:多维度可视化函数(visualize_freq,核心功能模块)

该函数是代码的核心,基于统计得到的计数器,生成2 行 3 列共 6 个子图,从 “排行、分布、关联、视觉化” 多维度展示字频特征,支持自定义top_n(展示前 N 个高频字 / 双字对)。

子图序号子图类型功能说明实现细节与展示效果
1TopN 单字字频条形图展示出现次数最多的前 N 个单字,直观呈现核心高频汉字- 提取single_counter的 TopN 数据;- 用 Seaborn 条形图绘制,横轴为汉字、纵轴为次数;- 横轴文字旋转 45° 避免重叠,使用Blues_r蓝色系调色板;- 标注标题、轴标签,字体大小 / 粗细优化。
2单字字频分布直方图展示所有单字的频次分布特征(而非仅 TopN),分析字频的集中趋势- 提取所有单字的频次值,用 20 个区间(bins)绘制直方图;- 绿色填充 + 0.7 透明度,标注 “出现次数区间”“汉字数量” 轴标签;- 可直观看到:大部分汉字出现次数少,少数核心字出现次数高。
3单字频度词云以视觉化方式展示高频字(字号越大 = 频次越高),增强结果可读性- 将single_counter转为字典,传入WordCloud生成词云;- 指定simhei.ttf字体解决中文词云乱码;- 白色背景 +viridis彩色配色,最多展示 100 个高频字;- 关闭坐标轴,仅保留标题。
4TopN 双字字频条形图展示出现次数最多的前 N 个双字对,分析文本中的核心词汇搭配- 逻辑同单字条形图,改用Reds_r红色系调色板区分;- 横轴为双字对(如 “人工”“智能”),旋转 45° 避免重叠;- 直观呈现文本中最常用的连续两字组合。
5双字对热力图(Top10)分析 Top10 双字对的 “前字 - 后字” 关联关系,挖掘字符组合规律- 拆分 Top10 双字对为 “前字”(如 “人工” 的 “人”)和 “后字”(如 “人工” 的 “工”);- 构建透视表(行 = 前字,列 = 后字,值 = 出现次数),空值填充为 0;- 用YlGnBu蓝黄配色绘制热力图,标注具体次数;- 可直观看到哪些前字常搭配哪些后字(如 “人工” 后常接 “智能”)。
6双字对关联网络图以图形化方式展示字符间的关联关系,边粗细对应双字对频次- 用networkx构建无向图:✅ 节点 = 汉字(如 “人”“工”“智”);✅ 边 = 双字对关联(如 “人” 和 “工” 之间有边);✅ 边权重 = 双字对频次 / 5(缩小权重避免边过粗);- 固定随机种子(seed=42)保证布局一致;- 节点为天蓝色、边为灰色(0.6 透明度),标注节点汉字;- 关闭坐标轴,仅保留标题,直观展示字符关联强度。
可视化优化功能:
  • 子图布局:2 行 3 列适配 6 类图表,避免拥挤;
  • 间距调整:plt.tight_layout()自动调整子图间距,suptitle添加全局标题;
  • 高清保存:savefig设置dpi=300(高清)+bbox_inches='tight'(避免标题 / 标签截断),生成char_freq_visualization.png文件;
  • 交互展示:调用plt.show()弹出可视化窗口,支持放大、查看细节。

(六)模块 5:主函数(__main__

核心功能:串联全流程,执行示例文本的统计与可视化,并输出关键结果到控制台。

子功能 1:示例文本定义

提供人工智能主题的示例文本,可替换为任意中文文本(如小说、新闻、论文等)。

子功能 2:流程执行与控制台输出
  1. 调用preprocess_text预处理文本,打印:
    • 预处理后纯汉字文本的总长度;
    • 预处理后文本的前 50 字片段(验证预处理效果);
  2. 调用count_char_freq统计字频;
  3. 打印 Top10 单字字频、Top10 双字字频(便于快速查看核心结果);
  4. 调用visualize_freq生成可视化图表(默认展示 Top15 高频字 / 双字对)。

(七)额外核心特性

  1. 参数可定制visualize_freqtop_n参数可自由调整(默认 20),比如改为top_n=10则展示前 10 个高频字 / 双字对;
  2. 兼容性强:全流程适配中文,无乱码、无格式错误;
  3. 轻量高效:基于 Python 内置库 + 常用数据分析库,无需复杂依赖,适合中小文本(10MB 以内)快速分析;
  4. 结果复用:生成的高清 PNG 图片可直接用于报告、论文、PPT 等场景;
  5. 鲁棒性:双字统计添加长度判断,避免空文本 / 短文本导致的索引错误。

(八)输入输出总结

输入任意中文文本字符串(可含标点、换行、数字等冗余字符)
输出1. 控制台:预处理信息、Top10 单 / 双字字频;2. 文件:char_freq_visualization.png(300DPI 高清图片);3. 窗口:弹出可视化图表窗口。

典型应用场景

  • 中文文本的核心词汇分析(如提取某篇文章的高频字 / 核心搭配);
  • 学生 / 研究者的文本数据分析作业、论文辅助;
  • 中文内容的简单舆情分析(如统计热点事件文本的高频字);
  • 教学场景:演示中文文本处理、字频统计、数据可视化的全流程。

四、单字与双字字频统计算法设计的Python代码完整实现

# 导入所需库 import re import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from collections import Counter from wordcloud import WordCloud import networkx as nx # -------------------------- 全局配置(解决中文显示问题) -------------------------- plt.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文 plt.rcParams['axes.unicode_minus'] = False # 显示负号 plt.rcParams['font.family'] = 'sans-serif' # 统一字体族 sns.set_style("whitegrid") # 设置绘图风格 sns.set(font='SimHei') # -------------------------- 步骤1:文本预处理函数 -------------------------- def preprocess_text(text): """ 文本预处理:提取纯汉字,过滤所有非汉字字符 :param text: 原始文本字符串 :return: 仅含连续汉字的字符串 """ # 正则匹配所有汉字(Unicode编码范围:\u4e00-\u9fa5) chinese_pattern = re.compile(r'[\u4e00-\u9fa5]+') chinese_chars = chinese_pattern.findall(text) # 拼接成连续的汉字字符串 clean_text = ''.join(chinese_chars) return clean_text # -------------------------- 步骤2:单字+双字字频统计函数 -------------------------- def count_char_freq(clean_text): """ 同时统计单字和双字字频 :param clean_text: 预处理后的纯汉字字符串 :return: single_counter: 单字字频Counter对象 pair_counter: 双字字频Counter对象 """ # 单字字频统计 single_counter = Counter(clean_text) # 双字字频统计(滑动窗口截取连续两个字) pair_list = [] if len(clean_text) >= 2: # 文本长度至少为2才会有双字对 for i in range(len(clean_text) - 1): pair = clean_text[i] + clean_text[i + 1] pair_list.append(pair) pair_counter = Counter(pair_list) return single_counter, pair_counter # -------------------------- 步骤3:多维度可视化函数 -------------------------- def visualize_freq(single_counter, pair_counter, top_n=20): """ 多维度可视化单字/双字字频结果 :param single_counter: 单字字频Counter :param pair_counter: 双字字频Counter :param top_n: 展示TopN的高频字/双字对 """ # ========== 子图1:TopN单字字频条形图 ========== plt.figure(figsize=(12, 6)) single_top = single_counter.most_common(top_n) single_chars = [item[0] for item in single_top] single_counts = [item[1] for item in single_top] ax1 = plt.subplot(2, 3, 1) sns.barplot(x=single_chars, y=single_counts, palette="Blues_r", ax=ax1) ax1.set_title(f'Top{top_n}单字字频统计', fontsize=12, fontweight='bold') ax1.set_xlabel('汉字', fontsize=10) ax1.set_ylabel('出现次数', fontsize=10) ax1.tick_params(axis='x', rotation=45) # 横轴文字旋转45度 # ========== 子图2:单字字频分布直方图 ========== ax2 = plt.subplot(2, 3, 2) single_all_counts = list(single_counter.values()) sns.histplot(single_all_counts, bins=20, color='green', alpha=0.7, ax=ax2) ax2.set_title('单字字频分布直方图', fontsize=12, fontweight='bold') ax2.set_xlabel('出现次数区间', fontsize=10) ax2.set_ylabel('汉字数量', fontsize=10) # ========== 子图3:单字频度词云 ========== ax3 = plt.subplot(2, 3, 3) # 生成词云(需要将Counter转为字典) single_dict = dict(single_counter) wordcloud = WordCloud( font_path='simhei.ttf', # 本地字体文件(确保存在) width=800, height=400, background_color='white', max_words=100, colormap='viridis' ).generate_from_frequencies(single_dict) ax3.imshow(wordcloud, interpolation='bilinear') ax3.axis('off') # 关闭坐标轴 ax3.set_title('单字频度词云', fontsize=12, fontweight='bold') # ========== 子图4:TopN双字字频条形图 ========== ax4 = plt.subplot(2, 3, 4) pair_top = pair_counter.most_common(top_n) pair_chars = [item[0] for item in pair_top] pair_counts = [item[1] for item in pair_top] sns.barplot(x=pair_chars, y=pair_counts, palette="Reds_r", ax=ax4) ax4.set_title(f'Top{top_n}双字字频统计', fontsize=12, fontweight='bold') ax4.set_xlabel('双字对', fontsize=10) ax4.set_ylabel('出现次数', fontsize=10) ax4.tick_params(axis='x', rotation=45) # ========== 子图5:双字对热力图(Top10双字对的前字-后字关联) ========== ax5 = plt.subplot(2, 3, 5) # 提取Top10双字对的前字和后字,构建关联矩阵 pair_top10 = pair_counter.most_common(10) front_chars = [pair[0][0] for pair in pair_top10] back_chars = [pair[0][1] for pair in pair_top10] pair_values = [pair[1] for pair in pair_top10] # 构建透视表(前字为行,后字为列,值为出现次数) pair_df = pd.DataFrame({ '前字': front_chars, '后字': back_chars, '次数': pair_values }) pivot_df = pair_df.pivot(index='前字', columns='后字', values='次数').fillna(0) sns.heatmap(pivot_df, annot=True, cmap="YlGnBu", fmt='.0f', ax=ax5) ax5.set_title('Top10双字对前字-后字热力图', fontsize=12, fontweight='bold') ax5.set_xlabel('后字', fontsize=10) ax5.set_ylabel('前字', fontsize=10) # ========== 子图6:双字对关联网络图 ========== ax6 = plt.subplot(2, 3, 6) # 构建网络图(节点:汉字,边:双字对关联,边权重:出现次数) G = nx.Graph() # 添加节点和边 for pair, count in pair_top: G.add_edge(pair[0], pair[1], weight=count / 5) # 权重缩小5倍,避免边过粗 # 布局设置 pos = nx.spring_layout(G, seed=42) # 固定随机种子,保证布局一致 # 绘制节点 nx.draw_networkx_nodes(G, pos, node_size=800, node_color='skyblue', alpha=0.8, ax=ax6) # 绘制边(按权重设置宽度) edges = G.edges() weights = [G[u][v]['weight'] for u, v in edges] nx.draw_networkx_edges(G, pos, width=weights, edge_color='gray', alpha=0.6, ax=ax6) # 绘制节点标签 nx.draw_networkx_labels(G, pos, font_size=10, font_family='SimHei', ax=ax6) ax6.set_title('双字对关联网络图', fontsize=12, fontweight='bold') ax6.axis('off') # 关闭坐标轴 # 调整子图间距,显示总标题 plt.tight_layout() plt.suptitle('单字+双字字频统计可视化分析', fontsize=16, fontweight='bold', y=1.02) plt.savefig('char_freq_visualization.png', dpi=300, bbox_inches='tight') # 保存图片(高清) plt.show() # -------------------------- 主函数:执行统计+可视化 -------------------------- if __name__ == '__main__': # 示例文本(可替换为任意中文文本,如小说、新闻等) sample_text = """ 人工智能是引领新一轮科技革命和产业变革的重要驱动力,加快发展新一代人工智能是事关我国能否抓住新一轮科技革命和产业变革机遇的战略问题。 中国高度重视人工智能发展,先后出台一系列政策举措,推动人工智能领域的研发和应用。从语音识别到图像分类,从智能推荐到自动驾驶,人工智能技术已经深度融入人们的生产生活,带来了前所未有的便利。 发展人工智能,既要重视技术创新,也要关注伦理规范,确保人工智能朝着有利于人类的方向发展。中国愿与世界各国携手合作,共同推动人工智能的健康发展,让人工智能更好地服务于人类社会的进步。 """ # 步骤1:预处理文本 clean_text = preprocess_text(sample_text) print(f"预处理后纯汉字文本长度:{len(clean_text)} 字") print(f"预处理后文本片段:{clean_text[:50]}...") # 步骤2:统计单字+双字字频 single_counter, pair_counter = count_char_freq(clean_text) # 输出统计结果(示例) print("\n=== Top10单字字频 ===") for char, count in single_counter.most_common(10): print(f"{char}: {count}次") print("\n=== Top10双字字频 ===") for pair, count in pair_counter.most_common(10): print(f"{pair}: {count}次") # 步骤3:多维度可视化 visualize_freq(single_counter, pair_counter, top_n=15)

五、程序运行结果展示

预处理后纯汉字文本长度:233 字
预处理后文本片段:人工智能是引领新一轮科技革命和产业变革的重要驱动力加快发展新一代人工智能是事关我国能否抓住新一轮科技...

=== Top10单字字频 ===
人: 12次
能: 11次
智: 10次
工: 9次
的: 8次
发: 6次
展: 5次
新: 4次
一: 4次
技: 4次

=== Top10双字字频 ===
智能: 10次
人工: 9次
工智: 9次
发展: 5次
新一: 3次
能是: 2次
一轮: 2次
轮科: 2次
科技: 2次
技革: 2次

六、总结

本文提出一个同时实现单字和双字字频统计的算法。算法流程包括:文本预处理(正则提取纯汉字)、单字统计(遍历计数)、双字统计(滑动窗口截取双字对)、多维度可视化(6类图表展示结果)。核心功能是通过正则过滤非汉字字符,分别统计单字和连续双字的出现频次,并生成条形图、词云、热力图等可视化结果。该算法适用于中小规模中文文本分析,可输出高清统计图表和控制台结果,为中文文本研究提供直观的数据支持。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/25 23:09:47

我的mybatis-flex自定义查询为什么没有参数

问题分析MyBatis-Flex 自定义查询未传递参数可能由以下原因导致&#xff1a;参数未正确绑定到 SQL 语句方法参数与 SQL 占位符名称不匹配动态 SQL 条件未生效检查参数绑定方式确保在 XML 或注解中正确引用参数。若使用 Param 注解&#xff0c;需在 SQL 中通过 #{paramName} 引用…

作者头像 李华
网站建设 2026/6/26 7:47:40

揭秘Dify混合检索缓存机制:为何缓存清理如此重要?

第一章&#xff1a;揭秘Dify混合检索缓存机制的核心原理Dify 的混合检索缓存机制通过结合向量相似度检索与关键词匹配&#xff0c;显著提升了问答系统的响应速度与准确性。该机制在底层利用缓存预加载和智能命中策略&#xff0c;有效降低了大模型调用频率&#xff0c;从而节省计…

作者头像 李华
网站建设 2026/6/26 1:58:05

计划赶不上变化?错!是计划“根本赶不上开工”

计划的价值不仅在于预测&#xff0c;还在于提供应对变化的框架。制定这样的计划&#xff0c;是每个项目成功的第一步。如果计划总是被变化打乱&#xff0c;很可能它不是一份合格的工作指南。 一、哪些计划注定会失败&#xff1f; 脱离现实的里程碑 “六个月内打造行业领先平台…

作者头像 李华
网站建设 2026/6/24 18:33:25

应用冷启动优化

当应用启动时&#xff0c;后台没有该应用的进程&#xff0c;这时系统会重新创建一个新的进程分配给该应用&#xff0c; 这种启动方式就叫做冷启动&#xff08;也就是首次打开&#xff09;而热启动是当应用程序已经在后台运行&#xff0c;用户再次打开应用程序时&#xff0c;应用…

作者头像 李华
网站建设 2026/6/25 23:05:47

java_base_(接口篇)省流版

在原神的开发场景中&#xff0c;接口&#xff08;Interface&#xff09; 是核心的抽象设计工具&#xff0c;用于定义 “行为规范” 而非具体实现&#xff0c;能让代码具备高扩展性、低耦合性 —— 比如不同角色的技能释放、不同怪物的攻击逻辑、不同道具的使用效果&#xff0c;…

作者头像 李华
网站建设 2026/6/26 0:44:26

实测主流科技查新网站:它们如何解决专利与项目查新的双重需求?

在技术研发与创新保护的前期&#xff0c;“查新”是不可或缺的一环。它不仅指狭义的专利申请前的新颖性检索&#xff08;专利查新&#xff09;&#xff0c;更广义上涵盖了在申报政府科技项目前&#xff0c;对现有已立项研究进行全面的背景调研&#xff08;科技项目查新&#xf…

作者头像 李华