#correlation #cluster #shorttext

CFDTCP

Short text clustering for determining center points and correlation judgment [one-hot,Jenks Natural Breaks]

2 releases

0.1.1 May 15, 2023
0.1.0 May 9, 2023

#738 in Text processing

24 downloads per month

BSD-3-Clause

33KB
522 lines

Short text clustering for determining center points and correlation judgment [Jenks Natural Breaks]

这是一个简单判断多个短文本相关性的库。【需提供一个中心点,也就是需要选择一个短文本作为参照】

主要适用于比如:相关文章推荐之后的,各个推荐标题是否过于紧密的判断

流程:

  1. 使用AC自动机,去除停用词。【当然更好的方式是 分词,但是为了提高运行效率,未使用分词】
  2. 使用 one-hot 方式生成各个句子和中心句子的句向量,存储到Bitmap。【更好的是:使用语言模型生成向量】
  3. 计算各个句子向量到中心句之间的距离。
  4. 对计算的距离 统计离散系数,可以看出其 聚合程度
  5. 或者使用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