2

我试图在单词列表中找到最常用的单词。到目前为止,这是我的代码:

uniWords = unique(lower(words));
for i = 1:length(words)
    for j = 1:length(uniWords)
        if (uniWords(j) == lower(words(i)))
            freq(j) = freq(j) + 1;
        end
    end
end

当我尝试运行脚本时,出现以下错误:

Undefined function 'eq' for input arguments of
type 'cell'.

Error in Biweekly3 (line 106)
    if (uniWords(j) == lower(words(i)))

任何帮助表示赞赏!

4

3 回答 3

2

不需要循环。unique为每个单词提供一个唯一标识符,然后您可以将每个标识符的出现与sparse. 从中您可以轻松找到最大值和最大化单词:

[~, ~, jj ] = unique(lower(words));
freq = full(sparse(ones(1,length(jj)),jj,1)); % number of occurrences of each word
m = max(freq);
result = lower(words(jj(freq==m))); % return more than one word if there's a tie

例如,与

words = {'The','hello','one','bye','the','one'}

结果是

>> result

result = 

    'one'    'the'
于 2013-11-09T00:26:58.513 回答
2

您需要使用以下命令提取单元格的内容{}

strcmpi(uniWords{j},words{i})

另外,我建议在这种情况下将字符串与strcmpor进行比较strcmpi,它会忽略大小写,因此您不需要调用lower.

在字符串上使用时要小心,==因为它们的长度必须相同,否则会出现错误:

>> s1='first';
>> s2='second';
>> s1==s2
Error using  == 
Matrix dimensions must agree. 
于 2013-11-08T23:25:51.083 回答
2

我想你需要这样做:

if (uniWords{j} == lower(words{i}))

另外,我建议不要在 MATLAB 中使用iandj作为变量

更新

正如 Chappjc 指出的那样,最好使用strcmp(或在您的情况下strcmpi跳过lower),因为您想忽略案例。

于 2013-11-08T23:25:52.707 回答