主题去重工具中,我们介绍了如何使用Jaccard Similarity和Weighted Jaccard Similarity进行主题模型的去重。针对超大模型的主题去重,我们在本页介绍基于Simhash的快速去重算法。该快速去重算法主要分为两步:基于Simhash的主题预分析以及基于Weighted Jaccard Similarity的Cluster内主题相关性分析。

Simhash主题预分析

计算每个主题Simhash值的流程如下:

  • 计算词表中每个词对应的hash值;
  • 对于每个主题下的每个单词有相应权重weight,为该词在该主题出现的次数/该主题下词的总数。若该词对应的hash值维1001,那么加权后的值为weight -weight -weight weight,即hash某一位值为‘1’则为‘weight’,hash某一位值为‘0’则为‘-weight’;
  • 对主题下每个单词加权后的hash值,按位进行累加,然后对结果逐位进行考虑,正数为1,负数为0,得到该主题的Simhash值。
    Simhash值一样的主题,就被聚集到了同个cluster上。Simhash是局部敏感性的哈希算法,一般两个主题越相似,计算得到的Simhash的Hamming distance会越小。对于超大模型,一些主题计算得到的Simhash值一样,除了大部分是主题比较相似外,还有一些是由于主题中某个单词的权值较大,支配了Simhash的计算,导致该单词占比大的一些主题得到的Simhash值一样,或者是由于随机误差,导致两个语义不相关的主题得到了一样的Simhash值。这样,仅仅依赖Simhash值一样的cluster就进行主题融合,会导致一些不相似的主题被融合到一起,为了进一步提高主题模型快速去重的质量,我们在Simhash主题预分析后,会在Simhash值一样的cluster内,以Weighted Jaccard Similarity进一步的计算,来确定相似的主题。

Cluster内主题相关性分析

在经过Simhash主题预分析后,同Simhash值的主题被聚集到同一个cluster上,在每个cluster内部,我们使用Weighted Jaccard Similarity进行进一步的计算,如果两个主题的相似性>=用户设定的Jaccard_thresh,即认定这两个主题之间存在较大的冗余,对冗余的主题对进行记录。在记录了所有冗余的topic pairs后,通过Disjoint-Set (also called Union-Find) 找到非连接的若干集合,并把每个集合内的主题合并到一起,完成主题模型的快速去重。

使用方法

运行fastmerge_run.py脚本对训练好的主题模型进行快速去重:

  1. python fastmerge_runner.py --model_dir=../model/news --conf=lda.conf --k=30 --threshold=0.4 --output_file=news_lda.fastmerge.model
  • model_dir是模型目录
  • conf是模型配置文件,默认为lda.conf
  • k是每个主题选取前K个词进行相似度计算,默认为30
  • threshold是设定阈值,高于该阈值表示两个主题为冗余,需要根据压缩程序来设定该值
  • output_file是输出文件
    运行上述命令,针对新闻LDA模型进行去重,效果如下所示:
  1. There are 172 candidate topic pairs with the same Simhash value in 59 clusters.
  2. Merge 104 redundant topic pairs into 35 topics (sets).
  3. Now, in total we have 1931 refined topics.