简介《声律启蒙》上卷大字注音版是一份面向儿童国学启蒙、汉语初学者及古典文学爱好者的文档资源通过大字与注音相结合的方式降低古汉语对仗与声韵知识的学习门槛帮助读者在诵读中体会平仄、押韵与对仗的规律。资源包内含1个doc文件整体约616KB以文档形式呈现便于打印、批注与随身阅读。目前已有118人学习下载适合作为家庭亲子共读或自学参考的入门材料。文档围绕上卷内容编排涵盖对仗句式、声韵教学及标点运用等模块读者可借此熟悉古汉语的对称美与韵律节奏逐步掌握诗词格律的基本规律为后续古诗文阅读与创作打下基础。无论是提升汉语听说读写能力还是培育传统文化素养这份注音版都能提供清晰而实用的学习路径。1. 一份被乱码吃掉正文的《声律启蒙》注音版到底还能怎么用拿到「声律启蒙上卷大字注音版.doc」这个文件的人第一反应往往是懵的打开之后满屏都是「㈠」「㈡」「㈢」和成串的逗号、句号、分号正文汉字几乎全丢只剩标点和零星几个「日」「使」「奉世」「棠」「规」「táo」「rì」这样的残字。这不是文件损坏而是典型的编码与字体映射错位——原始文档里的汉字用了某种非标准内码或嵌入字体在转存、复制、跨平台打开的过程中被剥离标点因为落在 ASCII 区间反而活了下来。所以这份资源真正的价值不在「直接读」而在于它是一份结构完整的对仗骨架上卷十五韵、每韵三则、每则两段对仗标点位置精确保留了原文的断句节奏。对做国学类 App、儿童识字工具、古诗文语料清洗的开发者来说它更像一份「带标点的空模板」配合公开的《声律启蒙》通行本可以快速重建出带注音、带平仄标注的结构化数据。适合谁需要批量处理古籍文本的 NLP 工程师、做语文教育产品的后端、以及想拿它练手文档解析的 IT 从业者。下面从编码诊断讲到数据重建再落到可复用的处理脚本。2. 从乱码 doc 到结构化文本编码诊断与清洗2.1 先判断这份 doc 的真实格式.doc后缀不代表它真是 OLE 复合文档。很多从网页或旧系统导出的「doc」其实是 HTML 或 RTF 改了扩展名用file命令一测就露馅。这一步不做后面用 python-docx 会直接抛异常。# 查看文件真实类型不要只看后缀 file 声律启蒙上卷大字注音版.doc # 常见输出 # Composite Document File V2 - 真 OLE用 antiword 或 libreoffice # HTML document, UTF-8 - 伪 doc直接当 HTML 解析 # Rich Text Format - RTF用 striprtf逻辑说明file读取文件头魔数比扩展名可靠。参数上没什么可调的重点是拿到结果后分流。如果是 OLE优先用libreoffice --headless --convert-to txt转纯文本比 antiword 对中文兼容更好如果是 HTML用 BeautifulSoup 抽文本节点即可。2.2 用 Python 把标点骨架抽出来乱码文档里汉字没了但标点、括号序号、换行还在这些恰好是切分对仗句的锚点。思路是按「㈠㈡㈢」切则按「。」切句把每句的位置占住等重建时按位填字。import re def extract_skeleton(text): # 统一全角/半角标点避免后续匹配漏掉 text text.replace(, 。).replace(, ) # 按序号切分每一则㈠㈡㈢ 是 Unicode 带括号数字 sections re.split(r[㈠㈡㈢], text) result [] for sec in sections: if not sec.strip(): continue # 按中文标点切句保留标点本身 clauses re.findall(r[^。][。], sec) result.append([c.strip() for c in clauses if c.strip()]) return result with open(raw.txt, encodingutf-8, errorsignore) as f: skeleton extract_skeleton(f.read()) print(len(skeleton), skeleton[0][:5])逻辑说明re.split用序号做一级分隔re.findall用字符类匹配「非标点标点」的组合这样每个对仗分句连同它的收尾标点一起被保留。errorsignore是关键乱码字节直接跳过而不是报错。参数上如果文档里序号是「(一)」而非「㈠」把正则改成r[(][一二三][)]即可。2.3 常见坑编码探测别只信 chardet现象可能原因处理方式汉字全丢只剩标点嵌入字体未嵌入字形换原始来源或按骨架重建出现「?」「□」GBK 被当 UTF-8 读用gb18030重读它兼容 GBK/GB2312序号变成「\u3220」带括号数字被转义直接按 Unicode 码点匹配段落全挤成一行原 doc 用软换行按标点重新断句不依赖\n提示gb18030是 GBK 的超集遇到中文乱码先拿它试比 chardet 猜编码稳得多chardet 对短文本经常误判成 ISO-8859。3. 按十五韵重建对仗数据对齐通行本与注音标注3.1 上卷十五韵的骨架映射《声律启蒙》上卷按平水韵分十五个韵部每韵三则每则两段。乱码文档里的「㈠㈡㈢」正好对应每韵的三则这个结构是重建的坐标系。先把韵部顺序固定下来再往里填字就不会错位。# 上卷十五韵顺序固定作为重建的索引 YUUN_BU [ 一东, 二冬, 三江, 四支, 五微, 六鱼, 七虞, 八齐, 九佳, 十灰, 十一真, 十二文, 十三元, 十四寒, 十五删 ] def build_index(skeleton): # skeleton 每项是一则按顺序对应韵部 index {} for i, ze in enumerate(skeleton): # 每韵三则整除定位韵部 yun YUUN_BU[i // 3] if i // 3 len(YUUN_BU) else 未知 index.setdefault(yun, []).append(ze) return index逻辑说明i // 3把连续的则映射回韵部因为每韵恰好三则。参数上如果文档缺失某则导致总数不是 45需要人工核对缺口位置不能盲目整除。这一步产出的index就是后续填字的容器。3.2 注音数据的来源与对齐策略大字注音版的核心是拼音。重建时拼音不能靠猜要用公开的《声律启蒙》通行本正文做底本再用pypinyin批量注音最后按标点位置和骨架对齐。对齐的难点在于通行本可能多字少字直接按索引对会错位。from pypinyin import pinyin, Style def annotate(line): # 逐字注音保留声调用于大字注音版排版 py pinyin(line, styleStyle.TONE) return list(zip(list(line), [p[0] for p in py])) # 示例对一句通行本正文注音 print(annotate(云对雨雪对风)) # [(云,yún),(对,duì),(雨,yǔ),(,),...]逻辑说明Style.TONE输出带声调符号的拼音适合直接排版若要数字声调yun2改用Style.TONE3。标点会被pinyin原样返回所以zip后长度一致不会错位。参数上多音字是最大变量pypinyin默认按词频选音古籍场景建议加载自定义词典load_phrases_dict修正「斜」「衰」这类古音。3.3 用 difflib 做骨架与正文的模糊对齐当通行本和骨架句数不一致时硬对齐会崩。用difflib.SequenceMatcher按标点序列做模糊匹配找出插入/缺失位置比逐句比对鲁棒。import difflib def align(skeleton_clauses, text_clauses): sm difflib.SequenceMatcher(None, skeleton_clauses, text_clauses) pairs [] for tag, i1, i2, j1, j2 in sm.get_opcodes(): if tag equal: pairs.extend(zip(range(i1, i2), range(j1, j2))) # insert/delete 记录缺口人工复核 return pairs逻辑说明get_opcodes返回 equal/replace/insert/delete 四类操作equal 段直接建立索引映射其余段落标记为待人工核对。参数上SequenceMatcher的autojunk对短序列建议设 False避免它把高频标点当噪声过滤掉。4. 批量处理与导出脚本化生成可检索的注音文本4.1 批量注音并导出 Markdown 表格单篇处理完真正要交付的是可检索、可导入数据库的结构。把每则对仗导出成「韵部 / 上句 / 下句 / 拼音」四列的 Markdown 或 CSV方便后续做全文检索或喂给前端。import csv def export_csv(index, out_path): with open(out_path, w, newline, encodingutf-8-sig) as f: w csv.writer(f) w.writerow([韵部, 则, 上句, 下句, 上句拼音, 下句拼音]) for yun, zes in index.items(): for n, ze in enumerate(zes, 1): # 假设每则已切成上下两段 up, down ze[0], ze[1] if len(ze) 1 else w.writerow([yun, n, up, down, .join(p[0] for p in pinyin(up, styleStyle.TONE)), .join(p[0] for p in pinyin(down, styleStyle.TONE))])逻辑说明utf-8-sig带 BOMExcel 直接双击不乱码这是给非技术同事交付时的实用细节。参数上如果只要纯文本给程序读去掉-sig用utf-8。pinyin返回嵌套列表p[0]取拼音串。4.2 用 jieba 做韵脚检索重建完数据检索需求就来了查某个韵脚出现过哪些对仗。中文分词后按韵母归并能快速建倒排索引。import jieba from pypinyin import lazy_pinyin, Style def rhyme_index(lines): idx {} for line in lines: # 取每句末字的韵母作为韵脚 last line.strip(。)[-1] yunmu lazy_pinyin(last, styleStyle.FINALS)[0] idx.setdefault(yunmu, []).append(line) return idx逻辑说明Style.FINALS只取韵母忽略声母正好对应传统押韵的判定。参数上lazy_pinyin比pinyin快适合大批量末字取[-1]前要先剥标点否则韵脚会变成「」。导出格式适用场景关键参数CSV (utf-8-sig)Excel 校对、非技术交付带 BOM 防乱码JSON前端渲染、API 返回ensure_asciiFalseSQLite本地全文检索FTS5 建虚拟表Markdown静态站点、文档表格对齐即可注意批量注音前先对正文做繁简统一opencc转一遍否则同一字繁简两套拼音会污染韵脚索引。5. 进阶把注音数据接进全文检索与前端渲染数据重建完最后一公里是让它能被搜、能被看。SQLite 的 FTS5 扩展是本地全文检索最省事的方案建一张虚拟表把上句、下句、拼音都塞进去中文用unicode61分词器配合预分词即可。-- 建 FTS5 虚拟表content 指向真实表 CREATE VIRTUAL TABLE shenglyu_fts USING fts5( yun, up, down, up_py, down_py, tokenize unicode61 ); -- 查询含「风」的对仗拼音列也能命中 SELECT yun, up, down FROM shenglyu_fts WHERE shenglyu_fts MATCH 风 LIMIT 10;逻辑说明unicode61对中文按字切分够用若要按词需在入库前用 jieba 把文本切成空格分隔再存。MATCH支持列限定如up_py:feng可只搜上句拼音。参数上数据量大时加content建外部内容表省空间。前端渲染大字注音常见做法是用 ruby 标签把拼音放在汉字上方字号用text-emphasis或绝对定位控制。一个最小可用的结构是每个字包一层ruby拼音进rtCSS 里把rt字号设成主字的 0.5 倍、颜色调淡就得到接近纸质注音版的观感。如果要做成可点击查韵脚给每个末字绑事件查上面那张 FTS 表返回同韵对仗即可。这套流程跑通后一份乱码 doc 就变成了可检索、可注音、可前端渲染的国学语料比直接读原文的用途大得多。本文还有配套的精品资源点击获取
