如何计算单词共现

时间:2013-07-28 21:39:52

标签: string matlab

我有一串长度为50的字符,表示从集abbcda....中获取的字母表的序列A={a,b,c,d}

我想计算b跟随另一个b(n-gram)的次数,其中n = 2。

类似地,特定字符重复三次连续三次n = 3,例如在输入字符串abbbcbbb等中,所以这里{3}字母序列中b出现的次数是2

4 个答案:

答案 0 :(得分:6)

要查找可以使用的非重叠2克数

numel(regexp(str, 'b{2}'))

和3克

numel(regexp(str, 'b{3}'))

计算重叠的2克使用正向前瞻

numel(regexp(str, '(b)(?=b{1})'))

和重叠n - 克

numel(regexp(str, ['(b)(?=b{' num2str(n-1) '})']))

修改 为了找到任意序列的出现次数,请使用第一个括号中的第一个元素和等号后的其余元素,以查找ba使用

numel(regexp(str, '(b)(?=a)'))

查找bda使用

numel(regexp(str, '(b)(?=da)'))

答案 1 :(得分:1)

您可以尝试使用ismemberdoc)。

的这段代码
%generate string (50 char, 'a' to 'd') 
str = char(floor(97 + (101-97).*rand(1,50)))

%digram case
index_digram = ismember(str, 'aa');

%trigram case
index_trigram = ismember(str, 'aaa');

修改

可以使用

计算概率
proba = sum(index_digram)/length(index_digram);

答案 2 :(得分:1)

以Magla的提议为基础:

str = 'abcdabbcdaabbbabbbb'; % for example
index_single = ismember(str, 'b');
index_digram = index_single(1:end-1)&index_single(2:end);
index_trigram = index_single(1:end-2)&index_single(2:end-1)&index_single(3:end);

答案 3 :(得分:1)

这将找到所有n-gram并计算它们:

numberOfGrams = 5;
s = char(floor(rand(1,1000)*4)+double('a'));
ngrams = cell(1);
for n = 2:numberOfGrams
    strLength = size(s,2)-n+1;
    indices = repmat((1:strLength)',1,n)+repmat(1:n,strLength,1)-1;
    grams = s(indices);
    gramNumbers = (double(grams)-double('a'))*((ones(1,n)*n).^(0:n-1))';
    [uniqueGrams, gramInd] = unique(gramNumbers);
    count=hist(gramNumbers,uniqueGrams);
    ngrams(n) = {struct('gram',grams(gramInd,:),'count',count)};
end

编辑:

结果将是:

ngrams{n}.gram       %a list of all n letter sequences in the string
ngrams{n}.count(x)   %the number of times the sequence ngrams{n}.gram(x) appears