新闻详情

新闻详情

首页 / 资讯中心 / 详情

用Python数据验证甲骨文“册”字:简册编连之形的量化分析

发布时间:2026/9/28 1:26:26来源:尧图网络
用Python数据验证甲骨文“册”字:简册编连之形的量化分析
之前在整理汉字字形资料时一直对甲骨文里的“册”字很感兴趣。很多资料把它解释为“古代竹简的形状”但只看拓片上的弯曲线条很难直接确认。这篇文章就用一个程序员的思路把“册”字的字形结构拆成可量化的数据再用代码验证甲骨文“册”字到底是不是简册编连的形状。全文会从文字学常识讲起给出可复现的 Python 分析脚本并讨论计算机辅助古文字研究的边界和注意事项。无论你是第一次接触甲骨文还是想了解数字人文方向的实际操作都能从里面找到可以上手的思路。1. 从“册”字说起一个和竹简有关的问题1.1 甲骨文“册”字长什么样甲骨文是商代晚期刻写在龟甲和兽骨上的文字主要用于占卜记录1899 年之后在河南安阳殷墟一带大量出土。甲骨文已经是一种相当成熟的文字系统其中包含大量的象形字、指事字、会意字和形声字。“册”就是被反复讨论的典型象形字之一。从字形上看甲骨文里的“册”通常写作多根竖直的短线条并列中间或两端有横向或略弯的线条把它们串联起来。这种形态非常像把一根一根的长条形薄片用绳子编连在一起。东汉许慎在《说文解字》里解释“册”字时也说这个字是“符命”的意思字形“象其札一长一短中有二编之形”。用今天的话解释就是像长短不一的简札中间有两道编绳把它们连起来。所谓“札”指古代写字用的木简或竹简所谓“编”就是用来串联简札的绳子。所以“册”的字形从商代甲骨文到《说文解字》的记录始终围绕同一个意象把简札编连成书册。1.2 “册”与“简”不是一回事标题问的是“册”字究竟是不是古代竹简的形状。这个提问很自然但严谨地说“册”象的不是单独一根竹简而是多根简札编连成册之后的形象。先区分几个概念简单根竹片或木片古人写字的主要载体。牍较宽的木片常常用来写公文或书信。册把若干简牍用绳索编连起来的整体。策古书中与“册”经常通用指成编的简册也引申为策略、计策。所以更准确的表述是甲骨文“册”字像“编简成册”之形。通俗地说成“竹简的形状”可以理解因为简以竹制最常见但从文字学和考古学的角度应该说是“简册/简牍编连之形”。商代中原地带竹材的使用情况、简册实物的保存情况仍需要更多考古材料佐证因此“竹简形状”适合作为科普表达“简册形状”更适合作为严谨结论。1.3 为什么本文要用代码来验证传统文字学判断一个象形字主要靠字形排比、文献记载和考古实物互证。这种方法很可靠但对初学者来说门槛高而且不同学者对同一个字形可能有不同描述。计算机能做的是把“看上去像”变成“可以统计的特征”。例如我们可以把“册”的核心字形特征拆成三个可计算指标简札数量字形里有多少根竖直笔画。简札长短这些竖直笔画是否长短不一。编绳数量字形里有多少道横向长线条。如果一组字形数据经过自动检测后得到“多根竖线 长短不同 多道横线贯穿”的结果那就说明计算机量化结果与传统文字学描述一致。这就是数字人文里很常见的“字形结构量化”思路也是本文后面要实现的完整示例。2. 计算机能帮文字学做什么2.1 古文字数字化的现状近些年古文字数字化发展很快。甲骨文、金文、简帛文字都建立了各种数据库和字形库研究者可以在线检索字形、辞例和文献出处。对程序员来说这意味着大量字形图像、结构化标注数据可以被下载、处理和分析。常见的切入点有三类第一类是编码和检索。汉字在计算机里有 Unicode、GBK 等编码方案甲骨文也有专门的编码提案和字形数据。处理编码问题本身就是一个技术任务。第二类是图像处理。甲骨文拓片往往有噪声、裂纹和残损需要用灰度化、二值化、去噪、形态学运算等方法提取笔画再做形状匹配或分类。第三类是机器学习和数据挖掘。当字形数据足够多时可以用卷积神经网络做甲骨文单字识别用聚类算法研究字形变体或者用知识图谱把“字形、读音、释义、辞例、出处”组织起来。本文属于第二类的入门演示但不会直接处理真实拓片而是先用一个可复现的点阵模型把“册”字的结构特征做出来再用代码检验理论描述是否成立。2.2 一条可执行的验证思路传统文字学对“册”的描述是“一长一短中有二编”。要验证这个描述可以按下面四步来做第一步把字形转成二值网格。黑色笔画记作 1白色背景记作 0。第二步按列扫描统计每一列里连续出现 1 的段落段落长度超过阈值的就认为是简札。第三步按行扫描统计每一行里连续出现 1 的跨度跨度超过阈值的就认为是编绳。第四步统计简札数量和编绳数量对比文字学描述。这个思路的本质是“投影法”。它简单、直观也很适合做入门示例。真实拓片会有断裂和噪声效果会打折扣但在可控的模型数据上它能完整展示从字形假设到代码验证的闭环。2.3 本文涉及的技术边界需要提前说明这篇文章不会训练神经网络也不会对真实甲骨拓片做高精度识别。我选择的是最简单、最稳定的二值点阵分析方案。这样做有三个好处一是零基础也能看懂。不需要安装 TensorFlow 或 PyTorch。二是在本地可完整复现。只要安装 Python 和 Pillow就能跑出全部结果。三是避免“纸上学来终觉浅”的问题。很多人看过甲骨文图片后依然不知道“册”字为什么像简册亲手用代码把笔画结构拆出来之后印象会深得多。如果你想用这套方法处理真实拓片只需要把“读点阵”换成“读图片”后续预处理思路是相通的。3. 环境准备与基础知识3.1 Python 环境与依赖安装本文示例使用 Python 3 编写理论上 Python 3.8 及以上版本都可以运行。主要用到的第三方库是 Pillow用于把点阵模型渲染成 PNG 图片。如果你只想做编码查询和行列扫描甚至可以不安装任何第三方库。安装 Pillow 的命令如下pip install pillow如果下载速度比较慢可以选择国内镜像源pip install pillow -i https://pypi.tuna.tsinghua.edu.cn/simple安装完成后可以执行下面的命令确认版本python -c import PIL; print(PIL.__version__)看到类似10.0.0的版本号输出就说明环境没问题。需要提醒的是Pillow 版本不同部分 API 可能有细微差异但本文用到的Image.new()、img.load()、img.save()都是长期稳定的接口。3.2 汉字编码基础在计算机里每个字符都有一个编号最通用的编号体系是 Unicode。以“册”字为例它的 Unicode 码点是 U518C。计算机存储和传输文本时又需要把码点转换成字节序列常见方案包括 UTF-8、UTF-16、GBK 等。UTF-8 是互联网最常用的编码一个汉字通常占 3 个字节GBK 是中文环境常见的编码一个汉字通常占 2 个字节。理解这些概念对后续处理中文文本、数据库存储、接口返回值都很重要。3.3 图像与点阵的基本概念本文说的“点阵”就是把一张二值图像抽象成一个二维数组。数组的行对应图片的横向列对应图片的纵向元素 1 表示黑色笔画元素 0 表示白色背景。例如下面这个 3 行 5 列的点阵0 0 1 0 0 0 0 1 0 0 1 1 1 1 1它其实表示一个“T”形笔画。计算机不能像人一样直接“看懂”图片它看到的只是这样的数值网格。所谓图像处理就是对这些数值做各种统计和变换。本文的检测算法也建立在这个基础上先构造点阵再按列和按行扫描数值。4. 第一步在计算机里定位“册”字4.1 查看“册”的 Unicode 与编码字节先来看一个最简单的 Python 脚本它负责查询“册”字在计算机里的编码身份。虽然这个步骤不涉及字形分析但能帮你建立“文字本身也是数据”的直觉。# file: ce_encoding.py ch 册 print(字符, ch) print(Unicode 码点U%04X % ord(ch)) print(UTF-8 编码, ch.encode(utf-8)) print(GBK 编码, ch.encode(gbk)) print(码点十进制, ord(ch))在这段代码中ord()返回字符的 Unicode 码点encode()把字符编码成指定格式的字节串。运行后你会看到类似下面的结果字符 册 Unicode 码点U518C UTF-8 编码 b\xe5\x86\x8c GBK 编码 b\xb2\xe1 码点十进制 20876需要注意不同 Python 环境、不同版本的编码表可能会导致 GBK 输出字节略有差异但 UTF-8 的结果是稳定的。如果你的控制台显示为b\xe5\x86\x8c说明“册”字在 UTF-8 下被编码成了 3 个字节这与前面说的汉字 UTF-8 占用 3 字节规则完全一致。4.2 编码信息说明了什么“册”字在 Unicode 中的码点是 U518C这个码点属于 CJK 统一表意文字区。所谓 CJK是指中国、日本、韩国、越南等地使用的汉字字符集。这说明现代计算机里的“册”字和甲骨文里的“册”字虽然跨越了三千年但在文字序列上是一脉相承的。从工程角度看了解这些编码信息有助于解决实际问题。比如当你从数据库读取中文数据出现乱码或者调用第三方接口返回\u518c这样的字符串时你就知道\u518c就是“册”字。对古文字数字化项目来说编码问题更是基础中的基础因为甲骨文、金文等古文字往往需要专门的字体和码位支持处理不好就是一堆乱码。5. 第二步把“册”的字形结构变成数据5.1 模型设计一长一短、中有二编现在我们进入核心环节把《说文解字》里“象其札一长一短中有二编之形”的描述转成一个可控的点阵模型。我建一个 16 行、20 列的二值网格用来表示简化的“册”字示意图形。设计规则如下4 根竖直笔画代表简札其中两根较长、两根较短。2 道横向长笔画代表编绳横跨整个字形。需要说明的是真实甲骨文中的“册”字形并不只有这一种有的简札数量更多有的编绳只有一道有的线条弯曲。这里构造的是一个理想化的示意模型目的是让代码检测结果能够和文献描述一一对应。5.2 用点阵数据构造字形下面代码负责生成这个点阵。先把网格全部填充为 0然后按坐标把对应位置设为 1。# file: ce_shape_model.py H, W 16, 20 grid [[0] * W for _ in range(H)] # 简札两根长、两根短 for r in range(2, 14): grid[r][3] 1 for r in range(4, 12): grid[r][7] 1 for r in range(4, 12): grid[r][11] 1 for r in range(2, 14): grid[r][16] 1 # 编绳两道横向贯穿线 for c in range(1, 19): grid[5][c] 1 grid[10][c] 1这段代码里range(2, 14)表示从第 2 行到第 13 行共 12 行range(4, 12)表示从第 4 行到第 11 行共 8 行。所以最后检测出来简札长度应该分别是 12 和 8刚好形成“一长一短”的区别。编绳放在第 5 行和第 10 行对应“中有二编”。你可以用一个简单的循环把它打印出来看看效果for row in grid: print(.join(█ if x 1 else · for x in row))打印结果大致是一个上下、左右对称的结构中间两根短竖两侧两根长竖两道横线穿过所有竖线。虽然这是理想化图形但它的结构特征已经非常接近“册”字的造字意图。5.3 简札数量与编绳数量检测点阵生成好之后就要用算法自动统计结构特征。检测简札的思路是按列扫描如果某一列里连续出现多个 1说明这一列存在一条竖直笔画连续长度超过阈值就记为一根简札。检测编绳的思路是按行扫描如果某一行里连续出现多个 1说明这一行存在一条横向笔画连续跨度超过阈值就记为一道编绳。对应的检测函数如下def detect_vertical_bars(graph, min_len3): rows len(graph) cols len(graph[0]) bars [] for c in range(cols): length 0 for r in range(rows): if graph[r][c] 1: length 1 else: if length min_len: bars.append((c, length)) length 0 if length min_len: bars.append((c, length)) return bars def detect_horizontal_bands(graph, min_span5): rows len(graph) cols len(graph[0]) bands [] for r in range(rows): span 0 for c in range(cols): if graph[r][c] 1: span 1 else: if span min_span: bands.append((r, span)) span 0 if span min_span: bands.append((r, span)) return bandsmin_len和min_span是阈值参数。真实图像中笔画可能断裂阈值设得越小越容易把噪声看成笔画设得越大越容易漏掉真实笔画。后续处理真实图片时这两个参数需要反复调整。6. 完整实战从点阵到 PNG 再到检测结果6.1 完整脚本把生成点阵、渲染图片和结构检测三个步骤整合到一起就得到一个完整的实战脚本。建议保存在同一个目录下文件名叫ce_analysis.py。# file: ce_analysis.py from PIL import Image # 1. 构造简化“册”字点阵 H, W 16, 20 grid [[0] * W for _ in range(H)] # 简札两根长、两根短 for r in range(2, 14): grid[r][3] 1 for r in range(4, 12): grid[r][7] 1 for r in range(4, 12): grid[r][11] 1 for r in range(2, 14): grid[r][16] 1 # 编绳两道横向贯穿线 for c in range(1, 19): grid[5][c] 1 grid[10][c] 1 # 2. 把点阵渲染成 PNG 图片 scale 20 img Image.new(L, (W * scale, H * scale), 255) pixels img.load() for r in range(H): for c in range(W): if grid[r][c] 1: for dr in range(scale): for dc in range(scale): pixels[c * scale dc, r * scale dr] 0 img.save(ce_model.png) print(已生成图片 ce_model.png尺寸, img.size) # 3. 检测竖直简札 def detect_vertical_bars(graph, min_len3): rows len(graph) cols len(graph[0]) bars [] for c in range(cols): length 0 for r in range(rows): if graph[r][c] 1: length 1 else: if length min_len: bars.append((c, length)) length 0 if length min_len: bars.append((c, length)) return bars # 4. 检测横向编绳 def detect_horizontal_bands(graph, min_span5): rows len(graph) cols len(graph[0]) bands [] for r in range(rows): span 0 for c in range(cols): if graph[r][c] 1: span 1 else: if span min_span: bands.append((r, span)) span 0 if span min_span: bands.append((r, span)) return bands # 5. 输出结果 bars detect_vertical_bars(grid) bands detect_horizontal_bands(grid) print(检测到的竖直简札数量, len(bars)) for col, length in bars: print(f 列 {col}长度 {length}) print(检测到的横向编绳数量, len(bands)) for row, span in bands: print(f 行 {row}跨度 {span})6.2 运行与预期输出在终端里执行下面的命令python ce_analysis.py预期输出如下已生成图片 ce_model.png尺寸 (400, 320) 检测到的竖直简札数量 4 列 3长度 12 列 7长度 8 列 11长度 8 列 16长度 12 检测到的横向编绳数量 2 行 5跨度 18 行 10跨度 18图片尺寸 400×320 是因为点阵宽 20 列、高 16 行放大 20 倍得到 20×20400 和 16×20320。如果你的输出出现类似结果说明整条流程没有问题。6.3 结果与文字学描述对照把检测结果和《说文解字》的描述放在一起会发现对应关系非常清楚文字学描述检测结果象其札一长一短4 根简札长度分别为 12 和 8中有二编之形检测到 2 道横向编绳跨度 18整体像编简成册竖直笔画被横向笔画贯穿这说明“册”字的造字意图确实可以用“编连简札”来解释。回到标题的问题甲骨文“册”字究竟是不是古代竹简的形状答案是可以这么说。更严谨的说法是它像“简册/简牍编连之形”也就是把一根一根简札编起来的那个整体状态。必须强调这只是一个示意模型的验证不构成对真实甲骨文“册”字全部字形的完整统计。真实字形中存在简札数量更多、编绳只有一道、笔画断裂或弯曲等变体需要拿真实资料继续做统计分析。7. 常见问题与排查思路在实际运行或扩展本项目时你可能会遇到下面几类问题这里给出排查方向。问题现象常见原因解决思路提示ModuleNotFoundError: No module named PIL没有安装 Pillow执行pip install pillow中文输出乱码控制台编码不是 UTF-8Windows 下执行set PYTHONIOENCODINGutf-8检测到的简札数量偏多阈值min_len太小噪声被当成笔画调大min_len例如改为 5检测不到编绳横线断裂或者min_span过大先做形态学闭运算再调小min_span把横向笔画当成简札转置问题或预处理不充分检查行列方向是否理解反了真实拓片效果很差噪声、裂纹、残损、反色先做灰度化、去噪、二值化再人工标注局部区域测试关于真实甲骨文拓片还有一个容易踩的坑拓片通常是白字黑底或黑字白底没有统一标准。直接套用本文点阵逻辑前必须先确定“哪部分是笔画、哪部分是背景”必要时还要对图像做旋转校正和裁剪。8. 最佳实践与工程建议8.1 古文字数字化项目建议如果你想把这类示例扩展到真实项目建议在工程层面做好三件事。第一数据建模要规范化。可以设计一张“字形表”字段包括字形编号、字形图片路径、所属字头、时期、出处、备注再设计一张“字头表”保存该字的楷书字形、读音、释义和异体关系。这样后续检索和统计都方便。第二要记录算法参数和处理版本。图像处理非常依赖参数比如二值化阈值、形态学核大小、连通域面积阈值。同一个字参数不同结果可能完全不同。建议把处理脚本、参数配置和运行时间一起记录下来保证结果可复现。第三遵守数据来源的使用协议。公开的甲骨文数据库和字形网站有自己的版权和使用条款不要批量抓取受保护的接口不要未注明出处就大段复制资料。规范的引用和授权是数字人文项目长期发展的基础。8.2 图像分析的正确姿势真实甲骨文图像不是干净的点阵直接做列扫描很容易得到错误结果。比较稳妥的处理流程是首先做灰度化把彩色拓片变成单通道图像。接着做去噪用中值滤波或者高斯模糊去掉细碎噪声。然后做二值化把图像变成 0 和 1 两个值。再之后做形态学闭运算把断裂的笔画接起来。最后再做行列投影统计效果会好很多。如果字形存在倾斜还需要先做旋转校正。旋转角度可以用最小外接矩形估算也可以用霍夫变换检测长直线。这一步不是必须的但对最终统计结果影响很大。8.3 学术结论的边界程序员容易犯的一个错是看到代码输出了“4 根简札、2 道编绳”就认为计算机证明了“册”字是竹简形状。实际上计算机只是完成了“特征提取”并没有完成“历史判断”。“册”字为什么造得像简册还需要结合商代书写制度、简牍实物发现、文献记载等多方面的证据。代码结果可以作为辅助材料但不能替代专家判断。反过来看文字研究者如果能掌握一点图像处理和数据分析技能也能在字形排比和变体统计中节省大量时间。数字人文的价值正在于让两种思维方式互相补充。9. 总结与下一步探索本文从“册”字是不是竹简形状这个问题出发介绍了相关文字学背景并用 Python 完成了一个简化的字形结构验证。你掌握的并不是一个复杂的识别模型而是一条完整的研究思路提出字形假说、把特征转化成数据、用算法做统计、再和文献描述对照。下一步可以尝试三个方向。第一去做“典”字分析。甲骨文“典”字像双手捧册或册放在几案上可以继续用同样的点阵思路拆解。第二把本文的检测函数换成 OpenCV 实现结合形态学运算直接处理真实字形图片。第三收集几十个“册”字的不同甲骨文字形统计简札数量和编绳数量的分布写一个小规模的量化分析报告。这类小项目最大的价值不是立刻得到学术结论而是帮你建立从“字形直觉”到“数据验证”的完整感觉。下次再看到甲骨文图片时你至少不会觉得它只是一堆神秘线条而是能意识到每个笔画背后都是一种可以被观察、被记录、被分析的古人的造字逻辑。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Moviepy批量调整视频帧率 2026/9/28 2:14:19

