我有一串长度为50的字符,表示从集abbcda....
中获取的字母表的序列A={a,b,c,d}
。
我想计算b
跟随另一个b
(n-gram)的次数,其中n = 2。
类似地,特定字符重复三次连续三次n = 3,例如在输入字符串abbbcbbb
等中,所以这里{3}字母序列中b
出现的次数是2
答案 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)
您可以尝试使用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);
答案 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