2 releases
0.1.1 | May 15, 2023 |
---|---|
0.1.0 | May 9, 2023 |
#738 in Text processing
24 downloads per month
33KB
522 lines
Short text clustering for determining center points and correlation judgment [Jenks Natural Breaks]
这是一个简单判断多个短文本相关性的库。【需提供一个中心点,也就是需要选择一个短文本作为参照】
主要适用于比如:相关文章推荐之后的,各个推荐标题是否过于紧密的判断
流程:
- 使用AC自动机,去除停用词。【当然更好的方式是 分词,但是为了提高运行效率,未使用分词】
- 使用 one-hot 方式生成各个句子和中心句子的句向量,存储到Bitmap。【更好的是:使用语言模型生成向量】
- 计算各个句子向量到中心句之间的距离。
- 对计算的距离 统计离散系数,可以看出其 聚合程度
- 或者使用Jenks Natural Breaks 聚类,并查找最优的【标准差最小】的簇,簇越多表示越离散,越少越聚合 【更好的是:使用密度聚类算法】
Example
let centor = "感冒第二天了,嗓子完全沙哑了,怎么办";
let list = [
"感冒咳嗽引起嗓子沙哑",
"我是感冒引起的嗓子沙哑",
"感冒咳嗽流鼻涕嗓子沙哑",
"因感冒引起的嗓子沙哑",
"感冒引起了嗓子沙哑。完全说不出话来",
"前几天感冒嗓子有点沙哑",
"年前感冒引起的嗓子沙哑",
"我是感冒引起的嗓子沙哑",
"感冒四天了,嗓子沙哑",
];
let mut cfdtcp = CFDTCP::CFDTCP::new();
cfdtcp.centor(centor.to_owned()).list(list.to_vec());
// 获取众位数 距离相同最多的
// @return (mode,count)
let mode = cfdtcp.mode().unwrap();
// 离散系数
// @return f64
let distribution = cfdtcp.distribution();
// 聚类 参数-表示最多计算的簇,比如有9个句子,最多只能分成9簇,越少计算越快,准确度越低
// @return (usize,Vec)
let class = cfdtcp.jenks_classify(9);
test
(
"感冒第二天了,嗓子完全沙哑了,怎么办",
[
"感冒咳嗽引起嗓子沙哑",
"我是感冒引起的嗓子沙哑",
"感冒咳嗽流鼻涕嗓子沙哑",
"因感冒引起的嗓子沙哑",
"感冒引起了嗓子沙哑。完全说不出话来",
"前几天感冒嗓子有点沙哑",
"年前感冒引起的嗓子沙哑",
"我是感冒引起的嗓子沙哑",
"感冒四天了,嗓子沙哑",
],
),
(
"鼻炎,咽炎严重,特别是鼻炎",
[
"鼻炎,咽炎,鼻炎引起的咽炎",
"鼻炎严重了会引起咽炎吗",
"这是鼻炎还是咽炎呢严重吗",
"有鼻炎,鼻炎比较严重",
"我闺女有鼻炎,冬天鼻炎特别严重",
"咽炎鼻炎七八年了,去年咽炎严重声带受损",
"鼻炎咽喉炎严重鼻炎咽喉炎",
"鼻炎的症状有哪些?鼻炎严不严重?",
"鼻炎的症状有哪些?鼻炎严不严重?",
],
),
(
"得脚气的原因脚气怎么办",
[
"小孩得脚气怎么办什么治疗脚气",
"脚气怎么办有脚气怎么办",
"脚气难受怎么办?因为有脚气",
"脚气是怎么得的为什么会得脚气",
"得了脚气的症状脚气怎么办",
"脚气的早期症状脚气怎么办",
"脚气怎么办?脚气怎么才能好啊",
"脚气不好怎么办?脚上有脚气",
"有脚气怎么办脚气用什么",
],
),
(
"得脚气的原因脚气怎么办?",
[
"小孩得脚气怎么办什么治疗脚气",
"脚气怎么办有脚气怎么办",
"脚气难受怎么办?因为有脚气",
"特别痒脱皮,是脚癣吗?还是脚气",
"脚癣的病因",
"脚癣根治方法",
"香港脚治疗方法",
"香港脚怎么办",
"香港脚怎么才能根治啊",
],
),
//运行结果
running 1 test
得脚气的原因脚气怎么办离散系数:Some(0.19338161676886978) 众位数:距离-7 => 数量:3
距离:[5, 5, 7, 7, 7, 8, 8, 9, 9]
分类4:
["start:5 end:7 count:2", "start:7 end:8 count:3", "start:8 end:9 count:3"]
----------------------------------------------
感冒第二天了,嗓子完全沙哑了,怎么办离散系数:Some(0.15596031940172347) 众位数:距离-15 => 数量:5
距离:[8, 13, 14, 14, 15, 15, 15, 15, 15]
分类2:
["start:8 end:15 count:5"]
----------------------------------------------
鼻炎,咽炎严重,特别是鼻炎离散系数:Some(0.29921571088744625) 众位数:距离-13 => 数量:2
距离:[5, 7, 7, 8, 8, 9, 12, 13, 13]
分类5:
["start:5 end:7 count:1", "start:7 end:8 count:2", "start:8 end:12 count:3", "start:12 end:13 count:2"]
----------------------------------------------
得脚气的原因脚气怎么办?离散系数:Some(0.34283965148438666) 众位数:距离-9 => 数量:2
距离:[6, 7, 8, 9, 9, 14, 14, 15, 17]
分类7:
["start:6 end:7 count:1", "start:7 end:9 count:2", "start:9 end:14 count:2", "start:14 end:15 count:2", "start:15 end:17 count:1", "start:17 end:17 count:1"]
----------------------------------------------
test test ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.72s
Dependencies
~1.5MB
~24K SLoC