#text #string #pattern #multi #string-search #search #search-pattern

matcher_c

一款高性能的匹配器,旨在解决单词匹配中的逻辑和文本变化问题,采用 Rust 实现

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文本处理 中排名

Download history 605/week @ 2024-06-14 684/week @ 2024-06-21 183/week @ 2024-06-28 464/week @ 2024-07-05 427/week @ 2024-07-12 206/week @ 2024-07-19 430/week @ 2024-07-26 28/week @ 2024-08-02

每月 811 次下载

Apache-2.0 OR MIT

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)

重要提示

  1. 无需 extension_types.py,您可以直接使用动态库。
  2. 在初始化和处理后,始终调用 drop_matcherdrop_simple_matcherdrop_string 以避免内存泄漏。

依赖关系

~10–18MB
~191K SLoC