在matlab中找到最常用的单词

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在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;];

第一列表示document_id,第二列表示word_id,第三列表示它在document_id中的出现。我想在整个文档中找到前3个单词的频率。而不是仅使用大量循环,在Matlab中执行此操作的更好方法是什么?

我有一个初步的想法:

sorted=sortrows(temp, 2)

我猜histcount或accumarray可以帮助我,但不知道如何?

答案

哇!这是我正在寻找的答案:

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

如果您对使用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

以上是关于在matlab中找到最常用的单词的主要内容,如果未能解决你的问题,请参考以下文章

找出一本大书中最常用的 10 个单词 [重复]

如何找到使用Python的数据上最常用的单词? [重复]

21个常用代码片段

前端开发中最常用的JS代码片段

最全最详细publiccms常用的代码片段

最全最详细publiccms其他常用代码片段(内容站点)