对于文本分析程序,我想分析文本中某些单词的共现。例如,我希望看到“Barack”和“Obama”这两个词比其他词更频繁地一起出现(即具有正相关性)。
这似乎并不难。但是,老实说,我只知道如何计算两个数字之间的相关性,而不知道如何计算文本中两个单词之间的相关性。
- 我怎样才能最好地解决这个问题?
- 如何计算单词之间的相关性?
我想到了使用条件概率,因为例如巴拉克奥巴马比奥巴马巴拉克更有可能;然而,我试图解决的问题更为根本,并且不依赖于单词的顺序
对于文本分析程序,我想分析文本中某些单词的共现。例如,我希望看到“Barack”和“Obama”这两个词比其他词更频繁地一起出现(即具有正相关性)。
这似乎并不难。但是,老实说,我只知道如何计算两个数字之间的相关性,而不知道如何计算文本中两个单词之间的相关性。
我想到了使用条件概率,因为例如巴拉克奥巴马比奥巴马巴拉克更有可能;然而,我试图解决的问题更为根本,并且不依赖于单词的顺序
Ngram Statistics Package (NSP)正是专门用于这项任务的。他们在网上有一篇论文,描述了他们使用的关联度量。我自己没有使用过这个包,所以我不能评论它的可靠性/要求。
解决您的问题的一种简单方法是将数据整形为 2x2 矩阵
obama | not obama
barack A B
not barack C D
并对矩阵中所有出现的二元词进行评分。这样你就可以使用简单的卡方。
我不知道这通常是如何做到的,但我可以想出一种粗略的方法来定义捕获单词邻接的相关概念。
假设文本的长度为 N,假设它是一个数组
text[0], text[1], ..., text[N-1]
假设文本中出现以下单词
word[0], word[1], ..., word[k]
对于每个单词 word[i],定义一个长度为 N-1 的向量
X[i] = array(); // of length N-1
如下:如果单词是第 i 个单词或第 (i+1) 个单词,则向量的第 i 个条目为 1,否则为零。
// compute the vector X[i]
for (j = 0:N-2){
if (text[j] == word[i] OR text[j+1] == word[i])
X[i][j] = 1;
else
X[i][j] = 0;
}
然后你可以计算 word[a] 和 word[b] 之间的相关系数作为 X[a] 和 X[b] 之间的点积(注意点积是这些单词相邻的次数)除以长度(长度是单词出现次数的平方根,可能是两倍)。将此量称为 COR(X[a],X[b])。显然 COR(X[a],X[a]) = 1,如果 word[a], word[b] 通常相邻,则 COR(X[a],X[b]) 更大。
这可以从“相邻”推广到其他近的概念——例如,我们可以选择使用 3 个单词(或 4、5 等)块来代替。还可以添加权重,如果需要,还可以做更多的事情。如果其中任何一种有用的话,人们必须进行试验才能看到有用的东西。
这个问题听起来像是一个二元组,一个更大的文本正文中的两个“标记”序列。请参阅此 Wikipedia entry,其中包含指向更一般的 n-gram 问题的附加链接。
如果您想进行全面分析,您很可能会采用任何给定的单词对并进行频率分析。例如,“巴拉克奥巴马是民主党总统候选人”这句话有 8 个单词,所以有 8 个选择 2 = 28 个可能的配对。
然后你可以问一些统计问题,比如“‘奥巴马’跟在‘巴拉克’后面有多少对,其他词(不是‘奥巴马’)跟在‘巴拉克’后面有多少对?在这种情况下,有 7 对其中包括“巴拉克”,但只有其中一个与“奥巴马”配对。
对每个可能的词对都做同样的事情(例如,“有多少对‘候选人’跟在‘the’后面?”),你就有了比较的基础。