Как я могу объединить две матрицы совместного использования с перекрывающимися, но не идентичными словарями?
Я смотрю на совпадение слов в ряде документов. Для каждого набора документов я нахожу словарь из 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;