Crates.io | matcher_rs |
lib.rs | matcher_rs |
version | |
source | src |
created_at | 2024-06-11 07:23:45.478624 |
updated_at | 2024-10-14 02:59:35.282479 |
description | A high-performance matcher designed to solve LOGICAL and TEXT VARIATIONS problems in word matching, implemented in Rust. |
homepage | https://github.com/Lips7/Matcher |
repository | https://github.com/Lips7/Matcher |
max_upload_size | |
id | 1267857 |
Cargo.toml error: | TOML parse error at line 19, column 1 | 19 | autolib = false | ^^^^^^^ unknown field `autolib`, expected one of `name`, `version`, `edition`, `authors`, `description`, `readme`, `license`, `repository`, `homepage`, `documentation`, `build`, `resolver`, `links`, `default-run`, `default_dash_run`, `rust-version`, `rust_dash_version`, `rust_version`, `license-file`, `license_dash_file`, `license_file`, `licenseFile`, `license_capital_file`, `forced-target`, `forced_dash_target`, `autobins`, `autotests`, `autoexamples`, `autobenches`, `publish`, `metadata`, `keywords`, `categories`, `exclude`, `include` |
size | 0 |
A high-performance matcher designed to solve LOGICAL and TEXT VARIATIONS problems in word matching, implemented in Rust.
For detailed implementation, see the Design Document.
่ฒ่ธ
-> ่ซ่น
*Fu&*iii&^%%*&kkkk
-> Fuiiikkkk
๐ข๐ฐ๐๐ป๐ง ๐โแตฃโ๐!
-> hello world!
่ฅฟๅฎ
-> xi an
, matches ๆดๆ
-> xi an
, but not ๅ
-> xian
่ฅฟๅฎ
-> xian
, matches ๆดๆ
and ๅ
-> xian
hello&world
matches hello world
and world,hello
ๆ &ๆณ&ๆ &ๅคฉ
matches ๆ ๆ ๆณๅคฉ
(because ๆ
is repeated twice), but not ๆ ๆณๅคฉ
hello~helloo~hhello
matches hello
but not helloo
and hhello
To use matcher_rs
in your Rust project, run the following command:
cargo add matcher_rs
Matcher
's configuration is defined by the MatchTableMap = HashMap<u32, Vec<MatchTable>>
type, the key of MatchTableMap
is called match_id
, for each match_id
, the table_id
inside is required to be unique.SimpleMatcher
's configuration is defined by the SimpleTable = HashMap<ProcessType, HashMap<u32, &str>>
type, the value HashMap<u32, &str>
's key is called word_id
, word_id
is required to be globally unique.table_id
: The unique ID of the match table.match_table_type
: The type of the match table.word_list
: The word list of the match table.exemption_process_type
: The type of the exemption simple match.exemption_word_list
: The exemption word list of the match table.For each match table, word matching is performed over the word_list
, and exemption word matching is performed over the exemption_word_list
. If the exemption word matching result is True, the word matching result will be False.
Simple
: Supports simple multiple patterns matching with text normalization defined by process_type
.
&
and ~
, such as hello&world&hello
will match hellohelloworld
and worldhellohello
, but not helloworld
due to the repeated times of hello
.Regex
: Supports regex patterns matching.
SimilarChar
: Supports similar character matching using regex.
["hello,hallo,hollo,hi", "word,world,wrd,๐", "!,?,~"]
will match helloworld!
, hollowrd?
, hi๐~
ยทยทยท any combinations of the words split by ,
in the list.Acrostic
: Supports acrostic matching using regex (currently only supports Chinese and simple English sentences).
["h,e,l,l,o", "ไฝ ,ๅฅฝ"]
will match hope, endures, love, lasts, onward.
and ไฝ ็็ฌๅฎนๆธฉๆ, ๅฅฝๅฟๆ
ๅธธไผดใ
.Regex
: Supports regex matching.
["h[aeiou]llo", "w[aeiou]rd"]
will match hello
, world
, hillo
, wurld
ยทยทยท any text that matches the regex in the list.Similar
: Supports similar text matching based on distance and threshold.
Levenshtein
: Supports similar text matching based on Levenshtein distance.None
: No transformation.Fanjian
: Traditional Chinese to simplified Chinese transformation. Based on FANJIAN.
ๅฆณๅฅฝ
-> ไฝ ๅฅฝ
็พโพ
-> ็ฐ่บซ
Delete
: Delete all punctuation, special characters and white spaces. Based on TEXT_DELETE and WHITE_SPACE
.
hello, world!
-> helloworld
ใไฝ โทๅฅฝใ
-> ไฝ ๅฅฝ
Normalize
: Normalize all English character variations and number variations to basic characters. Based on NORM and NUM_NORM.
โะโใ ร
-> he11o
โฦงใ
-> 123
PinYin
: Convert all unicode Chinese characters to pinyin with boundaries. Based on PINYIN.
ไฝ ๅฅฝ
-> ni hao
่ฅฟๅฎ
-> xi an
PinYinChar
: Convert all unicode Chinese characters to pinyin without boundaries. Based on PINYIN.
ไฝ ๅฅฝ
-> nihao
่ฅฟๅฎ
-> xian
You can combine these transformations as needed. Pre-defined combinations like DeleteNormalize
and FanjianDeleteNormalize
are provided for convenience.
Avoid combining PinYin
and PinYinChar
due to that PinYin
is a more limited version of PinYinChar
, in some cases like xian
, can be treat as two words xi
and an
, or only one word xian
.
Hereโs a basic example of how to use the Matcher
struct for text matching:
use matcher_rs::{text_process, reduce_text_process, ProcessType};
let result = text_process(ProcessType::Delete, "ไฝ ๅฅฝ๏ผไธ็๏ผ");
let result = reduce_text_process(ProcessType::FanjianDeleteNormalize, "ไฝ ๅฅฝ๏ผไธ็๏ผ");
use std::collections::HashMap;
use matcher_rs::{Matcher, MatchTableMap, MatchTable, MatchTableType, ProcessType};
let match_table_map: MatchTableMap = HashMap::from_iter(vec![
(1, vec![MatchTable {
table_id: 1,
match_table_type: MatchTableType::Simple { process_type: ProcessType::FanjianDeleteNormalize},
word_list: vec!["example", "test"],
exemption_process_type: ProcessType::None,
exemption_word_list: vec![],
}]),
]);
let matcher = Matcher::new(&match_table_map);
let text = "This is an example text.";
let results = matcher.word_match(text);
use std::collections::HashMap;
use matcher_rs::{ProcessType, SimpleMatcher};
let mut simple_table = HashMap::new();
let mut simple_word_map = HashMap::new();
simple_word_map.insert(1, "ไฝ ๅฅฝ");
simple_word_map.insert(2, "ไธ็");
simple_table.insert(ProcessType::Fanjian, simple_word_map);
let matcher = SimpleMatcher::new(&simple_table);
let text = "ไฝ ๅฅฝ๏ผไธ็๏ผ";
let results = matcher.process(text);
For more detailed usage examples, please refer to the test.rs file.
runtime_build
: By enable runtime_build feature, we could build process matcher at runtime, but with build time increasing.serde
: By enable serde feature, we could serialize and deserialize matcher and simple_matcher. With serde feature, AhoCorasick's prefilter is disabled, because I don't know how to serialize it correctly, which will lead to performance regression when the patterns size is small (say, less than 100).dfa
: By enable dfa feature, we could use dfa to perform simple matching, but with significantly increasing memory consumption.Default feature is dfa
. If you want to make Matcher
and SimpleMatcher
serializable, you should enable serde
feature.
Bench against pairs (CN_WORD_LIST_100000, CN_HAYSTACK) and (EN_WORD_LIST_100000, EN_HAYSTACK). Word selection is totally random.
The matcher_rs
library includes benchmarks to measure the performance of the matcher. You can find the benchmarks in the bench.rs file. To run the benchmarks, use the following command:
cargo bench
Current default simple match type: ProcessType(None)
Current default simple word map size: 1000
Current default combined times: 2
Timer precision: 41 ns
bench fastest โ slowest โ median โ mean โ samples โ iters
โโ build_cn โ โ โ โ โ
โ โโ build_cn_by_combined_times โ โ โ โ โ
โ โ โโ 1 2.5 ms โ 9.171 ms โ 2.621 ms โ 2.975 ms โ 100 โ 100
โ โ โโ 2 5.088 ms โ 6.116 ms โ 5.407 ms โ 5.447 ms โ 100 โ 100
โ โ โโ 3 7.761 ms โ 8.842 ms โ 7.904 ms โ 7.954 ms โ 100 โ 100
โ โ โโ 4 10.27 ms โ 12.08 ms โ 10.86 ms โ 10.87 ms โ 100 โ 100
โ โ โฐโ 5 12.83 ms โ 13.96 ms โ 13.27 ms โ 13.34 ms โ 100 โ 100
โ โโ build_cn_by_multiple_process_type 25.63 ms โ 49.57 ms โ 26.19 ms โ 27.25 ms โ 100 โ 100
โ โโ build_cn_by_process_type โ โ โ โ โ
โ โ โโ "delete" 5.162 ms โ 6.166 ms โ 5.458 ms โ 5.521 ms โ 100 โ 100
โ โ โโ "delete_normalize" 5.359 ms โ 6.164 ms โ 5.599 ms โ 5.7 ms โ 100 โ 100
โ โ โโ "fanjian" 5.18 ms โ 18.05 ms โ 5.364 ms โ 5.686 ms โ 100 โ 100
โ โ โโ "fanjian_delete_normalize" 5.342 ms โ 5.605 ms โ 5.413 ms โ 5.427 ms โ 100 โ 100
โ โ โโ "none" 5.206 ms โ 6.014 ms โ 5.404 ms โ 5.466 ms โ 100 โ 100
โ โ โโ "normalize" 5.136 ms โ 6.022 ms โ 5.313 ms โ 5.413 ms โ 100 โ 100
โ โ โโ "pinyin" 7.15 ms โ 10.4 ms โ 7.749 ms โ 7.776 ms โ 100 โ 100
โ โ โฐโ "pinyinchar" 6.56 ms โ 8.648 ms โ 6.875 ms โ 6.9 ms โ 100 โ 100
โ โฐโ build_cn_by_simple_word_map_size โ โ โ โ โ
โ โโ 100 462.1 ยตs โ 640.2 ยตs โ 497.6 ยตs โ 503.9 ยตs โ 100 โ 100
โ โโ 1000 5.205 ms โ 6.055 ms โ 5.444 ms โ 5.511 ms โ 100 โ 100
โ โโ 10000 49.3 ms โ 75.97 ms โ 51.22 ms โ 51.94 ms โ 97 โ 97
โ โฐโ 50000 185.7 ms โ 207.6 ms โ 194.1 ms โ 194.3 ms โ 26 โ 26
โโ build_en โ โ โ โ โ
โ โโ build_en_by_combined_times โ โ โ โ โ
โ โ โโ 1 5.982 ms โ 7.846 ms โ 6.418 ms โ 6.451 ms โ 100 โ 100
โ โ โโ 2 12.64 ms โ 14.05 ms โ 13.41 ms โ 13.37 ms โ 100 โ 100
โ โ โโ 3 20.83 ms โ 72.35 ms โ 21.57 ms โ 23.43 ms โ 100 โ 100
โ โ โโ 4 28.75 ms โ 31.95 ms โ 29.36 ms โ 29.54 ms โ 100 โ 100
โ โ โฐโ 5 37.31 ms โ 62.69 ms โ 37.61 ms โ 38.02 ms โ 100 โ 100
โ โโ build_en_by_multiple_process_type 15.42 ms โ 29.2 ms โ 16.09 ms โ 16.42 ms โ 100 โ 100
โ โโ build_en_by_process_type โ โ โ โ โ
โ โ โโ "delete" 12.93 ms โ 14.65 ms โ 13.55 ms โ 13.59 ms โ 100 โ 100
โ โ โโ "delete_normalize" 11.15 ms โ 12.97 ms โ 11.31 ms โ 11.38 ms โ 100 โ 100
โ โ โโ "none" 12.94 ms โ 14.11 ms โ 13.49 ms โ 13.51 ms โ 100 โ 100
โ โ โฐโ "normalize" 11.36 ms โ 12.83 ms โ 12.15 ms โ 12.11 ms โ 100 โ 100
โ โฐโ build_en_by_simple_word_map_size โ โ โ โ โ
โ โโ 100 901.1 ยตs โ 1.268 ms โ 977.2 ยตs โ 1.004 ms โ 100 โ 100
โ โโ 1000 12.13 ms โ 32.91 ms โ 12.91 ms โ 13.15 ms โ 100 โ 100
โ โโ 10000 159.3 ms โ 193 ms โ 165 ms โ 166.5 ms โ 31 โ 31
โ โฐโ 50000 712 ms โ 857.7 ms โ 716.7 ms โ 739.5 ms โ 7 โ 7
โโ search_cn โ โ โ โ โ
โ โโ search_cn_baseline โ โ โ โ โ
โ โ โโ 100 2.927 ms โ 4.723 ms โ 3.239 ms โ 3.251 ms โ 100 โ 100
โ โ โโ 1000 3.084 ms โ 3.915 ms โ 3.406 ms โ 3.426 ms โ 100 โ 100
โ โ โโ 10000 8.098 ms โ 9.623 ms โ 8.314 ms โ 8.372 ms โ 100 โ 100
โ โ โฐโ 50000 27.34 ms โ 40.26 ms โ 29.6 ms โ 30.57 ms โ 100 โ 100
โ โโ search_cn_by_combined_times โ โ โ โ โ
โ โ โโ 1 4 ms โ 4.618 ms โ 4.304 ms โ 4.296 ms โ 100 โ 100
โ โ โโ 2 5.097 ms โ 5.676 ms โ 5.446 ms โ 5.422 ms โ 100 โ 100
โ โ โโ 3 6.164 ms โ 6.73 ms โ 6.192 ms โ 6.29 ms โ 100 โ 100
โ โ โโ 4 6.948 ms โ 8.172 ms โ 7.438 ms โ 7.314 ms โ 100 โ 100
โ โ โฐโ 5 9.285 ms โ 9.946 ms โ 9.777 ms โ 9.766 ms โ 100 โ 100
โ โโ search_cn_by_multiple_process_type 61.99 ms โ 94.96 ms โ 65.04 ms โ 65.7 ms โ 100 โ 100
โ โโ search_cn_by_process_type โ โ โ โ โ
โ โ โโ "delete" 14.19 ms โ 15.32 ms โ 15.19 ms โ 14.95 ms โ 100 โ 100
โ โ โโ "delete_normalize" 21.86 ms โ 26.01 ms โ 21.91 ms โ 21.99 ms โ 100 โ 100
โ โ โโ "fanjian" 7.295 ms โ 7.861 ms โ 7.337 ms โ 7.372 ms โ 100 โ 100
โ โ โโ "fanjian_delete_normalize" 23.07 ms โ 25.89 ms โ 24.36 ms โ 24.27 ms โ 100 โ 100
โ โ โโ "none" 5.173 ms โ 5.502 ms โ 5.207 ms โ 5.214 ms โ 100 โ 100
โ โ โโ "normalize" 14.36 ms โ 15.34 ms โ 14.48 ms โ 14.49 ms โ 100 โ 100
โ โ โโ "pinyin" 42.33 ms โ 43.75 ms โ 42.43 ms โ 42.46 ms โ 100 โ 100
โ โ โฐโ "pinyinchar" 42.16 ms โ 43.93 ms โ 42.32 ms โ 42.38 ms โ 100 โ 100
โ โฐโ search_cn_by_simple_word_map_size โ โ โ โ โ
โ โโ 100 3.002 ms โ 3.243 ms โ 3.017 ms โ 3.026 ms โ 100 โ 100
โ โโ 1000 5.248 ms โ 5.677 ms โ 5.421 ms โ 5.426 ms โ 100 โ 100
โ โโ 10000 15.51 ms โ 18.43 ms โ 15.7 ms โ 15.79 ms โ 100 โ 100
โ โฐโ 50000 52.89 ms โ 64.13 ms โ 55.85 ms โ 55.99 ms โ 90 โ 90
โโ search_en โ โ โ โ โ
โ โโ search_en_baseline โ โ โ โ โ
โ โ โโ 100 350.2 ยตs โ 547.6 ยตs โ 376.5 ยตs โ 382.5 ยตs โ 100 โ 100
โ โ โโ 1000 360.4 ยตs โ 463.8 ยตs โ 386 ยตs โ 388.3 ยตs โ 100 โ 100
โ โ โโ 10000 1.014 ms โ 1.045 ms โ 1.02 ms โ 1.022 ms โ 100 โ 100
โ โ โฐโ 50000 1.015 ms โ 1.051 ms โ 1.02 ms โ 1.021 ms โ 100 โ 100
โ โโ search_en_by_combined_times โ โ โ โ โ
โ โ โโ 1 1.787 ms โ 2.475 ms โ 1.808 ms โ 1.831 ms โ 100 โ 100
โ โ โโ 2 2.519 ms โ 2.772 ms โ 2.528 ms โ 2.535 ms โ 100 โ 100
โ โ โโ 3 2.58 ms โ 2.926 ms โ 2.6 ms โ 2.609 ms โ 100 โ 100
โ โ โโ 4 2.816 ms โ 3.299 ms โ 2.827 ms โ 2.837 ms โ 100 โ 100
โ โ โฐโ 5 2.753 ms โ 3.387 ms โ 2.768 ms โ 2.778 ms โ 100 โ 100
โ โโ search_en_by_multiple_process_type 10.65 ms โ 11.94 ms โ 10.68 ms โ 10.72 ms โ 100 โ 100
โ โโ search_en_by_process_type โ โ โ โ โ
โ โ โโ "delete" 7.012 ms โ 7.4 ms โ 7.106 ms โ 7.112 ms โ 100 โ 100
โ โ โโ "delete_normalize" 8.678 ms โ 9.234 ms โ 8.787 ms โ 8.785 ms โ 100 โ 100
โ โ โโ "none" 2.085 ms โ 2.373 ms โ 2.222 ms โ 2.223 ms โ 100 โ 100
โ โ โฐโ "normalize" 3.919 ms โ 4.235 ms โ 4.179 ms โ 4.175 ms โ 100 โ 100
โ โฐโ search_en_by_simple_word_map_size โ โ โ โ โ
โ โโ 100 1.361 ms โ 1.625 ms โ 1.447 ms โ 1.438 ms โ 100 โ 100
โ โโ 1000 2.446 ms โ 2.802 ms โ 2.617 ms โ 2.583 ms โ 100 โ 100
โ โโ 10000 3.166 ms โ 4.672 ms โ 3.281 ms โ 3.298 ms โ 100 โ 100
โ โฐโ 50000 5.981 ms โ 8.647 ms โ 6.054 ms โ 6.101 ms โ 100 โ 100
โฐโ single_line โ โ โ โ โ
โโ search_cn_single_line โ โ โ โ โ
โ โโ 100 259.7 ns โ 275.3 ns โ 267.5 ns โ 267.7 ns โ 100 โ 1600
โ โโ 1000 314.3 ns โ 335.2 ns โ 319.6 ns โ 320.1 ns โ 100 โ 1600
โ โโ 10000 499.3 ns โ 12.24 ยตs โ 582.3 ns โ 711.4 ns โ 100 โ 100
โ โฐโ 50000 1.249 ยตs โ 26.66 ยตs โ 1.333 ยตs โ 1.673 ยตs โ 100 โ 100
โฐโ search_en_single_line โ โ โ โ โ
โโ 100 56.28 ns โ 61.17 ns โ 56.93 ns โ 57.85 ns โ 100 โ 12800
โโ 1000 60.18 ns โ 61.82 ns โ 60.84 ns โ 60.74 ns โ 100 โ 12800
โโ 10000 332.3 ns โ 5.249 ยตs โ 416.3 ns โ 477.6 ns โ 100 โ 100
โฐโ 50000 457.3 ns โ 15.2 ยตs โ 540.3 ns โ 706.8 ns โ 100 โ 100
Contributions to matcher_rs
are welcome! If you find a bug or have a feature request, please open an issue on the GitHub repository. If you would like to contribute code, please fork the repository and submit a pull request.
matcher_rs
is licensed under the MIT OR Apache-2.0 license.
For more details, visit the GitHub repository.