2014-04-22 4 views
1

Моя цель - генерировать фонетическую транскрипцию для любого слова в соответствии с набором правил.Разделить слово с регулярным выражением в matlab; startIndex для «split»?

Во-первых, я хочу разбить слова на свои слоги. Например, я хочу алгоритм, чтобы найти «ч» в слове, а затем отделить его, как показано ниже:

Input: 'aachbutcher' 
Output: 'a' 'a' 'ch' 'b' 'u' 't' 'ch' 'e' 'r' 

Я пришел до сих пор:

check=regexp('aachbutcher','ch'); 

if (isempty(check{1,1})==0)   % Returns 0, when 'ch' was found. 

    [match split startIndex endIndex] = regexp('aachbutcher','ch','match','split') 

    %Now I split the 'aa', 'but' and 'er' into single characters: 
    for i = 1:length(split) 
     SingleLetters{i} = regexp(split{1,i},'.','match'); 
    end 

end 

Моей проблема: Как соединить ячейки, чтобы они отформатировались как желаемый результат? У меня есть только начальные индексы для частей матча ('ch'), но не для разделенных частей ('aa', 'but', 'er').

Любые идеи?

+0

Возьмем разницу 'startIndex', чтобы получить длину? – Floris

ответ

0

Вам не нужно работать с индексами или длиной. Простая логика: Процесс первый элемент из матча, то первый из раскола, то второй из матча и т.д. ....

[match,split,startIndex,endIndex] = regexp('aachbutcher','ch','match','split'); 

%Now I split the 'aa', 'but' and 'er' into single characters: 
SingleLetters=regexp(split{1,1},'.','match'); 

for i = 2:length(split) 
    SingleLetters=[SingleLetters,match{i-1},regexp(split{1,i},'.','match')]; 
end 
+0

работал отлично, спасибо! вы можете исправить опечатку в третьей строке («i»). Я думал, что этот метод не будет работать, когда слово начинается с «ch», но, к счастью, split {1,1} является пустой записью в этом случае. – jonen

0

Итак, вы знаете длину «ч», это 2. Вы знаете, где вы его нашли из regex, так как эти индексы хранятся в startIndex. Я Принимаю (Пожалуйста, исправьте меня, если я ошибаюсь), что вы хотите разбить все другие буквы этого слова на однобуквенные ячейки, например, на вашем выходе выше. Таким образом, вы можете просто использовать данные STARTINDEX, чтобы построить свой выход, используя условные, как это:

check=regexp('aachbutcher','ch'); 

if (isempty(check{1,1})==0)   % Returns 0, when 'ch' was found. 

    [match split startIndex endIndex] = regexp('aachbutcher','ch','match','split') 

    %Now I split the 'aa', 'but' and 'er' into single characters: 
    for i = 1:length(split) 
     SingleLetters{i} = regexp(split{1,i},'.','match'); 
    end 

end 

j = 0; 
for i = 1 : length('aachbutcher') 
    if (i ~= startIndex(1)) && (i ~= startIndex(2)) 
     j = j +1; 
     output{end+1} = SingleLetters{j}; 
    else 
     i = i + 1;  
     output{end+1} = 'ch'; 
    end 
end 

Я не имею MATLAB прямо сейчас, поэтому я не могу проверить это. Надеюсь, это сработает для вас! Если нет, дайте мне знать, и я возьму пыльник.

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