Moviepy批量调整视频帧率

在多源视频的整合项目中,经常会遇到视频帧率不一致的问题。这种帧率差异不仅会影响视频的播放流畅性,还会造成拼接后视频不同步或卡顿的情况。为了解决这一问题,MoviePy作为一个强大的Python视频编辑库,可以通过简洁的代码轻松实现批量帧率调整。 本文将详细讲解如何利用M…

阅读更多 →
MoviePy批量创建视频幻灯片 2026/9/28 2:14:19

MoviePy批量创建视频幻灯片

在数字内容创作中,视频幻灯片是一种高效且富有表现力的展示方式,广泛应用于个人纪念、商业推广和教育培训等领域。利用Python中的MoviePy库,可以简便地将一系列静态图片转换成动态视频,并通过添加背景音乐和流畅的过渡效果,显著提升视觉体验。 本教程旨在指导自学编程的学…

阅读更多 →
使用NoneBot2可视化平台搭建QQ聊天机器人:本地和云部署教程 2026/9/28 2:14:19

使用NoneBot2可视化平台搭建QQ聊天机器人:本地和云部署教程

NoneBot是一个基于Python 3.8+的异步、开源和可扩展的框架,用于构建和运行聊天机器人,支持各种聊天平台,如Telegram,Discord和WeChat。它是基于nonebot库构建的,提供了一个易于使用的界面,用于创建聊天机器人插件和处理消息。它允许开发人员轻松创建自定义插件和命令,并…

