Как я могу объединить две матрицы совместного использования с перекрывающимися, но не идентичными словарями?

Я смотрю на совпадение слов в ряде документов. Для каждого набора документов я нахожу словарь из N наиболее часто встречающихся слов. Затем я создаю матрицу NxN для каждого документа, представляющую, встречаются ли слова вместе в одном и том же контекстном окне (последовательность из k слов). Это разреженная матрица, поэтому, если у меня M документов, у меня есть разреженная матрица NxNxM. Поскольку Matlab не может хранить разреженные матрицы с более чем двумя измерениями, я сплющил эту матрицу в (NxN)xM разреженную матрицу.

Я сталкиваюсь с проблемой, что я сгенерировал 2 из этих матриц совместного использования для различных наборов документов. Потому что наборы были разные, словари разные. Вместо того, чтобы объединять наборы документов вместе и пересчитывать матрицу совместного использования, я хотел бы объединить две существующие матрицы.

Например,

N = 5; % Size of vocabulary
M = 5; % Number of documents
A = ones(N*N, M); % A is a flattened (N, N, M) matrix
B = 2*ones(N*N, M); % B is a flattened (N, N, M) matrix
A_ind = {'A', 'B', 'C', 'D', 'E'}; % The vocabulary labels for A
B_ind = {'A', 'F', 'B', 'C', 'G'}; % The vocabulary labels for B

Должны объединиться, чтобы получить (49, 5) матрицу, где каждый (49, 1) срез, который может быть преобразован в (7,7) матрицу со следующей структурой.

     A     B     C     D     E     F     G
 __________________________________________
 A|   3     3     3     1     1     2     2
 B|   3     3     3     1     1     2     2
 C|   3     3     3     1     1     2     2
 D|   1     1     1     1     1     0     0
 E|   1     1     1     1     1     0     0
 F|   2     2     2     0     0     2     2
 G|   2     2     2     0     0     2     2

Там, где A и B перекрываются, подсчеты совпадений должны суммироваться. В противном случае, элементы должны быть счетчиками из A или счетчиками из B. В некоторых элементах (в примере 0) у меня нет статистики подсчета, потому что часть словарного запаса находится исключительно в A, а другая - исключительно в B,

1 ответ

Решение

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

A = ones(25, 5);
B = 2*ones(25,5);
A_ind = {'A', 'B', 'C', 'D', 'E'};
B_ind = {'A', 'F', 'B', 'C', 'G'};

new_ind = [A_ind, B_ind(~ismember(B_ind, A_ind))];
new_size = length(new_ind)^2; 
new_array = zeros(new_size, 5); 

% Find the indices that correspond to elements of A
A_overlap = double(ismember(new_ind, A_ind)); 
A_mask = (A_overlap'*A_overlap)==1;

% Find the indices that correspond to elements of B
B_overlap = double(ismember(new_ind, B_ind)); 
B_mask = (B_overlap'*B_overlap)==1;

% Flatten the logical indices to assign the elements to the new array
new_array(A_mask(:), :) = A;
new_array(B_mask(:), :) = new_array(B_mask(:), :) + B;
Другие вопросы по тегам