【问题标题】:What does the Brown clustering algorithm output mean?布朗聚类算法输出是什么意思?
【发布时间】:2014-01-26 17:47:31
【问题描述】:

我已经从 https://github.com/percyliang/brown-cluster 运行了 brown-clustering 算法,还运行了一个 python 实现 https://github.com/mheilman/tan-clustering。他们都为每个唯一令牌提供某种二进制和另一个整数。例如:

0        the        6
10        chased        3
110        dog        2
1110        mouse        2
1111        cat        2

二进制和整数是什么意思?

从第一个link开始,二进制被称为bit-string,见http://saffron.deri.ie/acl_acl/document/ACL_ANTHOLOGY_ACL_P11-1053/

但是我如何从输出中得知dog and mouse and cat 是一个集群而the and chased 不在同一个集群中?

【问题讨论】:

  • 在您提供的第一个链接中,它说每一行是: !!
  • 这是什么意思?簇表示为位串?
  • 您能否详细说明您想要分类的内容?在这种情况下,我可以尝试寻找一些参考资料。否则,可能没有任何通用程序,我想这更多的是关于专家知识和/或预定义的措施。
  • 我需要从未注释的语料库中提取语义相关的聚类。
  • 当然,这就是聚类的想法,但那些层次算法只是给你层次。在您给出的示例中,不清楚 dog mouse 和 cat 是否应该在一个集群中。这仅取决于请求的粒度级别。

标签: python algorithm machine-learning nlp cluster-analysis


【解决方案1】:

如果我理解正确,该算法会为您提供一棵树,您需要在某个级别截断它以获得集群。如果是这些位字符串,您应该只取第一个 L 字符。

例如,在第二个字符处切割会给你两个簇

10           chased     

11           dog        
11           mouse      
11           cat        

在你得到第三个字符时

110           dog        

111           mouse      
111           cat        

但切割策略是另一回事。

【讨论】:

  • 您有任何关于cutting 策略的链接/教程吗?
  • 有时你有一些专业知识,知道只有K 簇,你一得到它们就剪掉。否则你定义一些度量,wikipedia article 是一个很好的起点。
【解决方案2】:

在 Percy Liang 的实现 (https://github.com/percyliang/brown-cluster) 中,-C 参数允许您指定词簇的数量。输出包含语料库中的所有单词,以及注释集群的位串和以下格式的单词频率:<bit string> <word> <word frequency>。输出中不同位串的数量等于所需簇的数量,具有相同位串的单词属于同一个簇。

【讨论】:

  • 有什么方法可以找到输入语料库的最佳聚类数?
【解决方案3】:

改变你的跑步方式:./wcluster --text input.txt --c 3

--c数

这个数字表示簇的个数,默认是50个。你无法区分不同的词簇,因为默认输入只有三个句子。将 50 个集群更改为 3 个集群,您就可以分辨出差异。

我在输入中输入了 3 条推文,并给出 3 作为集群参数

【讨论】:

  • 如何选择优化的簇数?
【解决方案4】:

整数是单词在文档中出现次数的计数。 (我已经在 python 实现中对此进行了测试。)

来自python实现顶部的cmets:

而不是使用窗口(例如,在 Brown 等人的第 4 节中),这 代码使用两个随机选择的概率计算 PMI 来自同一文档的集群将是 c1 和 c2。此外,由于 集群令牌和对的总数在对之间是恒定的, 此代码使用计数而不是概率。

从python实现中的代码我们看到它输出了单词、位串和单词计数。

def save_clusters(self, output_path):
    with open(output_path, 'w') as f:
        for w in self.words:
            f.write("{}\t{}\t{}\n".format(w, self.get_bitstring(w),
                                          self.word_counts[w]))

【讨论】:

    【解决方案5】:

    我的猜测是:

    根据Brown et al 1992 中的图 2,聚类是分层的,要从根到每个单词“叶子”,您必须做出向上/向下的决定。如果 up 为 0,down 为 1,则可以将每个单词表示为一个位串。

    来自https://github.com/mheilman/tan-clustering/blob/master/class_lm_cluster.py

    # the 0/1 bit to add when walking up the hierarchy
    # from a word to the top-level cluster
    

    【讨论】:

    • 是的,但这并没有给我集群,它只会给我相似性,对吧?
    • 包含该词的簇集等价于位串前缀集。因此位串为 1110 的单词包含在簇 1、11 和 111 中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 2018-07-17
    • 2020-11-09
    • 2011-12-19
    • 2018-05-07
    相关资源
    最近更新 更多