用 Python 实现成语同频判断:结构模式识别的有趣应用(文中含源码)
🐍 用 Python 实现成语同频判断:结构模式识别的有趣应用(文中含源码)
一、介绍
本文将展示如何使用 Python 自动判断两个成语是否为“同频成语”——
也就是:两个成语的结构是否一致。
成语是汉语文化的精粹,短短四字,往往蕴含深意。
然而,从语言学角度看,成语的结构模式也很有规律,比如:
- “高高兴兴”“快快乐乐” → AABB
- “将计就计”“讨价还价” → ABAB
- “滔滔不绝”“茫茫人海” → AABC
- “自相矛盾”“刻舟求剑” → ABCD
这些结构规律可以用于自动语言分析、汉语教学软件、诗词生成器等自然语言处理场景。
二、什么是“同频成语”?
在语言学中,如果两个成语的结构相同,就称它们是“同频成语”。
成语1 | 成语2 | 结构 | 是否同频 |
---|---|---|---|
高高兴兴 | 快快乐乐 | AABB | ✅ 是 |
将计就计 | 讨价还价 | ABAB | ✅ 是 |
滔滔不绝 | 茫茫人海 | AABC | ✅ 是 |
守株待兔 | 喜气洋洋 | ABCD vs AABB | ❌ 否 |
这里的 “AABB”“ABAB”“AABC”“ABCD” 等结构模式,可以通过字的重复规律自动推断出来。
三、算法思路
我们不直接查表,而是根据每个字的出现顺序,构建一个“模式字符串”。
例如:
-
成语 “高高兴兴”:
- 第1字“高” → A
- 第2字“高”重复 → A
- 第3字“兴” → B
- 第4字“兴”重复 → B
→ 模式:AABB
-
成语 “将计就计”:
- “将” → A
- “计” → B
- “就” → C
- “计”重复 → B
→ 模式:ABCB(非标准,但相似于 ABAB)
因此,如果两个成语的模式字符串完全一致,我们就认为它们是“同频”的。
四、Python 源代码
以下是完整的 Python 代码👇
# -*- coding: utf-8 -*-
# 成语同频判断程序
# 功能:判断两个成语的结构是否相同(即是否为“同频成语”)# =============================
# 一、定义成语结构提取函数
# =============================def get_pattern(chengyu: str) -> str:"""根据汉字重复情况生成结构模式字符串。例如:- "高高兴兴" → AABB- "将计就计" → ABAB- "自相矛盾" → ABCD- "滔滔不绝" → AABC作用:通过检测每个汉字出现的顺序规律,用字母表示成语的结构类型。"""# 创建一个空字典,用来存储“汉字 → 模式字母”的映射# 例如 {"高": "A", "兴": "B"}mapping = {}# 用于保存最终的模式结果,如 ["A", "A", "B", "B"]pattern = []# 初始化下一个可用的模式字母,从 "A" 开始依次递增next_char = 'A'# 遍历成语中的每一个汉字for char in chengyu:# 如果当前汉字尚未出现过if char not in mapping:# 将该汉字分配给当前的模式字母mapping[char] = next_char# 下一个新汉字使用下一个字母(A→B→C→...)next_char = chr(ord(next_char) + 1)# 不论新旧,把当前字对应的模式字母加入 pattern 列表pattern.append(mapping[char])# 把 ['A', 'A', 'B', 'B'] 转换为 "AABB" 返回return ''<