如何用古汉语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)衡量字与字的结合紧密度,再用左右邻接熵判断词汇在上下文中的独立性,全程无监督,不依赖任何标注数据。
把《庄子》全文喂给它,它会自动吐出一张结构化词表:
| Word | Frequency | PMI | R_Entropy | L_Entropy |
|---|---|---|---|---|
| 天下 | 280 | 195.2 | 5.16 | 5.25 |
| 万物 | 94 | 377.6 | 4.60 | 4.54 |
| 仁义 | 58 | 882.3 | 3.50 | 4.97 |
| 老聃 | 45 | 2281.2 | 2.38 | 2.43 |
注意"老聃"这类专有名词也被自动抓了出来,说明 PMI+熵 这套组合拳在文言语料上相当有效。生成的 CSV 词表还可以反过来配合分词模块使用,形成"造词→分词"的闭环。
最难啃的骨头:无标点长文的断句与标点
没有句读的古文,对现代模型是巨大的挑战——词与词、句与句之间没有任何显式边界。甲言把这一环拆成了两步:
- 断句:基于字符级条件随机场(CRF)的序列标注,把"这一处是否该断"当作二分类问题,并额外引入 PMI 与 t-检验值作为特征,捕捉字对之间的黏合强度。
- 标点:在断句结果之上,再用层叠式 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 个坑
- 漏装 kenlm:
pip install jiayan装完直接跑会报ImportError。先装好 kenlm 再加载.klm模型,顺序不能反。 - 模型路径对不上:
load_lm('jiayan.klm')用的是相对路径,务必把模型解压到当前工作目录,或改成你的绝对路径,否则直接FileNotFoundError。 - 处理繁体文本:受训练语料限制,甲言目前不支持繁体中文。先用 OpenCC 把繁体转成简体,处理完再转回去。
- 超长文本一次性硬塞:断句、标点模块对超长输入不友好。建议把长篇古籍按段落分批处理(每批控制在几千字内),再拼接结果。
- 两种分词器混着用:
CharHMMTokenizer需要加载jiayan.klm;WordNgramTokenizer不需要模型但颗粒度更粗。想追求效果用前者,只想快速试用用后者,别期待它们输出完全一致。
回到开篇:让古籍研究回到它本来的样子
还记得深夜灯光下的那本《庄子》吗?有了甲言,你可以把机械的断句、标点、分词交给它,把省下来的时间留给真正重要的问题——这句话为什么这么说?这个思想如何演变?两千年前的文字,终于可以以它本来的样子,被高效地阅读、检索和分析。
下一步行动很简单:克隆仓库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),仅供参考