跳转到内容

中文自然语言处理

znlp

纯 Java 的模块化中文 NLP 工具包。分词、词性、实体和拼音按需组合,也可以完全离线运行。

Znlp.segment()

输入

自然语言处理技术是人工智能的重要领域

输出

  • 自然a
  • 语言n
  • 处理v
  • 技术n
  • 是v
  • 人工智能n
  • 的u
  • 重要a
  • 领域n

标准配方 · 词典与二元语法 · 带词性

分词、标注、拼音和结构化解析可以单独调用。要换切分路径时,用配方把阶段拼起来。

可组合的分词配方

词典与二元语法是默认路径。需要时再接上感知机分词或用户词典。 中文分词

感知机统一框架

分词、词性、实体、人名和拼音切分共用一套模型,可以用自己的语料替换。 感知机框架

结构化解析

抽出数字、金额、时间和电话。相对时间按给定的参考时间归一。 Duckling

拼音与繁简

全拼、首字母、音节切分,以及简体和繁体的双向转换。 拼音

新词发现与高亮

用互信息和信息熵找新词。搜索结果可以按拼音或模糊匹配标红。 新词发现

离线也能部署

配置和组件生命周期集中管理。资源可以自动下载,也可以完全离线分发。 配置与数据目录

快速上手

几行代码就能分词

Znlp 静态门面覆盖绝大多数场景——分词、拼音、繁简转换、结构化解析,全部通过静态方法完成,不需要接触 ZnlpSystem 的生命周期。

需要感知机分词、用户词典或 NER 时,再用 SegmentRecipe 按阶段拼装出想要的 WordSegmenter。

首次运行会把词典与模型解析成 data/cache/ 缓存(二元语法表约 40 MB),之后启动直接读缓存,缓存目录可配置。

import dev.znlp.Znlp;
import segment.dev.znlp.Token;
String text = "自然语言处理技术是人工智能的重要领域";
List<Token> tokens = Znlp.segment(text);
for (Token token : tokens) {
System.out.println(token); // 输出 word/nature
}

核心能力

分阶段的分词流水线

  • 默认配方 standard():核心词典与候选来源铺候选,二元语法做 Viterbi 选路,再叠人名识别与词性标注,每个阶段都可以独立开关。
  • 只要切词和吞吐用 dictionary();要用统计模型分词用 perceptron()——线性路径,不跑二元语法。
  • 用户词典和纠错词典都在选路之后合并,不参与 Viterbi;纠错词典优先级更高。
ZapNLP 分词流水线:词典配方与感知机配方两条路径SegmentRecipe.standard()输入文本字符串 · char[]候选铺图核心词典 · 规则Viterbi 选路二元语法人名 · 词性可独立开关Token 流流式 · 列表SegmentRecipe.perceptron()输入文本字符串 · char[]CWS 边界判定感知机原子补洞Token 流流式 · 列表线性路径:不跑二元语法,也不经 Viterbi 选路用户词典:选路后合并纠错词典:优先级更高indexTerms():附索引子词build() 一次,PipelineSegmenter 线程安全,可作单例全局复用

可训练的模型层

一套感知机框架,五个任务

  • 中文分词、词性标注、命名实体、人名识别、拼音音节切分,都建立在同一套感知机框架上(dev.znlp.perceptron)。
  • 实现 PerceptronInstance 即可接入自己的语料(字符级任务继承 CharBasedPerceptronInstance),交给 PerceptronTrainer 训练。
  • 训练产物可以压缩、落盘,或转成运行时模型;PosPerceptron.train 是最清晰的完整范例。
一套感知机框架支撑五个任务:分词、词性、命名实体、人名、拼音音节切分感知机框架org.zaprt.nlp.perceptron中文分词 CWS词性标注 POS命名实体 NER人名识别拼音音节切分五个任务共用同一套框架,可以用自己的语料训练替换默认模型字符级任务直接继承 CharBasedPerceptronInstance

从缓存目录到离线部署,上生产前要确认的几件事:

JDK 17 及以上,没有强制的运行时依赖,词典和模型可以随应用离线分发。