专栏名称: 创宇前端
目录
相关文章推荐
51好读  ›  专栏  ›  创宇前端

异端审判器!一个泛用型文本聚类模型的实现(2)

创宇前端  · 掘金  · 前端  · 2019-01-10 06:52

正文

请到「今天看啥」查看全文


想象一位“主教”威立于尖塔的阳台,望着城楼下的人群,现在他要做的就是将人分成两类,一类大致可信,一类有些可疑,再逐个把后者中的信众移进前者,“异端”自然被剩下。

这篇文章中,我们就是要实现这样一件事。

从一刀切开始分类

我们先将每个输入都视作单独的一类,以启动整个流程。整个全集记作 C

# 初始化
# 输入一个列表,如['a','b','c']
# 输出一个把每个元素都封装为列表的列表,如[['a'],['b'],['c']]
def init(sample_list):
    C = []
    for x in sample_list:
        C.append([x])
    return C
复制代码

基于此前定义的字符串集间距离(在文章中简称为类间距离),选择最接近的两类,合并它们。

这步操作听上去很简单,实际上确实也很简单,但我们会遇到一些麻烦:我们一直使用列表来简单表示集合这个数学概念,它们性质并不相同。集合的三个主要特性中,列表不满足无序性与互异性,因此需要一些额外的处理。

例如,找到最接近的两类,无论如何我们也需要计算出 n^2 个距离,这就不是一件轻松的事。我们将最小距离记作 d ——

def find_min(C):
    # 逻辑告诉我们无论怎样做都必须计算两两之间的全部距离,这里用一个二维列表来记录
    # 数学告诉我们 a->b 与 b->a 的距离是一样的,其实开销可以减小一半
    # 作者告诉大家由于我很懒,就不做这个优化了……
    scale = len(C)
    d = [[0 for i in range(scale)] for i in range(scale)]
    min_d = classesDistanse(C[0], C[1])
    where_min_d = [0, 1]
    for i in range(scale):
        for j in range(scale):
            d[i][j] = classesDistanse(C[i], C[j])
            if i != j and d[i][j] < min_d:
                min_d = d[i][j]
                where_min_d = [i, j]
    return






请到「今天看啥」查看全文