我有一个如下矩阵:
vector = vectorizer.transform(corpus).toarray()
第一列表示document_id,第二列表示word_id,第三列表示它在document_id中的出现。 我想在整个文档中找到前3个单词的频率。而不是仅使用大量循环,在Matlab中执行此操作的更好方法是什么?
我最初的想法是使用:
temp=[1 1 6;
1 2 6;
1 3 7;
1 4 1;
2 1 1;
2 2 2;
2 3 5;
2 4 6;
3 1 4;
3 2 3;
3 3 5;
3 4 7;];
我猜histcount或accumarray可以帮助我,但不确定如何?
答案 0 :(得分:1)
哇!这是我正在寻找的答案:
sortrows(splitapply(@sum, sorted(:, 3), findgroups(sorted(:, 2))), -1)
ans =
17
14
11
11
https://www.mathworks.com/help/matlab/ref/splitapply.html
** Update1:实际上不是。因为它没有告诉我第二列中哪个word_id正在创建这个
** Update2:虽然我可以获得最高频率的word_id,但我无法使用以下方法获得前3个频率的word_id:
>> [index, max_val] =max(splitapply(@sum, sorted(:, 3), findgroups(sorted(:, 2))))
index =
17
max_val =
3
正确的最终答案:
>> [frequencies, original_positions] = sort(splitapply(@sum, sorted(:, 3), findgroups(sorted(:, 2))), 'descend')
frequencies =
17
14
11
11
original_positions =
3
4
1
2
答案 1 :(得分:1)
如果您对使用accumarray
的解决方案感兴趣(正如您所料),请访问:
[Pos, ~, ind] = unique(temp(:,2)); %Finding unique word IDs (unsorted)
freq = accumarray(ind, temp(:,3)); %Frequencies (unsorted)
获得前3个。按降序对频率进行排序,并在前三个索引中提取值(或按升序排序,并在最后三个索引中提取值)。
PosFreq = sortrows([Pos freq], 2, 'descend'); %Sorting according to frequencies
Top3PosFreq = PosFreq(1:3,:); %Extracting top three frequencies
结果:
Top3PosFreq =
3 17
4 14
1 11