示例程序
znlp-examples 模块有 4 个示例类,都在 dev.znlp.examples 包下,可以用 Gradle 直接运行。
# 默认运行 CwsPerceptronExample./gradlew :znlp-examples:run
# 指定其他示例./gradlew :znlp-examples:run -PmainClass=examples.dev.znlp.DefaultSegmenterExample./gradlew :znlp-examples:run -PmainClass=examples.dev.znlp.DucklingExample./gradlew :znlp-examples:run -PmainClass=examples.dev.znlp.FastTextExample机制说明(znlp-examples/build.gradle.kts):模块应用了 application 插件,mainClass 取自 Gradle 属性 -PmainClass=...,缺省值是 examples.dev.znlp.CwsPerceptronExample。run 任务的 maxHeapSize 是 2 GB。
CwsPerceptronExample
Section titled “CwsPerceptronExample”默认示例。 独立运行 CWS 感知机分词,不走流水线:
CwsPerceptron cws = Znlp.getService(CwsPerceptron.class);List<String> words = cws.split(text);适合用来对比感知机分词与词典分词的效果差异。因为它绕过了 PipelineSegmenter,所以没有词性、人名、NER,也没有二元语法的影响——是观察纯统计模型行为的最干净入口。
相关文档:感知机框架
DefaultSegmenterExample
Section titled “DefaultSegmenterExample”演示三种分词形态的对比:
| 内容 | 代码 |
|---|---|
| 默认分词(词典 + 二元 + 人名 + POS) | Znlp.segment(text) |
| 标准配方追加 NER | SegmentRecipe.standard().withNer().build() |
| Duckling 结构化解析 | Znlp.parse(text) |
这是最贴近实际使用的示例,能直观看到 Token 的词性输出、NER 命中情况,以及 Duckling 与分词是两条独立的路。
DucklingExample
Section titled “DucklingExample”覆盖 Duckling 的全部已注册维度:数字、序数、金额、时间、百分比、距离、温度、年龄、电话、时长。
LocalDateTime clock = LocalDateTime.of(2019, 11, 11, 0, 0);for (Dimension d : Znlp.parse(text, clock)) { System.out.println(d.getKind() + " " + d.getText() + " [" + d.getStart() + "," + d.getEnd() + "]");}注意 getStart() / getEnd() 是闭区间。另外 DimensionKind 里虽然有 Email 和 Url,但没有对应 grammar,示例中也不会出现这两类。
相关文档:Duckling 结构化解析
FastTextExample
Section titled “FastTextExample”演示文本分类的完整往返:
| 步骤 | API |
|---|---|
| 监督训练 | FastText.trainSupervised(file, args) |
| top-k 预测 | model.predict(tokens, k, threshold) |
| 全部标签预测 | model.predict(tokens, Model.kUnlimitedPredictions, threshold) |
| 评估 P@1 / R@1 | model.test(file, 1, threshold, print) |
| 模型落盘与加载 | model.saveModel(file) / FastText.loadModel(file) |
saveModel 产出的是 Facebook fastText v0.9.2 兼容的 .bin(非量化),可以被官方 CLI 读取;反过来官方训练的 .bin 也能被 loadModel 读入,但 .ftz 量化模型不支持。
相关文档:FastText 文本分类
在你的项目里复现这些示例,最小依赖是主库加资源 jar:
import dev.znlp.Znlp;import segment.dev.znlp.Token;
public class Demo { public static void main(String[] args) { for (Token t : Znlp.segment("中国科学院计算技术研究所位于北京市")) { System.out.println(t.word + "/" + t.getNature()); } }}如果抛 ResourceNotFoundException,先确认 znlp-resources 在运行时 classpath 上——主库对它是 runtimeOnly 依赖,不会传递给你的项目。异常消息里会自动生成应该补的 Maven / Gradle 依赖片段。