在matlab中找到最常用的单词

时间:2018-03-02 02:40:09

标签: matlab matrix

我有一个如下矩阵:

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可以帮助我,但不确定如何?

2 个答案:

答案 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