首页 > 解决方案 > 有什么方法可以找到两个语料库之间的相似性吗?

问题描述

我想测量两个语料库的相似性。到目前为止,我尝试过的相似性检查如下:

关于Spearman的秩相关系数,代码如下;

def Spearman_rank_correlation_coefficient(another_word_freq_dict):
 num = 5120
 main_freq = list(min_word_freq_dict.keys())[:num]
 df_freq = list(another_word_freq_dict.keys())[:num]
 spearmen = []
 for i,word in enumerate(main_freq):
    i = i+1
    try:
        j = df_freq.index(word)+1
        spearmen.append((i-j)**2)
    except ValueError:
        j = num+1
        spearmen.append((i-j)**2)
 val = sum(spearmen)
 return 1 - (6*val)/(num**3 - num)

在这里,我从主语料库和另一个语料库中选取了前 5120 个最常用的词。我的问题在除了 ValueError 的行下方,我将 5121 指定为在另一个语料库前 5120 词频列表中找不到的词的排名。当主语料库中的一个词在斯皮尔曼的等级相关系数中没有在另一个语料库中找到时,这是正确的处理程序吗?

关于适合度良好的 Chi_2 测试,我编写了以下代码;

def chi2_test(another_word_freq_dict):
 num_words = 3000
 N1 = sum(main_word_freq_dict.values())
 main_ = dict([(key,val/N1) for key,val in main_word_freq_dict.items()])
 main_dict = dict([(k,main_[k]) for k in list(main_.keys())[:num_words]])
 another_dict = dict([(k,another_word_freq_dict[k]) for k in list(another_word_freq_dict.keys())[:num_words]])
 N_words = sum(another_dict.values()) #number of words appeared in another corpus
 N_unique_words = len(another_dict) # number of tokens in another corpus
 chi = []
 for word,expected in main_dict.items():
    try:
        observed = (another_dict[word]+1)/(N_words+N_unique_words) #laplace add-one smoothing
    except KeyError: #if a word in main is not in another courpus
        observed = 1/(N_words+N_unique_words)

    val = (expected - observed)**2/expected
    chi.append(val)

 return sum(chi)

我的第二个问题是我的 chi2 功能测试代码是否有意义?

对于第三个问题,是否有任何方法可以计算两个语料库之间的相似度,而不是单词或句子?

标签: pythonnlpsimilaritycorpuschi-squared

解决方案


您首先需要决定如何定义两个文本之间的相似性。这应该是

  1. 以相似频率使用的相同词
  2. 相似的词以相似的顺序
  3. 词汇上的一般重叠
  4. 文本之间没有共享的单词很少
  5. 在相同上下文中使用的词
  6. 多词序列的重叠(n-gram)
  7. ...

有不同的方法来定义相似性,在你知道你在寻找什么之前,提出指标是没有意义的。文本之间的“相似性”并不是一个绝对的、客观的概念。


推荐阅读