基于隐马尔可夫模型(HMM)的中文分词和序列标注工具库
Project description
pynlptool
当前版本: 0.3.1
基于隐马尔可夫模型(HMM)的中文分词与序列标注工具库。
A lightweight HMM-based library for Chinese word segmentation and sequence labeling.
亮点
- 纯Python实现,安装简单
- 内置BMM增强预训练模型,开箱即用
- 支持基线模型与BMM-HMM动态回退推理
- 支持BMES混合标注与自定义训练
- 支持模型保存/加载与离线评估
- 提供Python API与CLI两种使用方式
安装
pip install pynlptool
快速开始
先用 Python 直接上手,再用 CLI 做同样的事情。下面两种方式对应的是同一套输出逻辑,用户可以按自己的使用场景选择其一。
1) Python 直接调用
from pynlptool import cut, tags, pos, both
text = "南京长江大桥是长江上第一座由中国自主设计、自行建造的双层式铁路、公路两用桥梁,是新中国的标志性工程与时代精神象征,被誉为 “争气桥”。"
print(tags(text))
print(cut(text))
print(pos(text))
print(both(text))
cut(text) 返回分词列表,最适合直接在 Python 里继续处理;tags(text)、pos(text)、both(text) 与 CLI 的 -o tags / pos / both 一一对应,返回格式也完全一致。load_model() 适合需要直接操作模型对象的场景。
2) CLI 直接调用
pynlptool "南京市长江大桥"
pynlptool "南京市长江大桥" -o tags
pynlptool "南京市长江大桥" -o cut
pynlptool "南京市长江大桥" -o pos
pynlptool "南京市长江大桥" -o both
如果系统里没有 pynlptool 命令,也可以用:
python -m pynlptool.cli "南京市长江大桥" -o both
Python API 快速示例
1) 使用内置模型(推荐)
from pynlptool import load_model
# 显式加载模型后重复调用,适合批量推理场景
model = load_model()
print(model.cut("南京市长江大桥"))
# decode 输入为“观测序列”(这里是字符列表),输出为标签序列
print(model.decode(list("南京市长江大桥")))
2) 训练自定义模型
from pynlptool import train
# 训练样本格式: (观测序列, 标签序列)
# 两个序列必须等长,且与 BMES 标注体系一致
sequences = [
(["今", "天", "天", "气", "不", "错"], ["B", "E", "B", "E", "B", "E"]),
(["我", "喜", "欢", "编", "程"], ["S", "B", "E", "B", "E"]),
]
# alpha: 拉普拉斯平滑系数,越大越平滑
# min_freq: 观测最小词频阈值,低频项会映射到 <UNK>
model = train(sequences, alpha=0.5, min_freq=1)
# 保存为可复用模型文件
model.save("your_model.pkl")
3) 训练时启用 BMM 观测增强
from pynlptool import train
# 在不改变 HMM 结构的前提下,启用词典特征增强观测
# use_dict_feature=True: 开启 BMM 特征注入
# feature_joiner="|": 将“字|标签”拼接成新观测
# bmm_max_word_len=6: BMM 最大匹配词长
model = train(
sequences,
alpha=0.5,
min_freq=1,
use_dict_feature=True,
feature_joiner="|",
bmm_max_word_len=6,
)
4) 评估模型
from pynlptool import load_data, evaluate, report
# 读取标注测试集(每行: 字 标签;句间空行)
test_sentences = load_data("test.txt")
# 转为 evaluate 所需结构
test_sequences = [(s.observations, s.tags) for s in test_sentences]
# 逐句推理,得到预测标签序列
predictions = [model.decode(obs) for obs, _ in test_sequences]
# 输出准确率、宏平均 P/R/F1 等指标
metrics = evaluate(test_sequences, predictions)
print(report(metrics))
5) 动态回退推理
from pynlptool import infer_with_fallback, load_baseline_model, load_model
baseline = load_baseline_model()
bmm = load_model()
result = infer_with_fallback(baseline, bmm, "南京市长江大桥")
print(result.chosen_model)
print(" / ".join(result.words))
print(" | ".join(f"{word}/{pos}" for word, pos in result.words_pos))
CLI
安装后可直接使用:
pynlptool "南京市长江大桥"
如果命令不存在(常见于 Windows PATH 未包含 Scripts):
python -m pynlptool.cli "南京市长江大桥"
常用参数:
pynlptool "南京市长江大桥" -o cut
pynlptool "南京市长江大桥" -o tags
pynlptool "南京市长江大桥" -o pos
pynlptool "南京市长江大桥" -m your_model.pkl
-o, --output-format:tags/cut/pos/both-m, --model: 指定模型路径- 默认不指定
-m时,CLI 会在内置基线模型与 BMM-HMM 之间执行动态回退 --disagreement-threshold、--min-avg-margin、--max-avg-score-drop: 回退阈值--version: 查看版本
数据格式
训练文件采用“每行一个 字符 标签,句间空行分隔”:
南 B_LOC
京 M_LOC
市 E_LOC
长 B_LOC
江 E_LOC
大 B_n
桥 E_n
核心 API
load_model(): 加载内置 BMM 增强预训练模型(带缓存)cut(text): 返回分词列表tags(text): 返回与 CLI-o tags一致的输出结果pos(text): 返回与 CLI-o pos一致的输出结果both(text): 返回与 CLI-o both一致的输出结果train(...): 训练 HMM,支持 BMM 观测增强参数evaluate(...): 计算准确率与宏平均指标
说明与边界行为
model.cut("")返回空列表- 数字/英文会先归一化再解码,输出仍保留原字符
- 支持中英数混合输入
许可证
MIT License
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pynlptool-0.3.1.tar.gz.
File metadata
- Download URL: pynlptool-0.3.1.tar.gz
- Upload date:
- Size: 1.5 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7a8f5b79e100b82abaebbb78489842a2e1cbc59acee4f593458f5e2524bb9192
|
|
| MD5 |
09af3ed5488c3eafba072e6905ca03a3
|
|
| BLAKE2b-256 |
96da3c27adb58f768e622dc03cb0264ba90c0c43373de2cfb901a1cd62e17562
|
File details
Details for the file pynlptool-0.3.1-py3-none-any.whl.
File metadata
- Download URL: pynlptool-0.3.1-py3-none-any.whl
- Upload date:
- Size: 1.5 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5ad4608d8a1734ef70dad84008b67a4a1bef5b9f1adf74b404a409c0dc93af0a
|
|
| MD5 |
60b5b9ea05c9c5ea688c4e0b9420be46
|
|
| BLAKE2b-256 |
ccb0bea433118d60368bc3ada682002de0763cb52e2ff3d0e62ac7fdd76d3fcf
|