Expand description
这是一个简单判断多个短文本相关性的库。【需提供一个中心点,也就是需要选择一个短文本作为参照】
主要适用于比如:相关文章推荐之后的,各个推荐标题是否过于紧密的判断
流程:
- 使用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);