2013-07-28 8 views
5

मेरे पास लंबाई A={a,b,c,d} से लिया गया वर्णमाला के लिए अनुक्रम abbcda.... अनुक्रम का प्रतिनिधित्व करने वाले अक्षरों का एक स्ट्रिंग है।शब्द सह-अवसर की गणना कैसे करें

मैं गणना करना चाहता हूं कि b कितनी बार b (एन-ग्राम) जहां n = 2 है।

इसी तरह, कितनी बार एक विशेष चरित्र दोहराया है तीन बार n = 3 लगातार, इनपुट स्ट्रिंग abbbcbbb आदि इसलिए यहाँ समय की संख्या b 3 अक्षरों का एक क्रम में होता है में कहते हैं कि 2.

+1

5 जवाब और 1 ऊपर वोट! – marsei

उत्तर

6

गैर-अतिव्यापी 2- की संख्या पता करने के लिए ग्राम आप

का उपयोग कर सकते हैं
numel(regexp(str, 'b{2}')) 

और के लिए 3-ग्राम

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

ओवरलैपिंग 2-ग्राम सकारात्मक अग्रदर्शी

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

का उपयोग करें और n ओवरलैपिंग के लिए गिनती करने के लिए -grams

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

संपादित आदेश एक मनमाना अनुक्रम पहले कोष्टक में पहला तत्व और समानता पर हस्ताक्षर के बाद आराम का उपयोग की पुनरावृत्ति की संख्या खोजने के लिए, bda उपयोग

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

यह एक विजेता है। – voxeloctree

+0

'str = 'abbbcbbbbdbbabbb'' और' n = 2' के लिए यह गिनती होगी 5. मैं वास्तव में अनिश्चित हूं अगर यह ओपी द्वारा चाहता था। – Oleg

+0

@OlegKomarov सच है, यह निर्भर करता है कि क्या आप ओवरलैपिंग मैचों की तलाश में हैं या नहीं। मैंने जवाब अपडेट किया और मुझे लगता है कि ओपी ओवरलैपिंग मैचों की तलाश में है। –

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'); 

संपादित

प्रायिकता Magla द्वारा प्रस्ताव पर

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

आपके त्वरित उत्तर के लिए धन्यवाद। क्या संभावनाओं को जानने का कोई तरीका है? संभावनाओं की गणना कैसे की जा सकती है? –

+0

मैटलैब का कौन सा संस्करण आप उपयोग कर रहे हैं? ऐसा लगता है कि यह R2007a –

+0

अजीब - R2012b पर काम नहीं कर रहा है - यह 2007 2007 के लिए ऑनलाइन सहायता नहीं ढूंढ सकता है। कृपया संभावनाओं के लिए संपादन देखें। – marsei

1

भवन के साथ की जा सकती है:

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

इस खोजने के लिए ba उपयोग

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

को खोजने के लिए सभी एन-ग्राम खोजने के लिए और उन्हें गिनती:

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

धन्यवाद, लेकिन क्या ऐसा कुछ ऐसा मिलेगा जो बी के बाद गिनती है? –

+0

अच्छी तरह से, हाँ, यह किसी भी एन-अक्षर 'शब्द' की घटनाओं की संख्या की गणना करेगा। – pseudoDust

संबंधित मुद्दे