enhance: support load stop words file and add chinese default stop words (#45577)

relate: https://github.com/milvus-io/milvus/issues/45576

Signed-off-by: aoiasd <zhicheng.yue@zilliz.com>
This commit is contained in:
aoiasd 2025-12-03 14:33:10 +08:00 committed by GitHub
parent 73fdaafb2d
commit b9487cf8e7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 888 additions and 7 deletions

View File

@ -1,10 +1,11 @@
mod filter;
mod regex_filter;
mod remove_punct_filter;
pub(crate) mod stop_words;
mod synonym_filter;
mod util;
pub mod stop_words;
use regex_filter::RegexFilter;
use remove_punct_filter::RemovePunctFilter;
use synonym_filter::SynonymFilter;

View File

@ -53,13 +53,9 @@ mod tests {
use crate::analyzer::analyzer::create_analyzer;
#[test]
#[cfg(feature = "lindera-ipadic")]
fn test_remove_punct_filter() {
let params = r#"{
"tokenizer": {
"type": "lindera",
"dict_kind": "ipadic"
},
"tokenizer": "jieba",
"filter": ["removepunct"]
}"#;
@ -67,7 +63,7 @@ mod tests {
assert!(tokenizer.is_ok(), "error: {}", tokenizer.err().unwrap());
let mut bining = tokenizer.unwrap();
let mut stream = bining.token_stream("ミルヴァスの日本語テスト、句読点テスト");
let mut stream = bining.token_stream("中文标点,测试。");
let mut results = Vec::<String>::new();
while stream.advance() {

View File

@ -0,0 +1,840 @@
一下
一些
一切
一则
一天
一定
一方面
一旦
一时
一来
一样
一次
一片
一直
一致
一般
一起
一边
一面
万一
上下
上升
上去
上来
上述
上面
下列
下去
下来
下面
不一
不久
不仅
不会
不但
不光
不单
不变
不只
不可
不同
不够
不如
不得
不怕
不惟
不成
不拘
不敢
不断
不是
不比
不然
不特
不独
不管
不能
不要
不论
不足
不过
不问
与其
与否
与此同时
专门
两者
严格
严重
个人
个别
中小
中间
丰富
为主
为了
为什么
为什麽
为何
为着
主张
主要
举行
乃至
之一
之前
之后
之後
之所以
之类
乌乎
也好
也是
也罢
了解
争取
于是
于是乎
云云
互相
产生
人们
人家
什么
什么样
什麽
今后
今天
今年
今後
仍然
从事
从而
他人
他们
他的
代替
以上
以下
以为
以便
以免
以前
以及
以后
以外
以後
以来
以至
以至于
以致
任何
任凭
任务
企图
伟大
似乎
似的
但是
何况
何处
何时
作为
你们
你的
使得
使用
例如
依照
依靠
促进
保持
俺们
倘使
倘或
倘然
倘若
假使
假如
假若
做到
允许
充分
先后
先後
先生
全部
全面
共同
关于
其一
其中
其二
其他
其余
其它
其实
其次
具体
具体地说
具体说来
具有
再者
再说
决定
况且
准备
几乎
几时
凭借
出去
出来
出现
分别
别的
别说
前后
前者
前进
前面
加之
加以
加入
加强
十分
即令
即使
即便
即或
即若
却不
原来
及其
及时
及至
双方
反之
反应
反映
反过来
反过来说
取得
受到
变成
另一方面
另外
只是
只有
只要
只限
叫做
召开
叮咚
可以
可是
可能
可见
各个
各人
各位
各地
各种
各级
各自
合理
同一
同时
同样
后来
后面
向着
否则
吧哒
呜呼
周围
呼哧
咱们
哈哈
哎呀
哎哟
哪个
哪些
哪儿
哪天
哪年
哪怕
哪样
哪边
哪里
哼唷
啪达
喔唷
嗡嗡
嘎登
因为
因此
因而
固然
在下
坚决
坚持
基本
处理
复杂
多少
多数
多次
大力
大多数
大大
大家
大批
大约
大量
失去
她们
她的
好的
好象
如上所述
如下
如何
如其
如果
如此
如若
存在
宁可
宁愿
宁肯
它们
它们的
它的
安全
完全
完成
实现
实际
宣布
容易
密切
对于
对应
少数
尔后
尚且
尤其
就是
就是说
尽管
属于
岂但
左右
巨大
巩固
已经
帮助
常常
并不
并不是
并且
并没有
广大
广泛
应当
应用
应该
开外
开始
开展
引起
强烈
强调
当前
当时
当然
当着
形成
彻底
彼此
往往
後来
後面
得出
得到
心里
必然
必要
必须
怎么
怎么办
怎么样
怎样
怎麽
总之
总是
总的来看
总的来说
总的说来
总结
总而言之
恰恰相反
意思
愿意
慢说
成为
我们
我的
或是
或者
战斗
所以
所有
所谓
扩大
抑或
按照
换句话说
换言之
掌握
接着
接著
故此
整个
方便
方面
旁人
无宁
无法
无论
既是
既然
时候
明显
明确
是否
是的
显然
显著
普通
普遍
更加
曾经
最后
最大
最好
最後
最近
最高
有些
有关
有利
有力
有所
有效
有时
有点
有的
有着
有著
朝着
本着
来着
极了
构成
果然
果真
某个
某些
根据
根本
欢迎
正在
正如
正常
此外
此时
此间
毋宁
每个
每天
每年
每当
比如
比方
比较
毫不
没有
沿
沿着
注意
深入
清楚
满足
漫说
然则
然后
然後
然而
照着
特别是
特殊
特点
现代
现在
甚么
甚而
甚至
由于
由此可见
的话
目前
直到
直接
相似
相信
相反
相同
相对
相对而言
相应
相当
相等
省得
看出
看到
看来
看看
看见
真是
真正
着呢
知道
确定
积极
移动
突出
突然
立即
等等
紧接着
纵令
纵使
纵然
练习
组成
经常
经过
结合
结果
绝对
继续
继而
维持
综上所述
罢了
考虑
而且
而况
而外
而已
而是
而言
联系
能否
能够
自个儿
自从
自各儿
自家
自己
自身
至于
良好
若是
若非
范围
莫若
获得
虽则
虽然
虽说
行为
行动
表明
表示
要不
要不是
要不然
要么
要是
要求
规定
觉得
认为
认真
认识
许多
设使
设若
说明
诸位
谁知
起来
起见
趁着
越是
转动
转变
转贴
较之
达到
迅速
过去
过来
运用
还是
还有
这个
这么
这么些
这么样
这么点儿
这些
这会儿
这儿
这就是说
这时
这样
这点
这种
这边
这里
这麽
进入
进步
进而
进行
连同
适应
适当
适用
逐步
逐渐
通常
通过
造成
遇到
遭到
避免
那个
那么
那么些
那么样
那些
那会儿
那儿
那时
那样
那边
那里
那麽
部分
鄙人
采取
里面
重大
重新
重要
鉴于
问题
防止
附近
限制
除了
除此之外
除非
随着
随著
集中
需要
非但
非常
非徒
顺着
首先
是不是

View File

@ -0,0 +1,3 @@
mod stop_words;
pub use stop_words::*;

View File

@ -33,6 +33,25 @@ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
use once_cell::sync::Lazy;
fn fetch_words_from_file(data: &[u8]) -> &'static [&'static str] {
let s = std::str::from_utf8(data).expect("UTF-8");
let vec: Box<Vec<String>> = Box::new(
s.lines()
.map(|line| line.trim().to_string())
.filter(|l| !l.is_empty())
.collect(),
);
let vec: &'static Vec<String> = Box::leak(vec);
let slice: Box<[&str]> = vec
.iter()
.map(|s| s.as_str())
.collect::<Vec<&str>>()
.into_boxed_slice();
Box::leak(slice)
}
pub fn fetch_language_stop_words(lang: &str) -> Option<&[&str]> {
match lang {
"_english_" => Some(ENGLISH),
@ -48,6 +67,7 @@ pub fn fetch_language_stop_words(lang: &str) -> Option<&[&str]> {
"_russian_" => Some(RUSSIAN),
"_spanish_" => Some(SPANISH),
"_swedish_" => Some(SWEDISH),
"_chinese_" => Some(&*CHINESE),
_ => None,
}
}
@ -1919,3 +1939,24 @@ pub const SWEDISH: &[&str] = &[
"varför", "varje", "vilka", "ditt", "vem", "vilket", "sitt", "sådana", "vart", "dina", "vars",
"vårt", "våra", "ert", "era", "vilkas",
];
pub static CHINESE_DATA: &[u8] = include_bytes!("chinese.txt");
pub static CHINESE: Lazy<&[&str]> = Lazy::new(|| fetch_words_from_file(CHINESE_DATA));
#[cfg(test)]
mod tests {
use super::fetch_language_stop_words;
#[test]
fn test_chinese_stop_words() {
let words = fetch_language_stop_words("_chinese_").unwrap();
assert!(
words.len() == 840,
"number of system Chinese stop words does not match the expected value"
);
for s in words {
print!("{}\n", s);
}
}
}