2016-03-26 8 views
0

Ich habe in der Graphem-Phonem-Umwandlung in Matlab gearbeitet und versucht, einen verallgemeinerten Code zu erzeugen, um zuerst das Wort in die einzelnen Konsonanten, Digraphen und ihre verwandten Vokale zu zerlegen und jede eingegebene Zeichenkette in ihre Graphemform zu segmentieren damit es später die passende phonetische Synthese erzeugen kann. Aufgrund des Vorhandenseins einer großen Anzahl von Regeln und daher einer großen Menge von if-elseif-else, die sich durch jeden Buchstaben und das Vorhandensein von wachsenden Arrays schlängeln, hat die Zeitkomplexität jedoch mannigfaltig zugenommen und gibt kein Ergebnis mehr (es zeigt beschäftigt an , jedes Mal, wenn ich eine Eingabe über die Konsole eingeben. Also, wenn Sie könnten mir bitte helfen, den Code zu vereinfachen, ist hier unten:Wie formuliert man englische Grapheme aus einer Zeichenkette in Matlab, indem man die Zeitkomplexität reduziert?

prompt='Enter a string: '; 
str=input(prompt,'s'); 
l=length(str); 
grapheme=[]; 
i=1; 

while (i<=l) 

     if strcmpi(str(i),'b') 
      grapheme=[grapheme;{'b'}]; 
     elseif strcmpi(str(i:i+1),'bb') 
      grapheme=[grapheme;{'b'}]; 
      i=i+1; 
     elseif strcmpi(str(i),'d') 
      grapheme=[grapheme;{'d'}]; 
     elseif strcmpi(str(i:i+1),'dd')||strcmpi(str(i:i+1),'ed') 
      grapheme=[grapheme;{'d'}]; 
      i=i+1; 
     elseif strcmpi(str(i),'f') 
      grapheme=[grapheme;{'f'}]; 
     elseif strcmpi(str(i:i+1),'ff')||strcmpi(str(i:i+1),'ph')||strcmpi(str(i:i+1),'gh') 
      grapheme=[grapheme;{'f'}]; 
      i=i+1; 
     elseif strcmpi(str(i),'g') 
      grapheme=[grapheme;{'g'}];   
     elseif strcmpi(str(i:i+1),'gg')%||strcmpi(str(i:i+2),'gue') 
      grapheme=[grapheme;{'g'}]; 
      i=i+1; 
     elseif strcmpi(str(i),'h') 
      grapheme=[grapheme;{'h'}]; 
     elseif strcmpi(str(i:i+1),'wh') && strcmpi(str(i+2),'o') 
      grapheme=[grapheme;{'h'}]; 
      i=i+1; 
     elseif strcmpi(str(i),'j') 
      grapheme=[grapheme;{'j'}]; 
     elseif strcmpi(str(i:i+1),'ge')||strcmpi(str(i:i+1),'jj') 
      grapheme=[grapheme;{'j'}]; 
      i=i+1; 
%   elseif strcmpi(str(i:i+2),'dge') 
%   grapheme=[grapheme;{'j'}]; 
%   i=i+2; 
     elseif strcmpi(str(i),'k')||strcmpi(str(i),'c') 
      grapheme=[grapheme;{'k'}]; 
     elseif strcmpi(str(i),'ck')||strcmpi(str(i),'cc')||strcmpi(str(i),'qu') 
      grapheme=[grapheme;{'k'}]; 
      i=i+1; 
     elseif strcmpi(str(i),'l') 
      grapheme=[grapheme,{'l'}]; 
     elseif strcmpi(str(i),'ll')||strcmpi(str(i),'le') 
      grapheme=[grapheme,{'l'}]; 
      i=i+1; 
     elseif strcmpi(str(i),'m') 
      grapheme=[grapheme,{'m'}]; 
     elseif strcmpi(str(i),'mm')||strcmpi(str(i),'lm')||strcmpi(str(i),'mn') 
      grapheme=[grapheme;{'m'}]; 
      i=i+1; 
     elseif strcmpi(str(i),'n') 
      grapheme=[grapheme,{'n'}]; 
     elseif strcmpi(str(i),'nn')||strcmpi(str(i),'kn')||strcmpi(str(i),'pn')||strcmpi(str(i),'gn') 
      grapheme=[grapheme;{'n'}]; 
      i=i+1; 
     elseif strcmpi(str(i),'p') 
      grapheme=[grapheme;{'p'}]; 
     elseif strcmpi(str(i),'pp') 
      grapheme=[grapheme;{'p'}]; 
      i=i+1; 
     elseif strcmpi(str(i),'r') 
      grapheme=[grapheme;{'r'}]; 
     elseif strcmpi(str(i),'rr')||strcmpi(str(i),'wr')||strcmpi(str(i),'rh') 
      grapheme=[grapheme;{'r'}]; 
      i=i+1; 
     elseif strcmpi (str(i),'s') 
      grapheme=[grapheme;{'s'}]; 
     elseif strcmpi(str(i),'ss')||strcmpi(str(i),'sc')||strcmpi(str(i),'ce')||strcmpi(str(i),'se')||strcmpi(str(i),'ps') 
      grapheme=[grapheme;{'s'}]; 
      i=i+1; 
     elseif strcmpi (str(i),'t') 
      grapheme=[grapheme;{'t'}]; 
     elseif strcmpi(str(i),'tt')|| strcmpi(str(i),'te') 
      grapheme=[grapheme;{'t'}]; 
      i=i+1; 
     elseif strcmpi (str(i),'v') 
      grapheme=[grapheme;{'v'}]; 
     elseif strcmpi(str(i),'ve') 
      grapheme=[grapheme;{'v'}]; 
      i=i+1; 
     elseif strcmpi (str(i),'v') 
      grapheme=[grapheme;{'v'}]; 
     elseif strcmpi(str(i),'ve') 
      grapheme=[grapheme;{'v'}]; 
      i=i+1; 
     elseif strcmpi (str(i),'w') 
      grapheme=[grapheme;{'w'}]; 
     elseif strcmpi(str(i),'wh') 
      grapheme=[grapheme;{'w'}]; 
      i=i+1; 
     elseif strcmpi(str(i),'x') 
      grapheme=[grapheme;{'x'}]; 
     elseif strcmpi (str(i),'y') && strcmp('I') 
      grapheme=[grapheme;{'y'}]; 
     elseif strcmpi(str(i),'z') 
      grapheme=[grapheme;{'z'}]; 
     elseif strcmpi(str(i),'zz')||strcmpi(str(i),'ze') 
      grapheme=[grapheme;{'z'}]; 
      i=i+1; 
      elseif strcmpi(str(i),'sh') 
      grapheme=[grapheme;{'sh'}]; 
      i=i+1; 
     elseif strcmpi(str(i),'zh') 
      grapheme=[grapheme;{'z'}]; 
      i=i+1; 
     elseif strcmpi(str(i),'ch') 
      grapheme=[grapheme;{'ch'}]; 
      i=i+1; 
     elseif strcmpi(str(i),'th') 
      grapheme=[grapheme;{'th'}]; 
      i=i+1; 
     elseif strcmpi(str(i),'a') 
      grapheme=[grapheme;{'a'}]; 

     elseif strcmpi(str(i),'e') 
      grapheme=[grapheme;{'e'}]; 
     elseif strcmpi(str(i),'i') 
      grapheme=[grapheme;{'i'}]; 
     elseif strcmpi(str(i),'o') 
      grapheme=[grapheme;{'o'}]; 
     elseif strcmpi(str(i),'u') 
      grapheme=[grapheme;{'u'}];   
     end 
     end 
display(grapheme); 
+0

Könnten Sie versuchen, mit einfachsten String-Eingang, mit dem es sollte funktionieren und sehen, ob es noch in einem Schwebe-ish festsitzt while-Schleife ? Ich versuchte es mit einer Eingabezeichenfolge von "hg" und es ist drin stecken. Gibt es gültige String-Kriterien, die beibehalten werden müssen? – Divakar

+0

Ich sehe ein paar Probleme: 'strcmpi (str (i), 'th')' und andere Zwei-Buchstaben-Vergleiche. Auch Sachen wie 'str (i: i + 1)' und 'str (i: i + 2)' könnten aus dem Rahmen gehen. Auch das ist klobig 'grapheme = [grapheme; {'d'}]', besser – Amro

+0

@Divakar vorbestellen Ja, selbst die einfachsten Strings stecken fest .. Ich hatte es mit 'bd' versucht und es zeigte 'beschäftigt'. Wie bei String-Kriterien muss es nur Alphabete für die Eingabe geben (vorzugsweise Kleinbuchstaben). Habe noch nichts validiert. – Meraki

Antwort

0
prompt = 'Enter a string : '; 
`enter code here`str = input(prompt,'s'); 
l=length(str); 
i=1; 
f=0; 
grapheme=[]; %matrix to store the graphemes 

    enter code here 

if (l==1) 
    if strcmp(str(i),'I') 
      grapheme=[grapheme;{'ie'}]; 
    else 
    grapheme=[grapheme;{str(l)}]; 
    end 
else 
while i<=l-1 
    if double(str(i))==32 
     grapheme=[grapheme;{'*'}]; 
    elseif strcmp(str(i),'I') 
      grapheme=[grapheme;{'ie'}]; 

    elseif strcmpi(str(i:i+1),'sh') 
     grapheme=[grapheme;{'sh'}]; 
     i=i+1; 
    elseif strcmpi(str(i:i+1),'ee') 
     grapheme=[grapheme;{'ee'}]; 
     i=i+1; 
    elseif strcmpi(str(i:i+1),'ea') 
     grapheme=[grapheme;{'ee'}]; 
     i=i+1; 
    elseif strcmpi(str(i:i+1),'oa') 
     grapheme=[grapheme;{'oa'}]; 
     i=i+1; 
    elseif strcmpi(str(i:i+1),'ou') 
     grapheme=[grapheme;{'ou'}]; 
     i=i+1; 
    elseif strcmpi(str(i:i+1),'oo') 
     grapheme=[grapheme;{'oo'}]; 
     i=i+1; 
    elseif strcmpi(str(i:i+1),'er') 
     grapheme=[grapheme;{'er'}]; 
     i=i+1; 
    elseif strcmpi(str(i:i+1),'bb') 
     grapheme=[grapheme;{'b'}]; 
     i=i+1; 

    elseif strcmpi(str(i:i+1),'ll')||strcmpi(str(i:i+1),'le') 
     grapheme=[grapheme;{'l'}]; 
     i=i+1; 
    elseif strcmpi(str(i:i+1),'ff') 
     grapheme=[grapheme;{'f'}]; 
     i=i+1; 
    elseif strcmpi(str(i:i+1),'dd')||strcmpi(str(i:i+1),'ed') 
      grapheme=[grapheme;{'d'}]; 
      i=i+1; 
    elseif strcmpi(str(i:i+1),'ff')||strcmpi(str(i:i+1),'ph')||strcmpi(str(i:i+1),'gh') 
      grapheme=[grapheme;{'f'}]; 
    elseif strcmpi(str(i:i+1),'gg')%||strcmpi(str(i:i+2),'gue') 
      grapheme=[grapheme;{'g'}]; 
      i=i+1; 
    elseif strcmpi(str(i:i+1),'ge')||strcmpi(str(i:i+1),'jj') 
      grapheme=[grapheme;{'j'}]; 
      i=i+1; 
    elseif strcmpi(str(i:i+1),'ck')||strcmpi(str(i:i+1),'cc')||strcmpi(str(i:i+1),'qu') 
      grapheme=[grapheme;{'c'}]; 
      i=i+1; 
    elseif strcmpi(str(i:i+1),'mm')||strcmpi(str(i:i+1),'lm')||strcmpi(str(i:i+1),'mn') 
      grapheme=[grapheme;{'m'}]; 
      i=i+1; 
    elseif strcmpi(str(i:i+1),'nn')||strcmpi(str(i:i+1),'kn')||strcmpi(str(i:i+1),'pn')||strcmpi(str(i:i+1),'gn') 
      grapheme=[grapheme;{'n'}]; 
      i=i+1; 
    elseif strcmpi(str(i:i+1),'pp') 
      grapheme=[grapheme;{'p'}]; 
      i=i+1; 
    elseif strcmpi(str(i:i+1),'rr')||strcmpi(str(i:i+1),'wr')||strcmpi(str(i:i+1),'rh') 
      grapheme=[grapheme;{'r'}]; 
      i=i+1 
     elseif strcmpi(str(i:i+1),'ss')||strcmpi(str(i:i+1),'sc')||strcmpi(str(i:i+1),'ce')||strcmpi(str(i:i+1),'se')||strcmpi(str(i:i+1),'ps') 
      grapheme=[grapheme;{'s'}]; 
      i=i+1; 
     elseif strcmpi(str(i:i+1),'tt')|| strcmpi(str(i),'te') 
      grapheme=[grapheme;{'t'}]; 
      i=i+1; 
     elseif strcmpi(str(i:i+1),'ve') 
      grapheme=[grapheme;{'v'}]; 
      i=i+1; 
     elseif strcmpi(str(i:i+1),'wh') 
      grapheme=[grapheme;{'w'}]; 
      i=i+1; 
     elseif strcmpi(str(i:i+1),'zz') 
      grapheme=[grapheme;{'z'}]; 
      i=i+1; 
     elseif strcmpi(str(i:i+1),'ch') 
      grapheme=[grapheme;{'ch'}]; 
      i=i+1; 
     elseif strcmpi(str(i:i+1),'th') 
      grapheme=[grapheme;{'th'}]; 
      i=i+1; 
     elseif strcmpi(str(i:i+1),'oy') 
      grapheme=[grapheme;{'oy'}]; 
      i=i+1; 
     elseif strcmpi(str(i:i+1),'ai') 
      grapheme=[grapheme;{'ai'}]; 
      i=i+1;   
     elseif strcmpi(str(i:i+1),'ou') 
      grapheme=[grapheme;{'ou'}]; 
      i=i+1; 
     elseif strcmpi(str(i:i+1),'ew') 
      grapheme=[grapheme;{'ew'}]; 
      i=i+1; 
     elseif strcmpi(str(i:i+1),'ie') 
      grapheme=[grapheme;{'ie'}]; 
      i=i+1; 
    else 

    grapheme=[grapheme;{str(i)}]; 
    %end 
    end 
    i=i+1; 
    if i==l 
     f=1; 
    end 
end 
end 
if f==1 
    grapheme=[grapheme;{str(end)}]; 
end 
display(grapheme); 
+0

Der Code wurde korrigiert. – Meraki

Verwandte Themen