23 个不稳定版本 (3 个破坏性更新)
新版本 0.5.4 | 2024 年 8 月 23 日 |
---|---|
0.5.3 | 2024 年 7 月 26 日 |
0.4.6 | 2024 年 7 月 15 日 |
0.3.4 | 2024 年 6 月 27 日 |
0.2.10 | 2024 年 6 月 20 日 |
1553 在 文本处理 中排名
每月 811 次下载
310KB
2.5K SLoC
Matcher Rust 实现的 C FFI 绑定
概述
一款高性能的匹配器,旨在解决单词匹配中的 逻辑和文本变化 问题,采用 Rust 实现。
安装
从源码构建
git clone https://github.com/Lips7/Matcher.git
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- --default-toolchain nightly -y
cargo build --release
然后你应在 target/release
目录中找到 libmatcher_c.so
/libmatcher_c.dylib
/matcher_c.dll
。
安装预构建的二进制文件
访问 发布页面 下载预构建的二进制文件。
Python 使用示例
import msgspec
from cffi import FFI
from extension_types import MatchTableType, ProcessType, MatchTable
## define ffi
ffi = FFI()
ffi.cdef(open("./matcher_c.h", "r", encoding="utf-8").read())
lib = ffi.dlopen("./matcher_c.so")
# init matcher
matcher = lib.init_matcher(
msgspec.json.encode({
1: [
MatchTable(
table_id=1,
match_table_type=MatchTableType.Simple(
process_type=ProcessType.MatchNone
),
word_list=["hello,world", "hello", "world"],
exemption_process_type=ProcessType.MatchNone,
exemption_word_list=[],
)
]
})
)
# check is match
lib.matcher_is_match(matcher, "hello".encode("utf-8")) # True
# match as list
res = lib.matcher_process_as_string(matcher, "hello,world".encode("utf-8"))
print(ffi.string(res).decode("utf-8"))
# [{"match_id":1,"table_id":1,"word_id":0,"word":"hello,world","similarity":1.0},{"match_id":1,"table_id":1,"word_id":1,"word":"hello","similarity":1.0},{"match_id":1,"table_id":1,"word_id":2,"word":"world","similarity":1.0}]
lib.drop_string(res)
# match as dict
res = lib.matcher_word_match_as_string(matcher, "hello,world".encode("utf-8"))
print(ffi.string(res).decode("utf-8"))
# {"1":[{"match_id":1,"table_id":1,"word_id":0,"word":"hello,world","similarity":1.0},{"match_id":1,"table_id":1,"word_id":1,"word":"hello","similarity":1.0},{"match_id":1,"table_id":1,"word_id":2,"word":"world","similarity":1.0}]}
lib.drop_string(res)
# drop matcher
lib.drop_matcher(matcher)
# init simple matcher
simple_matcher = lib.init_simple_matcher(
msgspec.json.encode(({
ProcessType.MatchFanjianDeleteNormalize | ProcessType.MatchPinYinChar: {
1: "妳好&世界",
2: "hello",
}
}))
)
# check is match
lib.simple_matcher_is_match(simple_matcher, "你好世界".encode("utf-8")) # True
# match as list
res = lib.simple_matcher_process_as_string(
simple_matcher, "nihaoshijie!hello!world!".encode("utf-8")
)
print(ffi.string(res).decode("utf-8"))
# [{"word_id":1,"word":"妳好&世界"},{"word_id":2,"word":"hello"}]
lib.drop_string(res)
# drop simple matcher
lib.drop_simple_matcher(simple_matcher)
重要提示
- 无需 extension_types.py,您可以直接使用动态库。
- 在初始化和处理后,始终调用
drop_matcher
、drop_simple_matcher
和drop_string
以避免内存泄漏。
依赖关系
~10–18MB
~191K SLoC