Есть ли способ найти сходство между двумя корпусами? - PullRequest
0 голосов
/ 23 апреля 2020

Я бы хотел измерить сходство двух корпусов. До сих пор я проверял сходство:

  • сходство Жакара
  • коэффициент Кости
  • коэффициент ранговой корреляции Спирмена
  • критерий Chi2

в отношении рангового коэффициента корреляции Спирмена, код выглядит следующим образом:

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?

Что касается третьего вопроса, существует ли какой-либо метод для вычисления сходства между двумя корпусами, а не словами или предложениями?

1 Ответ

1 голос
/ 23 апреля 2020

Сначала вам нужно решить, как вы определяете сходство между двумя текстами. Если это будет

  1. те же слова, что и с похожими частотами
  2. похожие слова в сходном порядке
  3. общее совпадение в словаре
  4. очень мало слов не разделяется между текстами
  5. слова, используемые в одном и том же контексте
  6. перекрытия последовательностей из нескольких слов (n-граммы)
  7. ...

Существуют разные способы определения сходства, и пока вы не знаете, что ищете, нет смысла придумывать метрики. «Сходство» между текстами не является абсолютной, объективной концепцией.

...