【问题标题】:How to measure similarity between sentences inside a cluster after clustering?聚类后​​如何测量聚类内句子之间的相似度?
【发布时间】:2021-10-28 08:06:34
【问题描述】:

我正在对来自公共电报组的消息进行主题建模分析,对这个领域非常陌生,所以只是学习。

我一直在关注此示例 (https://towardsdatascience.com/topic-modeling-with-bert-779f7db187e6),并尝试将 HDBSCAN 聚类算法替换为 BERT 文档 util.community_detection (https://www.sbert.net/docs/package_reference/util.html) 中的算法。

当我在此示例中输出集群的结果(4899 条 Telegram 消息)时,我得到如下所示的内容。

  • 主题:只是一个集群标签
  • 文档:该集群中的所有消息组合在一起
  • 0:通过 tf-idf 找到的热门关键字

我关心的问题是,显然有大量消息彼此基本相同,我已将它们标记为黄色。举几个例子,

  • 集群 3:这只是一堆“你好”及其变体
  • Cluster 5:这只是一堆“好的”,人们说是/好的
  • 第 7 组:人们只是表示感谢和变化
  • 第 9 组:“gas”一词的一些变体和拼写错误
  • 第 19 组:只是“siap”,我认为它的意思是“对不起,如果我已经发布了”

对于人类读者,我觉得这种类型的文本应该完全从分析中排除,问题是我如何检测它。

由于它们已经由聚类算法分组在一起,因此该算法必须有方法来衡量聚类中这些消息之间的“相似性”。但我似乎无法在任何地方找到这些值或它的名称。例如 HDBSCAN 算法 (https://hdbscan.readthedocs.io/en/latest/basic_hdbscan.html#),我浏览了几次文档,没有发现任何此类属性或度量暴露,我在这里遗漏了什么吗?

我的假设是,对于只是一个词或一个短语一遍又一遍重复的情况,这个相似度值一定是超超高的,我只想说“内部相似度高于这个阈值的簇被扔掉了”。

任何帮助和建议将不胜感激,谢谢!

【问题讨论】:

    标签: nlp cluster-analysis telegram


    【解决方案1】:

    索引您感兴趣的语料库(例如FAISS)只是为了一个想法,示例代码如下:

    def build_index(self):
    
            """:returns an inverted index for the search documents"""
            vectors = [self.encode(document) for document in self.documents]
            index = faiss.IndexIDMap(faiss.IndexFlatIP(768))  # dimensionality of vector space
            # Add document vectors into index after transforming into numpy arrays. IDs should match len(documents)
            index.add_with_ids(np.array([vec.numpy() for vec in vectors]), np.array(range(0, len(self.documents))))
            return index
    

    然后使用点积执行任何相似度度量,例如 L2 欧几里得距离或余弦相似度。本质上,概念是,一旦我们在 n 维空间中变换向量,具有相似语义的向量就会被组合在一起。因此,计算相似度只是计算它们之间的角度并在其上应用余弦。相似向量的角度较小,因此余弦值较高,反之亦然。

    检查以下主题以解决您的问题。

    查看this 存储库,以更好地了解句子向量化和计算相似度以检索前 n 个句子。

    总之,

    1. 使用 FAISS 为您感兴趣的数据创建索引文件。
    2. 通过调用其中一种方法计算相似度。
    3. 获取前 n 个最相似的结果。

    删除停用词: 本质上,您的问题可以归因于有限停用词列表。如果您可以最大程度地识别出某个有限值(例如大约 25 个)这样不同的关键词,那么任务就变成了停用词去除。请使用 NLTK / Spacy 库来轻松删除停用词。您还可以在字符串列表中指定它们,编写一个条件,如果令牌与这些字符串之一匹配,它们将从下游处理中删除。停用词被省略,是 NLP 中必要的预处理任务。你的电报任务 数据也类似推特分析。检查this & this

    【讨论】:

    • 嘿@Sai_Vyas 这不是我想要的,但很高兴知道,感谢您告诉我有关 FAISS 包的信息!看起来很有趣。
    猜你喜欢
    • 2018-08-26
    • 2019-03-08
    • 2012-07-17
    • 2012-09-30
    • 2012-06-24
    • 2019-09-01
    • 1970-01-01
    • 2020-02-09
    • 2015-07-17
    相关资源
    最近更新 更多