IbPinyinLib:高性能拼音匹配库,支持 AHK2、Rust

@kzf 提议,将 IbEverythingExt 中使用的拼音匹配算法用 Rust 重写成了一个独立的库:

  • 支持以下拼音编码方案:
    • 简拼(“py”)
    • 全拼(“pinyin”)
    • 带声调全拼(“pin1yin1”)
    • Unicode(“pīnyīn”)
    • 智能 ABC 双拼
    • 拼音加加双拼
    • 微软双拼
    • 华宇双拼(紫光双拼)
    • 小鹤双拼
    • 自然码双拼
  • 支持多音字。
  • 支持混合匹配多种拼音编码方案,默认匹配简拼和全拼。
  • 默认小写字母匹配拼音或字母,大写字母只匹配字母。
  • 支持 Unicode 辅助平面汉字。

AutoHotkey v2 用例:

#Include <IbPinyin>

IsMatch := IbPinyin_IsMatch("pysousuoeve", "拼音搜索Everything", IbPinyin_AsciiFirstLetter | IbPinyin_Ascii)

是否匹配 := 拼音_匹配("pysousuoeve", "拼音搜索Everything")
是否匹配 := 拼音_匹配("pysousuoeve", "拼音搜索Everything", 拼音_简拼 | 拼音_全拼)

下载

5 个赞

暂时还没能用的,但因为偶尔会折腾输入法,所以关注 star了

:+1:

回头试试,现在用的是tcmatch.dll

厉害 :+1:

收集了一下其它和拼音有关的项目:

语言 拼音 双拼 词典 匹配 其它
Rust
(C, AHK2)
IbPinyinLib :heavy_check_mark: Unicode :heavy_check_mark: :x: :heavy_check_mark: 性能优先;支持 Unicode 辅助平面汉字
Rust
(Node.js)
rust-pinyin :heavy_check_mark: Unicode :x: :x: :x:
Rust rust-pinyin 简拼 :x: :x: :x:
C# ToolGood.Words.Pinyin :heavy_check_mark: :x: :x: 单编码?
C# TinyPinyin.Net :heavy_check_mark: :x: :x: :x:
C# Romanization.NET Unicode :x: :x: 支持日文、韩文、俄文、希腊文
Java PinIn :heavy_check_mark: :heavy_check_mark: 小鹤、自然码 :x: :heavy_check_mark: 支持注音输入法、模糊音
Java TinyPinyin :heavy_check_mark: :x: :heavy_check_mark: :x:
Go go-pinyin :heavy_check_mark: :x: :heavy_check_mark: :x:
Python python-pinyin :heavy_check_mark: :x: :heavy_check_mark: :x:
TS pinyin-pro :heavy_check_mark: :x: :x: :heavy_check_mark:
JS pinyin-match :heavy_check_mark: :x: :x: 单编码 匹配时忽略空白
JS pinyin-engine :heavy_check_mark: :x: :x: 单编码
JS pinyin :heavy_check_mark: :x: :heavy_check_mark: :x:
JS pinyinjs :heavy_check_mark: Unicode :x: :x: :x:
Perl
(Rust, Java, Python, Ruby, JS, PHP)
Text::Unidecode :heavy_check_mark: :x: :x: :x: 支持文字广泛

Java 和 TS 都有多编码拼音匹配的库了,.NET 和 Python 似乎还没有。

数据库:

文件管理:

文本编辑:

有用 rust 实现的 Window 输入法吗?感觉这个库套上个输入法框架就是个很完整的输入法了。

:+1: star +1

这个库不太适合用来实现输入法,根据拼音遍历查询汉字会比较慢,数据里也没有词频,顶多双拼转换可以复用一下。

Rust 输入法的话有个日语的,不过看起来不支持 Windows:

中文只找到个 demo:

v0.2.1~v0.2.7:

新功能

  • Minimal / C / AHK2:增加 find_match API,允许获取匹配范围(#4

    AHK2 用例:

    text := "拼音搜索Everything"
    IsMatch := IbPinyin_Match("pysousuoeve", text, IbPinyin_AsciiFirstLetter | IbPinyin_Ascii, &start, &end)
    MsgBox(IsMatch ": " start ", " end ", " SubStr(text, start, end - start))
    
    文本 := "拼音搜索Everything"
    是否匹配 := 拼音_匹配("pysousuoeve", 文本, 拼音_简拼 | 拼音_全拼, &开始位置, &结束位置)
    MsgBox(是否匹配 ": " 开始位置 ", " 结束位置 ", " SubStr(文本, 开始位置, 结束位置 - 开始位置))
    
  • AHK2:支持 32 位 AutoHotkey

    32 位相比 64 位的 DLL 体积小 0.3 MiB(1.5 → 1.2 MiB),进程总内存占用少 0.2 MiB(2.16 → 1.93 MiB)。

改进

  • 提升匹配性能:拼音编码前缀组优化

修复

  • encoding / C / AHK2:修复了对部分 UTF-16 和 UTF-32 字符串不会进行拼音匹配的问题(#2
  • AHK2
    • DLL 名称
    • IbPinyin_IsMatch 在部分情况下会返回错误结果

64 位下测试以下语句, 结果为 0. 32位下正常为 1.

msgbox IbPinyin_IsMatch(“wsnbb”, “我是你爸爸”)

是 AHK 库里对返回值的判断有问题,v0.2.7 已修复。

1 个赞