Я не знаю, как это обычно делается, но я могу придумать один грубый способ определить понятие корреляции, которое фиксирует смежность слов.
Предположим, что текст имеет длину 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