跟着一位古籍研究员过一天:甲言Jiayan把文言文处理变成顺手的活儿
跟着一位古籍研究员过一天甲言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工具包分词、词性标注、断句、标点、词库构建五样活儿都能搭把手文言文处理从苦差变成了小事。咱们就跟着他走完这一天看看每个环节它到底使了什么劲。早晨八点无标点的古籍在等着点灯馆藏室新到了一批民国抄本扫出来是一段连着一个段的文字没有句读、没有标点。老周过去的做法是逐字琢磨文意拿铅笔先断句再誊抄一天下来也整理不了几页。用他的话说这就好比在黑黢黢的长廊里一盏一盏挂灯笼辛苦不说挂错位置还容易闹笑话。甲言替他把这个活儿拆成了两步先用断句模型cut_model判断哪里该停、哪里该顿再用标点模型punc_model决定这个位置该放逗号、句号还是感叹号两层都是基于条件随机场CRF的序列标注。项目公布的数据里断句的 F1 值达到 89.7%标点准确率 87.2%。老周现在拿到一段原文直接丢给工具先跑一遍剩下的工作就是复核和微调from jiayan import load_lm, CRFPunctuator lm load_lm(jiayan.klm) punctuator CRFPunctuator(lm, cut_model) punctuator.load(punc_model) text 天下大乱贤圣不明道德不一天下多得一察焉以自好 print(punctuator.punctuate(text)) # 输出天下大乱贤圣不明道德不一天下多得一察焉以自好上午十点备课时想让古文自己拆开给你看下午有课老周想把一段《庄子》做成课件给学生展示词与词之间的关系。这一步要的是分词——说白了就是给连成一片的古文做一次精细切割。难点在于通用工具几乎都是用现代汉语语料喂大的碰上文言往往切得离谱比如把内圣外王硬生生劈成内/圣/外/王课堂上学生憋不住笑老师也尴尬。甲言的做法是拿古汉语语料训练的语言模型打底再用字符级隐马尔可夫模型HMM找每个字在词里的位置测过分词准确率能到 92.3%。同样是那句话它给出的是内圣外王抱成一团的结果和语感对得上from jiayan import load_lm, CharHMMTokenizer lm load_lm(jiayan.klm) tokenizer CharHMMTokenizer(lm) print(list(tokenizer.tokenize(是故内圣外王之道暗而不明郁而不发))) # 输出[是, 故, 内圣外王, 之, 道, , 暗, 而, 不, 明, , ...]如果手头有自己整理过的词典也可以换用词级的 N-gram 最大概率路径分词器颗粒度另有一番味道。下午三点学生拿着词性问题来砸场子课后有个学生追出来问老师焉字在这里到底算什么词性这类问题最考验功底因为文言里的虚词、助词、语气词在现代汉语的标注体系里几乎没有位置。甲言的词性标注系统是专门给古汉语设计的基于词的 CRF 序列标注自测准确率 88.5%背后有一整套适配文言习惯的词性表。打个比方它像给每个词贴一张身份牌名词、动词、代词、语气词各归其位from jiayan import CRFPOSTagger tagger CRFPOSTagger() tagger.load(pos_model) words [天下, 大乱, , 贤圣, 不, 明] print(tagger.postag(words)) # 输出[n, a, wp, n, d, a]要是觉得自带词性表不合胃口也可以拿自己的标注语料重新训练一遍训练和评估的接口在示例代码里都给你留好了。傍晚时分历时研究需要一个专属词库傍晚是安静做研究的时间。老周最近在统计战国文献里的高频词想看看天下圣人仁义这些词在不同著作里的分布。问题来了手头没有现成的文言词库总不能靠眼睛一个个去捡。甲言的词库构建功能就是为这个准备的。它用无监督的方式干活双字典树先扫出所有候选组合点互信息PMI衡量两个字粘得紧不紧左右邻接熵再判断这个候选词是不是真的独立存在。整个过程像一台自动拾珠机在古籍的沙堆里把成色好的词一粒粒挑出来from jiayan import PMIEntropyLexiconConstructor constructor PMIEntropyLexiconConstructor() lexicon constructor.construct_lexicon(庄子.txt) constructor.save(lexicon, 庄子词库.csv)跑完一趟输出里词频、PMI 值、左右熵列得清清楚楚天下圣人万物老聃这些词自己就浮出水面直接能当自定义词典用。晚上把这一天的工具装进自己的电脑老周这一天用的东西你也花不了十分钟就能配齐拢共三步。第一步两条命令装好环境git clone https://gitcode.com/gh_mirrors/ji/Jiayan cd Jiayan pip install jiayan pip install kenlm这里要特别提一句kenlm 是加载语言模型必需的依赖少了它后面几个功能都转不起来别漏了。第二步备齐四份模型文件从项目 README 里给出的地址下载模型并解压放在代码旁边就行jiayan.klm语言模型分词和断句标点的特征提取都靠它cut_model断句模型punc_model标点模型pos_model词性标注模型第三步跑通你的第一个示例仓库里的jiayan/examples.py把五个功能的调用方式都写好了分词、断句、标点、词性标注、词库构建一个文件全包含照着改改路径就能运行。先把上面那段分词代码跑通成就感就来了。让结果更准的几个小习惯用得久了老周总结了几条让效果更好的经验顺手分享给你想提升某个领域的准确率就给它喂自定义词典。WordNgramTokenizer(dict_f你的词典.txt)文件每行写词,词频即可更省事的办法是先跑一遍词库构建拿生成的结果当词典。长文本先预处理。jiayan.utils.process_line能统一中英文标点、剔掉无关字符减少干扰。超长古籍记得分批处理单段控制在 5000 字以内内存更省、跑起来也更稳。当前模型以简体为主手头的繁体文本建议先用 OpenCC 之类工具转成简体再处理完事再转回去。收工之前再说两句一天下来你会发现甲言没有哪一步是放那儿就不用管了但它把最耗体力的环节——逐字断句、手工切词、人工建词库——都变成了几行代码的事。完整的调用示例在jiayan/examples.py词性表说明在jiayan/postagger/README.md模型下载地址和更多细节都在仓库的 README 里。改天有空不妨像老周一样拿《庄子》全文跑一遍词库构建看看那些熟悉的词是怎么被一台机器一粒粒捡出来的——古汉语数字化这扇门其实比你想象中好推开得多。【免费下载链接】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),仅供参考
