news 2026/8/19 19:16:30

如何用古汉语NLP工具甲言Jiayan,把无标点古籍分词、断句、标点一次搞定

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何用古汉语NLP工具甲言Jiayan,把无标点古籍分词、断句、标点一次搞定

如何用古汉语NLP工具甲言Jiayan,把无标点古籍分词、断句、标点一次搞定

【免费下载链接】Jiayan甲言,专注于古代汉语(古汉语/古文/文言文/文言)处理的NLP工具包,支持文言词库构建、分词、词性标注、断句和标点。Jiayan, the 1st NLP toolkit designed for Classical Chinese, supports lexicon construction, tokenizing, POS tagging, sentence segmentation and punctuation.项目地址: https://gitcode.com/gh_mirrors/ji/Jiayan

深夜十一点,古籍整理室的灯还亮着。你面前摊着一本没有标点的《庄子》校勘稿,数千汉字像一条没有出口的长河,从"天下大乱"一路流到"道术将为天下裂"。要断句、要标点、要分词、要标注词性——这套流程走完,一本书耗上几个星期是常事。如果有位"文言文老学究"能替你干完这些粗活呢?甲言Jiayan,一个专为古代汉语设计的古汉语NLP工具包,正是为这个场景而生的。

为什么值得你花十分钟了解它?通用汉语NLP工具几乎都以现代汉语为训练语料,遇到"内圣外王之道"这类句子就开始犯迷糊;而甲言从设计之初就只做一件事——处理文言文。它用词库构建、分词、词性标注、断句、标点五个模块,把古籍数字化的整条流水线全部包圆。换句话说:读文言文这件事,从人力苦工变成了一行 Python 代码。

先解决"切哪里":古汉语自动分词的两套算法

分词是所有下游任务的起点,没有它就没有词频统计和语义分析。甲言内置了两套方案:

  • 字符级 HMM 分词器CharHMMTokenizer):加载 kenlm 语言模型,把"某个字是词的哪个位置"当作序列标注问题,用维特比算法求解最优路径。效果最贴合文言语感,官方推荐优先使用。
  • 词级 N-gram 分词器WordNgramTokenizer):基于有向无环词图与最大概率路径,颗粒度较粗,但胜在不需要额外下载语言模型。

同一个句子,三家工具的表现天差地别。输入"是故内圣外王之道,暗而不明,郁而不发",通用工具给出的结果是是故/内/圣/外/王之道故内/圣外王/暗而不明,而甲言输出的是干净的内圣外王 / 之 / 道 / 暗 / 而 / 不 / 明。哪个更符合文言语感,一眼便知。

没有文言词典?让工具自己造一个

古籍研究最大的痛点之一,是市面上没有现成的文言词库。甲言干脆把这件事也解决了:位于 jiayan/lexicon/pmi_entropy_constructor.py 的PMIEntropyLexiconConstructor用双字典树统计词频,用点互信息(PMI)衡量字与字的结合紧密度,再用左右邻接熵判断词汇在上下文中的独立性,全程无监督,不依赖任何标注数据。

把《庄子》全文喂给它,它会自动吐出一张结构化词表:

WordFrequencyPMIR_EntropyL_Entropy
天下280195.25.165.25
万物94377.64.604.54
仁义58882.33.504.97
老聃452281.22.382.43

注意"老聃"这类专有名词也被自动抓了出来,说明 PMI+熵 这套组合拳在文言语料上相当有效。生成的 CSV 词表还可以反过来配合分词模块使用,形成"造词→分词"的闭环。

最难啃的骨头:无标点长文的断句与标点

没有句读的古文,对现代模型是巨大的挑战——词与词、句与句之间没有任何显式边界。甲言把这一环拆成了两步:

  1. 断句:基于字符级条件随机场(CRF)的序列标注,把"这一处是否该断"当作二分类问题,并额外引入 PMI 与 t-检验值作为特征,捕捉字对之间的黏合强度。
  2. 标点:在断句结果之上,再用层叠式 CRF 判断该加逗号、句号还是感叹号。

把一段连标点都没有的《庄子·天下》长文丢进去,输出是这样分句的:

天下大乱 → 贤圣不明 → 道德不一 → 天下多得一察焉以自好 → 譬如耳目 → 皆有所明 → ...

再进一步,标点模块直接还给一段"能读"的文本:天下大乱,贤圣不明,道德不一,天下多得一察焉以自好,……悲夫!百家往而不反,必不合矣,……道术将为天下裂。断句准确,"悲夫"这种感叹句也能配上感叹号——这正是古籍研究者最想要的能力。

词性标注:给每个词贴一张"语法身份证"

读懂文言文,光分词还不够,还要知道每个词在句子里扮演什么角色。甲言的CRFPOSTagger(见 jiayan/postagger/crf_pos_tagger.py)使用词级 CRF 进行序列标注,并针对文言文定制了 30 个词性标签:除了常规的名词n、动词v、形容词a,还专门设计了语气助词、时间名词、人名地名等类别。

