mitsuru/redact-ner-ruby
GitHub: mitsuru/redact-ner-ruby
一个Ruby绑定库,用于通过ONNX Runtime检测文本中的个人身份信息(PII)。
Stars: 0 | Forks: 0
# redact_ner
为 [`redact-ner`](https://crates.io/crates/redact-ner) Rust crate 提供的 Ruby 绑定。
依托 ONNX Runtime 实现个人身份信息 (PII) 检测的命名实体识别 (NER)。
## 状态
早期最小可行产品 (MVP)。封装了上游 `NerRecognizer` 的 API 接口:
`from_file`、`analyze`、`available?`、`supports_language?`、`supported_entities`,以及配置访问器。
## 安装
该 gem 通过 [`rb_sys`](https://github.com/oxidize-rb/rb-sys) 构建了一个原生 Rust 扩展。你需要:
- Ruby >= 3.0
- 一个可用的 Rust 工具链(`rustc` 和 `cargo`,稳定版)
- 运行时可用的 ONNX Runtime 共享库(详见下文)
```
bundle install
bin/rake compile # or: bundle exec rake compile
```
### 预编译的 musl gem(适用于 Alpine / distroless)
预编译的 `x86_64-linux-musl` 和 `aarch64-linux-musl` gem 动态链接了 C++ 运行时库 `libstdc++`,因此在加载时必须存在。纯净的 Alpine/distroless 镜像并不包含它——请先安装,例如在 Alpine 上运行 `apk add --no-cache libstdc++`。glibc 镜像(例如 Debian slim)已包含该库。
### ONNX Runtime
`redact-ner` 使用了具有 `load-dynamic` 功能的 `ort` crate,这意味着 ONNX Runtime 共享库是在运行时查找,而非在链接时。你必须将 `ORT_DYLIB_PATH` 指向一个与上游 crate 兼容的 `libonnxruntime.so` / `.dylib` / `.dll` 文件。
示例(Linux):
```
export ORT_DYLIB_PATH=/path/to/onnxruntime-linux-x64-1.20.0/lib/libonnxruntime.so.1.20.0
```
### 优雅降级——重要说明
上游 `redact-ner` 在模型或分词器无法加载时 **不会** 抛出异常。`Recognizer.from_file` 始终会返回一个识别器对象;如果 ONNX 会话或分词器初始化失败(模型文件缺失、`ORT_DYLIB_PATH` 未设置等),识别器将处于“不可用”状态,而 `#analyze` 会静默地返回一个空数组。
如果你希望出现硬性错误而非静默降级,请立即检查 `#available?`:
```
rec = RedactNer::Recognizer.from_file("model.onnx")
raise "NER model failed to load" unless rec.available?
```
## 用法
```
require "redact_ner"
recognizer = RedactNer::Recognizer.from_file("path/to/model.onnx")
results = recognizer.analyze("John Doe works at Acme Corp in New York", "en")
results.each do |r|
puts "#{r.entity_type}\t#{r.start}..#{r.end}\t#{r.score.round(3)}\t#{r.text}"
end
```
`analyze` 返回一个 `RedactNer::Result` 数组,它是一个具有以下属性的 `Struct`:
| 属性 | 类型 | 说明 |
|--------------------|---------|-----------------------------------------------|
| `entity_type` | String | 例如 `"PERSON"`, `"ORGANIZATION"`, `"LOCATION"` |
| `start` | Integer | 字节偏移量,包含 |
| `end` | Integer | 字节偏移量,不包含 |
| `score` | Float | 模型置信度,范围 `[0.0, 1.0]` |
| `recognizer_name` | String | 始终为 `"NerRecognizer"` |
| `text` | String | 匹配到的子字符串 |
其他方法:
```
recognizer.available? # => true if a model + tokenizer were loaded
recognizer.supports_language?("ja") # => true / false
recognizer.supported_entities # => ["PERSON", "LOCATION", ...]
recognizer.name # => "NerRecognizer"
recognizer.min_confidence # => 0.7
recognizer.max_seq_length # => 512
recognizer.model_path # => the path you passed in
```
## 模型文件
此 gem 不包含模型。请使用上游 `censgate/redact` 仓库中的 [`scripts/export_ner_model.py`](https://github.com/censgate/redact/tree/main/scripts) 辅助脚本,将 HuggingFace NER 模型导出为 ONNX 格式。将生成的 `model.onnx`、`tokenizer.json` 和 `config.json` 文件放在同一目录中,并将 `.onnx` 文件的路径传递给 `Recognizer.from_file`。
## 开发
```
bundle install
bin/rake compile
bin/rake test
```
## 发布
发布已实现自动化。要发布一个新版本:
1. 运行 **Release Prep** 工作流(Actions → Release Prep → Run workflow),选择 `bump` 级别(`patch`/`minor`/`major`)。它会更新 `lib/redact_ner/version.rb`,根据 GitHub 生成的说明更新 `CHANGELOG.md`,创建一个 **Release PR**,并创建一个 **草稿 GitHub Release**。
2. 审查/编辑 Release PR(以及草稿发布说明)并 **合并** 它。合并会自动创建并推送 `vX.Y.Z` 标签。
3. 该标签将触发 **Release** 工作流:它会构建 5 个预编译 gem 和源码 gem,然后 `publish` 作业会在 `rubygems` GitHub Environment 等待批准。批准后即可发布到 RubyGems 并取消 GitHub Release 的草稿状态,同时附上 gem 资源文件。
若要在发布前中止操作,请在不合并的情况下关闭 Release PR,并删除 `release/vX.Y.Z` 分支和草稿 Release。
## 许可证
根据你的选择,采用以下任一许可证:
- Apache License, Version 2.0 ([Apache许可证](LICENSE-APACHE))
- MIT license ([MIT许可证](LICENSE-MIT))
上游 `redact-ner` crate 采用 Apache-2.0 许可证。
标签:Apex, GDPR, IPv6支持, meg, NER模型, ONNX Runtime, PII检测, Ruby编程, Rust扩展, 信息安全, 可视化界面, 合规工具, 命名实体识别, 工具开发, 数据脱敏, 数据隐私, 机器学习, 模型推理, 深度学习, 红action-ner, 网络安全, 软件开发, 隐私保护, 隐私合规, 隐私识别