阅读更多 →
一个简单的python文件上传下载web服务器 2026/9/28 2:14:19

一个简单的python文件上传下载web服务器

临时使用网络通过http传输文件非常的方便。默认共享当前文件夹,也可在启动时指定共享的文件夹。也可上传文件。python win32/64 3.6/3.7测试通过。运行后会提示本机ip,在同一局域网下在浏览器内输入网址即可。如果本机有外网ip,一样可用。使用…

阅读更多 →
拳皇97大门bug震笔记 2026/9/28 2:14:19

拳皇97大门bug震笔记

文章目录bug震原理不同bug震的时机把握出招帧数天地返起身帧数分组破解bug震之前发过拳皇97人物整体笔记。因为大门涉及bug震,内容比较多,单独整理下。bug震原理 人物倒地后,起身第一帧是站立状态,而地震雷需要下蹲(并不需要蹲防…

阅读更多 →
真实废弃物图像分类:4800张标注数据实战与避坑指南 2026/9/28 2:14:13

真实废弃物图像分类:4800张标注数据实战与避坑指南

简介:这份生活中真实废弃物图像分类数据集面向计算机视觉初学者与图像分类、分割方向的算法实践者,用于解决垃圾分类场景下真实样本获取难、标注成本高的问题。数据已完成预处理,可直接作为分类网络输入,覆盖纸板、食品有机物、玻…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