words = ['天下', '大乱', ',', '贤圣', '不', '明', ',', '道德', '不', '一', ','] postagger = CRFPOSTagger() postagger.load('pos_model') print(postagger.postag(words)) # ['n', 'a', 'wp', 'n', 'd', 'a', 'wp', 'n', 'd', 'm', 'wp']

天下是名词、大乱是形容词、是副词、是数词——标得清清楚楚。完整的词性表定义在 jiayan/postagger/README.md,如果你想做历时词汇研究或语法分析,这张表就是你的参照系。

一次真实对照:同样一句话,谁更懂古文?

项目 README 里记录了一组直观的对比。对"是故内圣外王之道,暗而不明,郁而不发,天下之人各为其所欲焉以自为方":

  • LTP (3.4.0)是 / 故内 / 圣外王 / 之 / 道 / 暗而不明 / ...
  • HanLP是故 / 内 / 圣 / 外 / 王之道 / ...
  • 甲言 HMM是 / 故 / 内圣外王 / 之 / 道 / 暗 / 而 / 不 / 明 / ...

通用工具要么把"故内"硬凑成一个词,要么把"王之道"粘在一起。甲言则把「内圣外王」这个核心概念完整切出,虚词"之""而"单独成词,颗粒度既细又符合语感。作者也坦承:随着 HanLP 2.x 引入大规模预训练模型,通用工具在古文上的表现已有大幅提升——但甲言作为第一个为古汉语定制的 NLP 工具包,其方法论和模块设计至今仍有独特价值。

三分钟上手:跑通你的第一段古文

第一步:安装

pip install jiayan pip install kenlm # 语言模型运行时依赖

注意安装要分两步完成,确保拿到较新的 kenlm 版本;具体说明见项目 README。

第二步:准备模型

从项目 README 提供的网盘链接下载预训练模型并解压,放到你的工作目录。核心是jiayan.klm语言模型(分词、断句、标点都要用到),其余可选:pos_model(词性标注)、cut_model(断句)、punc_model(标点)。

第三步:跑起来

from jiayan import load_lm, CharHMMTokenizer lm = load_lm('jiayan.klm') tokenizer = CharHMMTokenizer(lm) tokens = list(tokenizer.tokenize('是故内圣外王之道,暗而不明,郁而不发')) print(tokens)

完整可复现的示例全部集中在 jiayan/examples.py——词库构建、两种分词、断句、标点、词性标注、模型训练,一个文件看全。从安装到看到第一行输出,三分钟绰绰有余。

避坑锦囊:新手最容易踩的 5 个坑

  1. 漏装 kenlmpip install jiayan装完直接跑会报ImportError。先装好 kenlm 再加载.klm模型,顺序不能反。
  2. 模型路径对不上load_lm('jiayan.klm')用的是相对路径,务必把模型解压到当前工作目录,或改成你的绝对路径,否则直接FileNotFoundError
  3. 处理繁体文本:受训练语料限制,甲言目前不支持繁体中文。先用 OpenCC 把繁体转成简体,处理完再转回去。
  4. 超长文本一次性硬塞:断句、标点模块对超长输入不友好。建议把长篇古籍按段落分批处理(每批控制在几千字内),再拼接结果。
  5. 两种分词器混着用CharHMMTokenizer需要加载jiayan.klmWordNgramTokenizer不需要模型但颗粒度更粗。想追求效果用前者,只想快速试用用后者,别期待它们输出完全一致。

回到开篇:让古籍研究回到它本来的样子

还记得深夜灯光下的那本《庄子》吗?有了甲言,你可以把机械的断句、标点、分词交给它,把省下来的时间留给真正重要的问题——这句话为什么这么说?这个思想如何演变?两千年前的文字,终于可以以它本来的样子,被高效地阅读、检索和分析。

下一步行动很简单:克隆仓库git clone https://gitcode.com/gh_mirrors/ji/Jiayan,或者直接pip install jiayan,再下载模型跑通 jiayan/examples.py。遇到问题就去提 issue,作者和社区都在等你的反馈。

古汉语的数字化,才刚刚开始。而你,完全可以成为第一批把这条路走通的人。

【免费下载链接】Jiayan甲言,专注于古代汉语(古汉语/古文/文言文/文言)处理的NLP工具包,支持文言词库构建、分词、词性标注、断句和标点。Jiayan, the 1st NLP toolkit designed for Classical Chinese, supports lexicon construction, tokenizing, POS tagging, sentence segmentation and punctuation.项目地址: https://gitcode.com/gh_mirrors/ji/Jiayan

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

并发服务选型别只看功能清单

并发服务选型别只看功能清单 “选型别只看功能清单”首先要落到可观察、可回滚的工程动作上。本文从配置、调用链和运行指标三个层面梳理判断方法,重点说明应先收集什么证据、怎样做小范围验证,以及何时应停止扩张改动。 文中数值仅用于说明机制&#xf…

作者头像 李华