2013-07-28 23 views
5

Tôi có chuỗi ký tự có độ dài 50 nói đại diện cho một chuỗi abbcda.... cho bảng chữ cái được lấy từ tập hợp A={a,b,c,d}.Cách tính từ đồng xảy ra

Tôi muốn tính số lần b tiếp theo là b (n-grams) khác n = 2.

ba lần Tương tự như vậy, bao nhiêu lần một nhân vật cụ thể được lặp đi lặp lại n = 3 liên tiếp, nói trong chuỗi đầu vào abbbcbbb vv vì vậy đây số lần b xảy ra trong một chuỗi của 3 chữ là 2.

+1

5 câu trả lời và 1 bình chọn! – marsei

Trả lời

6

Để tìm số không chồng chéo 2- gram bạn có thể sử dụng

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

và cho 3 gam

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

để đếm chồng chéo 2-gram sử dụng lookahead dương

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

và cho chồng chéo n -grams

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

EDIT Để tìm số lần xuất hiện của một chuỗi tùy ý sử dụng các yếu tố đầu tiên trong ngoặc đầu tiên và phần còn lại sau khi đăng bình đẳng, để tìm ba sử dụng

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

để tìm bda sử dụng

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

Đây là người chiến thắng. – voxeloctree

+0

Đối với 'str = 'abbbcbbbbdbbabbb'' và' n = 2' điều này sẽ đếm 5. Tôi thực sự không chắc chắn nếu điều này là mong muốn của OP. – Oleg

+0

@OlegKomarov đúng, phụ thuộc nếu bạn đang tìm kiếm các kết quả trùng lặp trùng lặp hay không. Tôi đã cập nhật câu trả lời và tôi nghĩ OP đang tìm kiếm các kết quả trùng lặp. –

1

Bạn có thể thử đoạn mã này sử dụng 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'); 

EDIT

Xác suất có thể được tính với

proba = sum(index_digram)/length(index_digram); 
+0

Cảm ơn bạn đã trả lời nhanh chóng. Có cách nào để tìm ra xác suất không? Làm thế nào xác suất có thể được tính toán? –

+0

Bạn đang sử dụng phiên bản Matlab nào? Dường như không hoạt động trên R2007a –

+0

lạ - R2012b - không thể tìm thấy trợ giúp trực tuyến cho ismember 2007a. Vui lòng xem chỉnh sửa cho xác suất. – marsei

1

Xây dựng về đề xuất này bởi 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); 
1

này sẽ tìm tất cả các chữ cái n và đếm chúng:

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 

chỉnh sửa:

kết quả sẽ là:

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 
+0

Cảm ơn bạn, nhưng điều này sẽ tìm thấy một cái gì đó như thế này mà đếm b theo sau là một? –

+0

tốt, vâng, nó sẽ đếm số lần xuất hiện của bất kỳ chữ cái n chữ nào. – pseudoDust

Các vấn đề liên quan