我有一串长度为 50 的字符,表示abbcda....
从集合中获取的字母序列A={a,b,c,d}
。
我想计算n = 2b
的另一个(n-gram)后面跟着多少次。b
类似地,一个特定字符连续重复三次 n=3 的次数,比如在输入字符串等中,所以这里在3 个字母的序列中出现abbbcbbb
的次数是 2。b
要查找您可以使用的非重叠 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)'))
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);
基于 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);
这将找到所有 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