Chinese-Whispers 代码实践与调节

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_32023541/article/details/79964284

关于Chinese-whispers 的原理不再累述,可见之前的博客或者github中的论文翻译。

代码有两个版本:主要的修改对比如下

1.处理过程中预处理的精化

在第一版本的基础上,加强了文本预处理的精度,比如停止词和一些数据过滤处理。对效果稍微起到一点更好的效果,但不是很明显的提升。

2.相似度算法的优化

在原版的基础上,计算句子相似度时,考虑到了分词的不完全性和句子长度的差异性,修改了相似度计算代码。经过不断的测试,调节参数,增加了句子的匹配精度,句子相似度计算测试更为理想。聚类效果提升较为明显。

3.聚类的过程修改

原版的迭代过程,就是计算节点周围的节点类的权重的加权和,取加权和最大的类迭代更新。后来考虑到邻域搜索的精度不是特别好的原因,KDtree 的邻域算法效果不是非常理想,因此这种算法会造受到邻域精度的影响而下降。改进版本为取最大权重的节点的类,而不是加权和最大。经测试,改进效果速度得到提升。

4.中心节点连通(只测试了第一次聚类结束后的连通进行的二次聚类,迭代连通法未测试)

考虑到无法在所有节点间建立边,就算邻域搜索精度比较理想的情况下,也存在节点间不连通的阻断现象。如果要计算所有节点间的相似性,则时间复杂度随着聚类的大小而呈现指数增长,因此在不得不使用邻域搜索的前提下,为了尽快连通全部节点。将第一次聚类的中心节点之间加一条边,权重就是节点之间的额相似度。理论上这样已经可以保证打通了所有的节点,并且为了保证节点之间可以受到迭代的影响,迭代算法更应该取最大权重的类,而非最大加权权重。由于经过测试,效果并无较好的提升,所以在改进时摒弃了这种做法。(效果不理想的原因可能是最后迭代出结果后加入的边太过有限,考虑过在每一轮迭代时增加中心节点间的边,后来觉得与其这样还不如直接处理聚类结果

5.结果二次处理

这种做法就是中心节点连通做法的替换,本来打算在每一轮迭代时,计算中心节点并加入边进行节点间的连通,可是后面没有这么做。而是将聚类结束后,简单的二次合并。主要的原因是第一种做法时间复杂度过高。效果还可以。就是相比原版多了一个进度条。

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页