Рассчитать коэффициент корреляции между словами?

Для программы анализа текста я хотел бы проанализировать совпадение определенных слов в тексте. Например, я хотел бы видеть, что, например. слова «Барак» и «Обама» чаще встречаются вместе (т.е. имеют положительную корреляцию), чем другие.

Это не кажется таким уж трудным. Однако, если честно, я умею вычислять корреляцию только между двумя числами, но не между двумя словами в тексте.

  1. Как мне лучше всего подойти к этой проблеме?
  2. Как я могу вычислить корреляцию между словами?

Я подумал об использовании условных вероятностей, так как, например. Барак Обама гораздо более вероятен, чем Обама Барак; однако проблема, которую я пытаюсь решить, гораздо более фундаментальна и не зависит от порядка слов


person navige    schedule 16.10.2012    source источник
comment
Я считаю, что у вас больше шансов получить хороший ответ на stats.stackexchange.com   -  person Ali    schedule 16.10.2012


Ответы (4)


Именно этой задаче посвящен Пакет статистики Ngram (NSP). У них есть онлайн-бумага, в которой описываются меры ассоциации, которые они используют. . Сам пакетом не пользовался, поэтому не могу комментировать его надежность/требования.

person Hans    schedule 17.10.2012

Ну, простой способ решить ваш вопрос - сформировать данные в матрице 2x2.

            obama | not obama
barack      A       B
not barack  C       D

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

person Jeroen Vuurens    schedule 16.10.2012

Я не знаю, как это обычно делается, но я могу придумать один грубый способ определить понятие корреляции, которое фиксирует смежность слов.

Предположим, что текст имеет длину 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-й элемент вектора равен 1, если слово является либо i-м словом, либо (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;
}

Затем вы можете вычислить коэффициент корреляции между словом[a] и словом[b] как скалярное произведение между X[a] и X[b] (обратите внимание, что скалярное произведение — это количество раз, когда эти слова соседствуют), деленное на длины (длина - это квадратный корень из числа появлений слова, ну, может быть, в два раза больше). Назовите эту величину COR(X[a],X[b]). Ясно, что COR(X[a],X[a]) = 1, а COR(X[a],X[b]) больше, если слово[a], слово[b] часто являются соседними.

Это можно обобщить от «прилегающего» к другим понятиям «близкий» — например, мы могли бы вместо этого использовать блоки из 3 слов (или 4, 5 и т. д.). Можно также добавить веса, возможно, при желании можно сделать и многое другое. Нужно было бы поэкспериментировать, чтобы увидеть, что полезно, если вообще что-то из этого полезно.

person amomin    schedule 17.10.2012

Эта проблема звучит как биграмма, последовательность двух «токенов» в большом тексте. См. эту статью в Википедии, в которой есть дополнительные ссылки на более общую проблему n-грамм.

Если вы хотите провести полный анализ, вы, скорее всего, возьмете любую пару слов и проведете частотный анализ. Например, предложение «Барак Обама является кандидатом в президенты от Демократической партии» состоит из 8 слов, поэтому существует 8 вариантов выбора 2 = 28 возможных пар.

Затем вы можете задать статистические вопросы, например: «В скольких парах «Обама» следует за «Бараком» и в скольких парах какое-то другое слово (не «Обама») следует за «Бараком»? В этом случае есть 7 пар. которые включают «Барак», но только в одном из них он сочетается с «Обамой».

Сделайте то же самое для каждой возможной пары слов (например, «в скольких парах «кандидат» следует за «то»?»), и вы получите основу для сравнения.

person OrangeWombat    schedule 17.10.2012