2017-01-30 2 views
0

Предположим, мы следующий текстподсчета частоты букв в тексте с использованием MATLAB

s='i love georgia and its nature'; 

то, что я хочу, чтобы подсчитать частоту появления каждой буквы (пространство не включены, конечно) и эскиз некоторые диаграммы (например, гистограмма), первый я создал код, который подсчитывает письма, используя контейнер карты

function character_count(s) 
    % s is given string and given program will count occurence of letters in 
    % sentence 
    MAP=containers.Map();% initialize MAP for frequency counting 
    n=length(s); % get length of given string 
    letters=unique_without_space_sorting(s); 
    for ii=1:n 
     if ~isletter(s(ii))==1 
      continue; 
     elseif isKey(MAP,s(ii)) 
      MAP(s(ii)) = MAP(s(ii)) + 1; 
     else 
      MAP(s(ii)) = 1; 

     end 
    end 
     y=values(MAP); 
     y= cell2mat(y); 
    bar(y); 
    set(gca,'xticklabel',letters) 

    end 

здесь функционируют

letters=unique_without_space_sorting(s); 

возвращает элемент массива букв строки s без сортировки и пространства, здесь его соответствующий код

function cell_stirng=unique_without_space_sorting(s) 
    s=regexprep(s,'[^\w'']',''); 
    [~, idxs, ~] = unique(s, 'last'); 
    s= s(sort(idxs)); 
    n=length(s); 
    cell_stirng=cell(n,1); 
    for jj=1:n 
     cell_string{jj}=s(jj); 
    end 
    end 

, когда я запускаю этот код, я получил следующее изображение enter image description here

, как вы видите, нет этикеток на оси x, как я могу исправить эту проблему? спасибо заранее

+3

Заголовок вопроса не имеет ничего общего с фактической проблемой/проблемой. – P0W

+0

Обычно в таких случаях вы очищаете ввод, используя некоторое регулярное выражение всех нерелевантных символов, затем либо конвертируете его в один и тот же регистр (WLG: нижний регистр), либо нет - в зависимости от того, что вы определяете как «уникальную» букву. Затем создайте гистограмму с буквами значений ASCII алфавита в виде бункеров (для этого '' histcounts' использует метод '' integers''). Это также покажет вам письма, которые вообще не появляются. –

+0

@ P0W какое будет релевантное имя? –

ответ

5

Вы можете использовать первый выход unique, чтобы дать вам уникальные значения и использовать их в качестве х этикетки

[values, idxs, ~] = unique(s, 'last'); 

% Make sure that they aren't sorted 
[~, sortind] = sort(idxs); 
values = num2cell(values(sortind)); 

% And later after creating your bar plot 
set(gca, 'xtick', 1:numel(values), 'XTickLabels', values); 

Или вместо того, чтобы делать это, вы можете просто использовать stable вход для unique чтобы убедиться, что они находятся в порядке внешнего вида.

S = lower(strrep(s, ' ', '')); 
[values, ~, b] = unique(S, 'stable'); 

hist(b, unique(b)) 
set(gca, 'xtick', 1:numel(values), 'xticklabels', num2cell(values)) 

Или, если вы хотите гистограмму всех букв

S = lower(strrep(s, ' ', '')); 
counts = histcounts(double(S), double('a':'z')); 
bar(counts) 
set(gca, 'xtick', 1:26, 'xticklabels', num2cell('a':'z')) 
+0

, но уникальный возвращает отсортированный массив, который будет смешивать вещи друг с другом –

+0

теперь я думаю, что получил очко, подождите пожалуйста –

+0

спасибо, я понял полностью –

1

Как об этом, как более простой метод?

str = 'i love georgia and its nature'; 

num_times = zeros(26,1); 
letters = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', ... 
      'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'}; 

for k = 1:length(str) 

    % Convert letter to its lower case, get ASCII value, 
    % a = 97, b = 98, ..., z = 122 
    n = uint16(lower(str(k))); 

    % If character between 'a' and 'z' 
    if n < 122 && n > 97 

     % Convert to be between 1 and 26 
     n = n - 96; 

     % Index count array with n   
     num_times(n) = num_times(n) + 1; 

    end 

end 

clf 
stem(num_times); 
set(gca, 'XTick', 1:26); 
set(gca,'XTickLabel', letters) 

Выход:

Plot of letter frequency

Если вы не хотите, чтобы изменить другой код, увидеть последние 2 строки шахты для маркировки оси х.

Edit:

Вы можете использовать эти строки для построения вместо выше, так что только буквы, которые имеют ненулевую частоту нанесены

clf 
stem(num_times(num_times ~= 0));  
set(gca, 'XTick', 1:sum(num_times ~= 0)); 
set(gca,'XTickLabel', letters(num_times ~= 0)) 

Выход:

unique letter frequencies

+0

Я рад, если вы посетите Джорджию, это очень красивая страна –

+0

Я использовал вашу примерную строку ... этот код работает для вас? – Wolfie

+0

Я не тестировал ваш код, но спасибо заранее –

Смежные вопросы