5

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

我想计算n = 2b的另一个(n-gram)后面跟着多少次。b

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

4

4 回答 4

6

要查找您可以使用的非重叠 2-gram 的数量

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

对于 3 克

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

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

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

对于重叠n-gram

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

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

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

找到bda用处

numel(regexp(str, '(b)(?=da)'))
于 2013-07-28T22:52:28.150 回答
1

ismember您可以尝试使用( doc )的这段代码。

%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);
于 2013-07-28T21:57:12.293 回答
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);
于 2013-07-28T22:16:15.227 回答
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
于 2013-07-28T23:14:50.427 回答