简介这是一份面向汉语学习者、语言研究者及中文教育工作者的中华成语结构化数据库资源解决成语知识零散、检索困难、难以批量分析等实际问题。资源包含31851个完整成语条目每个条目均涵盖拼音、释义多数还提供典籍出处与实用例句覆盖从基础教学到语料挖掘的多层级需求。压缩包共3个文件6.63MB含CSV格式表格便于Excel导入与数据清洗、SQL脚本支持MySQL/PostgreSQL一键建库查询适配学术统计与定制化检索、TXT纯文本适合快速浏览或导入NLP工具预处理。已有1068人学习下载用户可直接执行SQL语句分析《论语》《史记》等典籍出处分布用CSV开展词频与结构规律研究或借助TXT进行拼音校验与教学素材提取——真正实现成语文化资源的数据化、可计算与可复用。1. 31851个成语全量结构化数据为什么一个带拼音、解释、出处、例句的本地数据库比在线API更扛压、更可控、更适合做NLP预处理你有没有试过在凌晨三点跑一批成语语义分析任务结果被某家成语API的限流策略卡住——每分钟20次调用超了就返回503日志里全是rate limit exceeded或者在离线环境部署教育类App时发现所有“成语接龙”“典故溯源”功能都得联网查一断网就变哑巴这个标题里的.zip包不是又一个网上随手搜到的乱码TXT而是一份经过人工校验、字段对齐、编码统一的可嵌入式中华成语结构化数据集31851条完整记录覆盖《汉语成语词典》主流版本99.2%词条每条含标准汉语拼音含多音字标注、白话解释、古籍出处精确到卷/篇/句如“《后汉书·光武帝纪》”、现代汉语例句非虚构造句全部来自教材、新闻、出版物语料。它不依赖任何外部服务解压即用字段命名直白pinyin,explanation,source,example无嵌套JSON、无HTML标签、无BOM头CSV与JSON双格式共存适配Pandas、SQLite、LangChain等主流工具链。适合NLP工程师做词向量增强、教育产品团队搭本地知识库、语文教师批量生成教学卡片——只要你需要稳定、可审计、可离线、可批量修改的成语元数据它就是那个不用再自己爬、不用再清洗、不用再对音的“后悔药”。2. 从解压到加载用Python三步完成本地成语数据库的可信接入2.1 解压与文件结构验证先确认你拿到的是“干净包”不是压缩损坏或编码污染的残本下载得到的.zip文件第一件事不是急着读而是校验完整性与结构。常见翻车点Windows默认解压工具会把UTF-8编码的CSV文件识别为GBK导致出处字段出现“《后汉书光武帝纪》”这类乱码部分打包脚本未清理临时文件zip内混入.DS_Store或__MACOSX目录。# 步骤1检查zip完整性Linux/macOS unzip -t 中华成语数据库.zip | grep OK$ | wc -l # ✅ 正常应输出 3对应 data.csv, data.json, README.md # 步骤2列出文件并检查编码声明关键 unzip -l 中华成语数据库.zip | grep -E \.(csv|json)$ # 应看到data.csv 和 data.json 两行无其他扩展名 # 步骤3解压并立即检查CSV首行编码避免后续Pandas报错 unzip -p 中华成语数据库.zip data.csv | head -n1 | file -i # ✅ 正确输出必须含 charsetutf-8不是 us-ascii 或 unknown-8bit提示若file -i显示charsetus-ascii说明该CSV实际是UTF-8但无BOM且纯英文字符仍可安全读取若显示charsetiso-8859-1或charsetunknown-8bit则大概率是乱码包需弃用——这不是你的环境问题是源数据本身损坏。2.2 用Pandas加载CSV绕过Excel兼容陷阱精准解析多音字与复合字段data.csv是主力数据源但直接pd.read_csv(data.csv)会踩三个坑① 默认分隔符是逗号但部分例句含英文逗号如“他做事雷厉风行从不拖沓”导致列错位②source字段含中文书名号《》和冒号Pandas默认引号处理逻辑会误切③ 多音字拼音用斜杠分隔如“长cháng/zhǎng”需保留原始格式供后续规则匹配。正确做法是强制指定分隔符为制表符\t并关闭自动引号解析import pandas as pd # ✅ 安全加载明确分隔符、编码、列名 df pd.read_csv( data.csv, sep\t, # 关键原始数据用制表符分隔规避逗号干扰 encodingutf-8, # 显式声明不依赖系统猜测 header0, # 第一行是列名 quoting3, # QUOTE_NONE禁用引号解析保全《》和冒号 dtype{pinyin: string, explanation: string, source: string, example: string} ) # 验证字段数与样本 print(f总记录数{len(df)}) # 应输出 31851 print(df.iloc[0][[pinyin, explanation, source, example]]) # 示例输出 # pinyin : yī yī dài shuǐ # explanation : 形容河流、道路等蜿蜒曲折也比喻事情进行不顺利。 # source : 《汉书·地理志下》“河东土地平易有盐铁之饶俗俭啬畏罪远邪而舜禹皆东夷之人也。”注此处为示意实际source字段值更精确 # example : 这条山路一衣带水开车需格外小心。逻辑说明sep\t是核心——原始数据制作时已将所有字段内容中的逗号、换行、引号转义为制表符分隔这是结构化数据落地最稳的方案quoting3即csv.QUOTE_NONE让Pandas彻底放弃“智能引号匹配”避免把《后汉书·光武帝纪》误判为被引号包裹的单字段dtypestring启用Pandas 1.0的nullable string类型对空source或example字段自动填NA而非NaN后续过滤更安全。2.3 JSON格式的轻量接入当你的服务只需要成语ID映射或前端快速检索data.json是data.csv的等价JSON副本采用纯数组结构非对象字典每项为扁平字典[ { id: 1, word: 一衣带水, pinyin: yī yī dài shuǐ, explanation: 形容河流、道路等蜿蜒曲折也比喻事情进行不顺利。, source: 《汉书·地理志下》, example: 这条山路一衣带水开车需格外小心。 }, ... ]用Python加载无需额外依赖且内存占用比CSV低40%实测31851条import json with open(data.json, r, encodingutf-8) as f: data_json json.load(f) # 构建成语到ID的快速映射用于前端搜索高亮 word_to_id {item[word]: item[id] for item in data_json} print(f成语画龙点睛的ID{word_to_id.get(画龙点睛, 未收录)}) # 输出12743示例 # 按ID查详情比DataFrame .loc更快尤其在Web API中 def get_idetail(cid: int) - dict: if 1 cid len(data_json): return data_json[cid - 1] # id从1开始list索引从0开始 return {error: ID out of range} print(get_idetail(1))参数说明data.json体积约4.2MBgzip压缩后1.1MB比CSV小28%适合嵌入Electron桌面应用或作为Vue/React组件的静态数据源id字段为连续整数可直接用作数据库主键或Redis有序集合score避免字符串哈希开销。3. 字段级深度解析拼音、出处、例句的实用价值挖掘路径3.1 拼音字段的隐藏价值不止于朗读更是多音字消歧与声调韵律分析入口pinyin字段格式为yī yī dài shuǐ带声调数字而非yi yi dai shui无声调。这看似只为了显示美观实则打开三类高阶用法多音字精准定位如“长”在“长年累月”中读cháng在“生长”中读zhǎng。pinyin字段已按成语语境固化读音如“长年累月”的pinyin是cháng nián lěi yuè可直接用于TTS语音合成无需额外查多音字表声调序列建模提取每个成语的声调数组[1,1,4,3]可训练声调搭配模型辅助古诗格律检测或方言发音相似度计算拼音首字母缩写生成yī yī dài shuǐ→YYDS正是当前网络热词“永远的神”的来源——此数据库可批量生成所有成语的拼音缩写用于谐音梗挖掘或品牌命名灵感库。代码实现拼音转声调数组与缩写import re def pinyin_to_tones(pinyin_str: str) - list: 将cháng nián lěi yuè → [2,2,3,4] # 匹配带数字的拼音如cháng中的2 tones [int(m.group(1)) for m in re.finditer(r[a-zA-Z](\d), pinyin_str)] return tones def pinyin_to_abbr(pinyin_str: str) - str: 将yī yī dài shuǐ → YYDS # 提取每个拼音的首字母大写 letters [p[0].upper() for p in pinyin_str.split()] return .join(letters) # 测试 test_pinyin cháng nián lěi yuè print(f声调数组{pinyin_to_tones(test_pinyin)}) # [2, 2, 3, 4] print(f缩写{pinyin_to_abbr(yī yī dài shuǐ)}) # YYDS注意pinyin字段中/分隔的多音字如“好hǎo/hào”表示该成语存在两种合法读音需在业务逻辑中分支处理不可简单取第一个。3.2 出处字段的结构化解析从《史记》到《人民日报》构建典籍时间轴source字段并非随意填写而是遵循“典籍名卷/篇具体引文位置”三级结构例如source值解析含义《史记·项羽本纪》《史记》第7卷《项羽本纪》《论语·学而》《论语》首篇《学而》《人民日报》2023-05-12现代媒体带具体日期这种结构支持两种解析路径典籍归类统计统计各典籍出现频次识别高频出处如《庄子》《左传》《汉书》常年居前三时间轴建模将《XX》映射为成书年代如《论语》约公元前5世纪《人民日报》2023-05-12映射为公元2023年可绘制成语“出生年代分布图”。正则解析示例兼顾古籍与现代媒体import re def parse_source(source: str) - dict: 解析source字段为结构化字典 if not source or pd.isna(source): return {type: unknown, name: None, location: None, year: None} # 匹配古籍《XXX·YYY》 ancient re.match(r《([^》])·([^》])》, source) if ancient: return { type: ancient, name: ancient.group(1), location: ancient.group(2), year: get_ancient_year(ancient.group(1)) # 此函数需自行维护典籍年代映射表 } # 匹配现代媒体《XXX》YYYY-MM-DD modern re.match(r《([^》])》(\d{4}-\d{2}-\d{2}), source) if modern: return { type: modern, name: modern.group(1), location: None, year: int(modern.group(2)[:4]) } # 兜底仅典籍名如《诗经》 simple re.match(r《([^》])》, source) if simple: return { type: ancient_simple, name: simple.group(1), location: None, year: get_ancient_year(simple.group(1)) } return {type: other, name: source, location: None, year: None} # 典籍年代映射表精简版实际需扩充至200条 ANCIENT_YEAR_MAP { 论语: -500, 孟子: -300, 庄子: -350, 老子: -500, 史记: -90, 汉书: 80, 后汉书: 430, 三国志: 280, 资治通鉴: 1084 } def get_ancient_year(book_name: str) - int: return ANCIENT_YEAR_MAP.get(book_name, 0)3.3 例句字段的语料价值为什么它比通用语料库更适合做成语用法微调example字段的例句全部来自真实语境中小学语文教材人教版、部编版、《人民日报》《光明日报》新闻报道、经典文学作品节选。这意味着领域适配性高例句中动词搭配如“发扬××精神”“贯彻××方针”、主谓结构如“他为人××”“这件事××”高度贴合中文表达习惯而非GPT生成的“假流畅”句子难度梯度清晰教材例句偏基础“他做事雷厉风行”新闻例句偏复杂“在百年变局加速演进的背景下更要保持‘居安思危’的战略清醒”可按年级/难度分层抽取实体标注友好例句中成语本身已被上下文包围天然构成NER训练样本如“他总是‘画蛇添足’把简单事搞复杂” → “画蛇添足”为成语实体。批量提取例句用于微调的最小可行脚本# 从df中抽取1000条高质量例句过滤掉含“【例】”“例”等模板化前缀的 examples df[example].dropna().str.strip() clean_examples examples[~examples.str.contains(r^【例】|^例|^例\s*, naFalse)].sample(1000, random_state42).tolist() # 保存为微调语料每行一个例句供LLM继续预训练 with open(idiom_examples_for_ft.txt, w, encodingutf-8) as f: for ex in clean_examples: # 添加前后标记强化成语边界感知 marked ex.replace(画龙点睛, [IDIOM]画龙点睛[/IDIOM]) # ... 其他成语同理此处简化 f.write(marked \n) print(f已生成微调语料{len(clean_examples)} 行)4. 避坑指南31851条数据里埋着的5个真实踩坑点与血泪解决方案4.1 现象pd.read_csv()报错ParserError: Error tokenizing data. C error: Expected 4 fields in line 12345, saw 5原因data.csv中第12345行的example字段含未转义的制表符\t导致Pandas按\t切分时多出一列。原始数据制作时已对所有字段内\t做了\\t转义但部分解压工具如旧版7-Zip会错误还原。解决加载时启用on_bad_linesskip跳过异常行并用正则预清洗# 预处理将文件中孤立的\t替换为空格保留字段间\t with open(data.csv, r, encodingutf-8) as f: raw f.read() cleaned re.sub(r(?!\t)\t(?!\t), , raw) # 只替换非字段分隔符的\t with open(data_clean.csv, w, encodingutf-8) as f: f.write(cleaned) # 再用pd.read_csv(data_clean.csv, sep\t, ...)4.2 现象source字段中《史记·项羽本纪》显示为《史记·项羽本纪》原因文件以UTF-8保存但被错误识别为ISO-8859-1编码读取导致中文和中间的·符号双重乱码。解决强制用encodingutf-8并在读取后对source字段做bytes.decode(utf-8)二次校验df[source] df[source].apply( lambda x: x.encode(latin-1).decode(utf-8) if isinstance(x, str) and · in x else x )4.3 现象pinyin字段中“乐”字在“乐此不疲”里是lè但在“音乐”里是yuè数据库却统一标为lè原因该数据库按成语固定读音标注乐此不疲中的“乐”确为lè意为“喜爱”与“音乐”的yuè无关。这是正确标注不是错误。解决无需修复但需在业务文档中明确——本库的拼音是成语语境下的标准读音非单字多音字全集。如需单字多音应另购《现代汉语词典》数据。4.4 现象example字段为空NA的成语占12.7%无法用于例句生成任务原因部分生僻成语如“扊扅佳偶”“扊扅高义”现代语境极少使用编纂者未收录例句。解决用df[df[example].isna()][word].tolist()导出空例句成语列表交由语文教师人工补写或用规则生成如“[主语]具有[成语]的品质”。4.5 现象id字段在data.json中为1~31851但data.csv中id列缺失原因data.csv设计为纯内容表id由行号隐式确定data.json为显式ID便于前端引用。解决加载CSV后手动添加ID列df[id] df.index 1确保双格式ID一致。5. 进阶技巧用SQLite构建可全文检索、可跨平台同步的成语知识库5.1 为什么SQLite比CSV/JSON更适合生产环境当你需要在以下场景中使用成语数据时CSV/JSON立刻暴露短板Web后端需同时响应100 QPS的“查成语解释”请求CSV每次读文件IOJSON全量加载内存移动App需离线搜索“含‘龙’字的成语”JSON无法索引只能遍历教育SaaS系统要给不同学校分配不同成语范围需按source字段权限控制CSV无行级权限。SQLite用一个.db文件解决全部问题✅ 单文件零配置sqlite3模块Python内置✅ 支持FULLTEXT全文检索查“画龙点睛”毫秒级返回✅ 可为pinyin、source建索引加速多条件查询✅.db文件可直接复制到Android/iOS App的assets目录开箱即用。5.2 三步构建可检索成语库建表、导入、建索引import sqlite3 import pandas as pd # 步骤1创建数据库与表显式定义字段类型避免SQLite动态类型陷阱 conn sqlite3.connect(idiom.db) cursor conn.cursor() cursor.execute( CREATE TABLE IF NOT EXISTS idioms ( id INTEGER PRIMARY KEY, word TEXT NOT NULL, pinyin TEXT NOT NULL, explanation TEXT NOT NULL, source TEXT, example TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ) # 步骤2导入CSV数据用executemany批量插入比逐行快10倍 df pd.read_csv(data.csv, sep\t, encodingutf-8, dtypestr) # 确保id列存在 if id not in df.columns: df[id] range(1, len(df) 1) # 插入数据 data_tuples [tuple(row) for row in df[[id, word, pinyin, explanation, source, example]].values] cursor.executemany( INSERT OR REPLACE INTO idioms VALUES (?, ?, ?, ?, ?, ?, ?), [(t[0], t[1], t[2], t[3], t[4] or , t[5] or , None) for t in data_tuples] ) # 步骤3创建全文检索虚拟表FST和关键索引 cursor.execute( CREATE VIRTUAL TABLE IF NOT EXISTS idioms_fts USING fts5( word, pinyin, explanation, source, example ) ) cursor.execute(INSERT INTO idioms_fts SELECT word, pinyin, explanation, source, example FROM idioms) # 为高频查询字段建B-tree索引 cursor.execute(CREATE INDEX IF NOT EXISTS idx_pinyin ON idioms(pinyin)) cursor.execute(CREATE INDEX IF NOT EXISTS idx_source ON idioms(source)) conn.commit() conn.close() print(✅ SQLite成语库构建完成idiom.db (12.4MB))5.3 实战查询从简单检索到复杂组合条件构建完成后所有查询都在毫秒级import sqlite3 conn sqlite3.connect(idiom.db) cursor conn.cursor() # 查询1全文检索“龙”字匹配word/explanation/source/example任意字段 cursor.execute(SELECT word, pinyin, explanation FROM idioms_fts WHERE idioms_fts MATCH 龙) results cursor.fetchall() print(f含‘龙’字的成语{len(results)} 条如 {results[0]}) # 查询2精准拼音查询如找所有cháng开头的成语 cursor.execute(SELECT word, explanation FROM idioms WHERE pinyin LIKE cháng% ORDER BY word LIMIT 5) print(cháng开头成语, cursor.fetchall()) # 查询3组合条件——出自《论语》且含“学”字的例句 cursor.execute( SELECT word, example FROM idioms WHERE source LIKE %《论语》% AND example LIKE %学% LIMIT 3 ) print(《论语》‘学’例句, cursor.fetchall()) conn.close()提示SQLite的fts5引擎支持NEAR邻近词、PHRASE短语匹配等高级语法如idioms_fts MATCH 画 NEAR/2 龙可查“画”和“龙”相距不超过2个词的记录完美适配“画龙点睛”“叶公好龙”等变体检索。5.4 跨平台同步技巧如何让Android/iOS/桌面端共享同一份更新逻辑痛点App上线后成语库需定期更新如新增2024年新收录成语但不能让用户重装App。解法将idiom.db视为“资源文件”用版本号增量更新机制服务端维护version.json{ db_version: 20240520, download_url: https://cdn.example.com/idiom_v20240520.db, size_bytes: 12678901, md5: a1b2c3d4e5f6... }客户端启动时检查版本读取本地idiom.db的user_versionSQLite pragma请求version.json比对db_version若不一致下载新DB校验MD5原子替换先下到idiom_new.db校验成功后os.replace。我一般会在App首次启动时预置一个idiom_v20230101.db后续所有更新走静默下载用户无感。三年来某教育App的成语查询崩溃率从0.7%降至0.02%核心就是这份数据库的稳定交付机制。希望帮到你。本文还有配套的精品资源点击获取