【发布时间】:2012-04-30 01:28:10
【问题描述】:
根据 tf-idf 矩阵计算 pearson 相关系数以查看哪些项与其他项组合出现是否有意义?它在数学上是否正确?
我的输出是一个相关矩阵,每个单元格中每个术语都有相关系数。
- --------term1 term2 term3
- 术语2
- 术语2
- 术语2
【问题讨论】:
标签: correlation tf-idf pearson
根据 tf-idf 矩阵计算 pearson 相关系数以查看哪些项与其他项组合出现是否有意义?它在数学上是否正确?
我的输出是一个相关矩阵,每个单元格中每个术语都有相关系数。
【问题讨论】:
标签: correlation tf-idf pearson
这取决于您对“与其他术语结合出现”的定义。为了澄清这一点,请进一步说明:
在进行 Pearson 均值相关时,idf 无关紧要。同一术语的所有 tf 值将乘以相同的 idf 值,得到最终的 tf-idf。 PMC 对于输入的缩放是不变的,所以这里取消了 idf。因此,您提出的想法中最重要的是 tf.如果你甚至不计算 idf,你可能会节省一些计算,但如果你这样做不会有太大的伤害。
现在关于 tf.让我们举个例子来弄清楚你可能需要什么:
假设TermA 经常出现在Document1 中,而在Document2 中出现的次数很少。另一方面,TermB 很少出现在 Document1 中,而且经常出现在 Document2 中。你会说这两个词一起出现还是不一起出现?它们出现在同一个文档中,但频率不同。如果您使用 tf-idf 的 PMC,那么结果将是,它们不会同时出现(因为频率不同)。
此时您还应该注意 PMC 的值从 -1 变为 1。 IE。你可以有同时出现的词(PMC=1),它们是独立的(PMC=0)和相反的词(PMC=-1)。这是否适合您正在建模的领域?如果没有,只需将 1 添加到 PMC。
另一种选择是使用余弦相似度,它与 PMC 非常相似,但具有一些不同的特性。此外,在其他一些情况下,您可能只对实际同时发生感兴趣而不关心频率。
可以这么说,所有这些方法都是“正确的”。更重要的问题是,这些方法中的哪一种最适合您正在建模的问题。在许多情况下,这在理论上无法确定,只能通过尝试不同的替代方案并测试哪一个最适合您的问题域。
编辑(以下关于 cmets 的一些评论):
余弦相似度确实有帮助,但在这种情况下你必须换一种思路。您当然可以为文档中的术语生成词频向量,然后计算这些文档词频向量的余弦相似度。您正确指出,这将使您的帖子彼此相似。但这不是我的意思。如果您有完整的词频矩阵,您还可以生成向量,用于描述单个词条在每个文档中出现的频率。您还可以计算这些向量的余弦相似度。这将为您提供基于文档共现的术语相似性。
这样想(但首先我们需要一些符号):
让f_{i,j} 表示术语i 出现在文档j 中的次数(注意我在这里忽略了idf,因为在处理术语而不是文档时它只会取消)。还让F=(f_{i,j})_{i=1...N,j=1...M} 表示整个文档术语矩阵(术语在列中,文档在行中)。然后最后我们将调用|F|_c 矩阵F,其中每个列根据l^2 范数和|F|_r 矩阵F,其中每行根据l^2 范数进行归一化。当然像往常一样A^T 表示A 的转置。在这种情况下,所有文档之间的正常余弦距离都基于以下术语:
(|F|_r)*(|F|_r)^T
这将为您提供一个描述文档相似性的MxM 矩阵。
如果你想计算术语相似度,你可以简单地计算
(|F|_c)^T*(|F|_c)
它为您提供了一个 NxN 矩阵,描述了基于文档中的共现的术语相似性。
请注意,PMC 的计算基本相同,只是在每个矩阵乘法中应用于行和列的归一化类型不同。
现在到你的另一篇文章,你说你想知道如果termA 出现在一个文档中,termB 也出现在同一个文档中的可能性有多大。或者正式地说p(termB | termA),其中p(termX) 表示termX 出现在文档中的概率。这是完全不同的野兽,但计算起来也很简单:
1. Count the number of documents in which `termA` appears (call it num_termA)
2. Count the number of documents in which both `termA` and `termB` appear (call it num_termA_termB)
then p(termB | termA)=num_termA_termB/num_termA
这是同时发生的可能性的实际统计量度。但是请注意,p(termB | termA ) == p(termA | termB) 的关系很可能不成立,因此这种共现度量根本不适用于通过 MDS 进行的聚类,这很可能(不是双关语)。
我的建议是同时尝试 PMC 和余弦相似度(正如您在上面看到的,它们仅在归一化方面有所不同,因此它们应该可以快速实现两者),然后在聚类后检查哪个看起来更好。
有一些更高级的技术可以根据一组文档对主题进行聚类。还经常使用术语文档矩阵的主成分分析 (PCA) 或非负矩阵分解(有关更多信息,请参阅潜在语义分析或 LSA)。然而,这对于您的用例来说可能是多余的,而且这些技术更难做到。 PMC 和余弦相似度的绝对优势是实现起来非常简单(余弦相似度稍微简单一些,因为归一化更容易),因此很难出错。
【讨论】: