Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Algoritam za podelu reci na slogove

[es] :: Java :: Algoritam za podelu reci na slogove

Strane: 1 2

[ Pregleda: 10589 | Odgovora: 22 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

jovan1982
Jovo Krneta
ekonomista
Novi Banovci

Član broj: 290143
Poruke: 76
217.24.18.*

Sajt: www.bar-codes.org


+1 Profil

icon Algoritam za podelu reci na slogove25.08.2014. u 10:25 - pre 117 meseci
Pozdrav!
Poceo sam da radim na izdradi aplikacije za generisanje govora na bazi unetog teksta za srpski jezik(TTS), i shodno tome prva stvar koja mi je potreba jeste algoritam za rasclanjivanje unetih reci na slogove .
Napravio sam neki algoritam koji daje ok rezultate ali i dalje mislim da to nije to . Zanima me da li neko ima uspesno resen ovaj problem i sta misli o samom algoritmnu koji sam napisao i koji je jako prost....

package lang;

import java.util.ArrayList;

/**
*
* @author jkrne
*/
public class Word {



private String word;
private String result="";
public Word(String a)
{
this.word=a;
}


public String getAllSyllables()
{


ArrayList<Integer> syllablesLocations =new ArrayList<Integer>();
int syllablesCounter=0;
char c;
for (int j = 0; j<word.length(); j++) {
c=word.charAt(j);
result=result+c;
if((c=='a' || c=='A' || c=='e' || c=='E'|| c=='i' || c=='I' || c=='o' || c=='O' || c=='u' || c=='U'))
{
syllablesCounter=syllablesCounter+1;
syllablesLocations.add(j);
result=result+"-";
}


}
if(result.charAt(result.length()-1)=='-')
{
result=result.substring(0, result.length()-1);
}

if(result.charAt(result.length()-2)=='-')
{
result=result.substring(0, result.length()-2)+result.charAt(result.length()-1);
}


if(this.word.length()==3)
return this.word;
else
return result;




}

}


Algoritam se testira na sledeci nacin

public class Lang {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
String rec=JOptionPane.showInputDialog("Unesite rec za analizu");
String podeljeno="";

Word w= new Word(rec);
podeljeno= w.getAllSyllables();

System.out.println(podeljeno);



// TODO code application logic here
}

}

Voleo bih da jednom javno resimo ovaj problem kako bi resenje bilo dostupno svima i kako bi ljudi koji bi zeleli da se bave izradom TTS aplikacija za srpski imali dobru pocetnu tacku cime bi se broj aplikacija
koje su u stanju da kovertuju tekst u govor na srpskom jeziku povecao. Pozdrav!
 
Odgovor na temu

casperns2
Full Stack Java Web Developer
Novi Sad

Član broj: 288154
Poruke: 227
*.dynamic.sbb.rs.



+45 Profil

icon Re: Algoritam za podelu reci na slogove25.08.2014. u 17:37 - pre 117 meseci
Sto se tice samog algoritma meni lepo radi. Probao sam , radi i ne znam na koji drugi nacim bi mogao ovo resiti osim na ovaj.

Ono sto jos nisi definisao je sta se desava ako se unese jedan suglasnik , da ne izbacuje gresku . I kod podele slogova , stavio si da ti se slog deli na samoglasnik, ali koliko znam ako u reci posle samoglasnika ostaje jedno slovo onda se ono dodaje poslednjem slogu (proveri jer nisam 100% siguran ) .... na primer rec SUTRADAN , po tvom programu je su-tra-da-n a gramaticki ispravno podeljeno na slogove je su-tra-dan , tako da bi trebao tu da promenis malo algoritam i uslove za podelu .

Pozdrav
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+711 Profil

icon Re: Algoritam za podelu reci na slogove25.08.2014. u 17:43 - pre 117 meseci
Nije baš tako trivijalno rešenje.

http://www.srpskijezik.rs/gramatika/podela-reci-na-slogove

Inače, Java nije baš najsrećniji jezik za razvoj ovakvih algoritama. Možda je ovo dobra prilika za učenje novog jezika?
 
Odgovor na temu

galaksija
Novi Sad

Član broj: 49290
Poruke: 82



+4 Profil

icon Re: Algoritam za podelu reci na slogove25.08.2014. u 18:25 - pre 117 meseci
Ideja kao ideja je odlična, ali kompleksnost mislim da nije primerena forumu, nadam se da me razumeš.
Ako već razmišljaš da uključiš neke saradnike (mislim na FOSS zajednicu), probaj malo da se potrudiš, da napraviš GitHub nalog, pokreni projekat, a verujem da će se ostali vrlo radi uključiti, zajedno samnom.
Molio bih te da ovo ne smatraš kao kritiku.

Pogledaj kako bi to trebalo otprilike da izgleda:

Kako je već urađeno.
 
Odgovor na temu

jovan1982
Jovo Krneta
ekonomista
Novi Banovci

Član broj: 290143
Poruke: 76
*.ptt.rs.

Sajt: www.bar-codes.org


+1 Profil

icon Re: Algoritam za podelu reci na slogove25.08.2014. u 18:32 - pre 117 meseci
Radim ja i c++,php....ali za samo parsiranje stringa java mi deluje sasvim ok.Nabavio sam recnik srpskih reci izmenjanih po padezima - oko 220 000 reci (postoji u okviru OpenOffice-a , koristi se kao spell check za srpski).To prevedeno u A4 stranice znaci oko 250 strana teksta .Napravicu aplikaciju za snimanje reci i snimicu sve reci koje imam .Ono sto zelim jeste da za one za koje se desi da nemam u svojoj bazi razvijem algoritam koji bi mogao da se koristi kao rezervna varijanta .Mislim da se najbolji kvalitet zvuka dobija ako se snime kompletne reci.Ali ono sto bi voleo jeste da na nekom mestu postoji dostupan algoritam koji mogu svi bez rezerve slobodno da koriste . Zanima me da li je neko vec radio na tome i da li vec ima nesto uspesno odradjeno a da je naravno u stanju i zeljan to da podeli sa drugima .
 
Odgovor na temu

jovan1982
Jovo Krneta
ekonomista
Novi Banovci

Član broj: 290143
Poruke: 76
*.ptt.rs.

Sajt: www.bar-codes.org


+1 Profil

icon Re: Algoritam za podelu reci na slogove25.08.2014. u 18:53 - pre 117 meseci
Gledao sam ovo na sajtu http://www.srpskijezik.rs/gramatika/podela-reci-na-slogove ....jedino sto mogu jeste da nakon sto sve odradi da stavim opet nekoliko if-ova da malo to istumbam ali mi to deluje neprofesionalno .Ovi iz Novog Sada -Alfanum su najbolji na podrucju bivse SFRJ ali to je radio ogroman broj ljudi, profesora na fakultetima isl. Stvarno je kvalitetno ali za developere nedostupno besplatno. Rezultat je da imamo jezik koji je najlaksi za primenu TTS-a a nemamo niti JEDNU slobodnu bibllioteku za slobodnu upotrebu. Strasno! Trenutno nemam vremena za GitHub ali gledacu samostalno da to odradim .
 
Odgovor na temu

galaksija
Novi Sad

Član broj: 49290
Poruke: 82



+4 Profil

icon Re: Algoritam za podelu reci na slogove25.08.2014. u 19:26 - pre 117 meseci
Ok, hajde da pokušamo, možes li da nam ukratko predstaviš kojim bi putem išao projekat tzv: "project workflow".
u međuvremenu ću pokušati da popravim malo alg.
 
Odgovor na temu

jovan1982
Jovo Krneta
ekonomista
Novi Banovci

Član broj: 290143
Poruke: 76
*.ptt.rs.

Sajt: www.bar-codes.org


+1 Profil

icon Re: Algoritam za podelu reci na slogove25.08.2014. u 20:00 - pre 117 meseci
Imam tu bazu srpskih reci u cirilicnom i latinicnom pismu. Insertovacu podatke u bazu - pre cu uzeti mysql nego sqlite zato sto bi bilo ok da projekat izraste u web servis koji bi se onda mogao koristiti i za android i ostale uredaje.
Napravicu desktop java swing aplikaciju gde ce mi biti zadata sledeca nesnimljenu rec u bazi(rec za koju izgovor nije snimljen) - desktop aplikacija koju cu koristiti da nasnimim svih 220 000 reci, aplikacija ce biti dostupna drugima tako da ce se pojaviti i neki drugi glasovi. Da bih se nasnimilo 220 000 reci kroz jednu takvu aplikaciju ne bih trebalo vise od mesec dana . Nakon snimanja postojace mogucnost reporodukcije , brisanja ukoliko snimak nije odgovrajuci i deo za testiranje u nekoj recenici , kao i reprodukcija prethodno snimljnih reci . Prilikom snimanja insertovao bih u bazu i vreme trajanja audio zapisa - to bi kasnije doslo kao jako korisno, lokaciju do audio zapisa, naziv i pol osobe ciji je glas u pitanju kao i oba cirilican i latinican zapis reci . Algoritam koji pravim koji sam postavio na forumu bih se koristio da se u jednu dodatnu kolonu ili u novu tabelu izdvoje sami slogovi .
Selektovao bih jedinstvene slogove iz baze koje bih takodje snimio kao rezervnu varijantu . Pored samog teksta postojala bih i funkcija - koja vec postoji u samoj javi za proveru da li je pomenuta rec u formatu emal adrese .
 
Odgovor na temu

galaksija
Novi Sad

Član broj: 49290
Poruke: 82



+4 Profil

icon Re: Algoritam za podelu reci na slogove25.08.2014. u 20:06 - pre 117 meseci
Malo doteran algoritam, mada ima još da se radi, npr. znma da ponekad i slovo "R" može da bude samoglasnik !

Code:

public class Word {

    private static final String GRUPA_SAMOGLASNICI = "AEIOUaeiou";

    private static boolean isSamoglasnik(char c) {
        return GRUPA_SAMOGLASNICI.indexOf(c) != -1;
    }

    public static String getAllSyllables(String word) {

        String result = "";
        char c;
        for (int i = 0; i < word.length(); i++) {
            c = word.charAt(i);
            if (isSamoglasnik(c) == false) {
                result += c;
            } else {
                result += c + "-";
            }
        }
        return result;
    }
}

// Algoritam se testira na sledeci nacin

class Lang {

    public static void main(String[] args) {
        String rec = JOptionPane.showInputDialog("Unesite rec za analizu");
        System.out.println(Word.getAllSyllables(rec));
    }
}
 
Odgovor na temu

galaksija
Novi Sad

Član broj: 49290
Poruke: 82



+4 Profil

icon Re: Algoritam za podelu reci na slogove25.08.2014. u 20:22 - pre 117 meseci
Citat:
casperns2:

Ono sto jos nisi definisao je sta se desava ako se unese jedan suglasnik , da ne izbacuje gresku . I kod podele slogova , stavio si da ti se slog deli na samoglasnik, ali koliko znam ako u reci posle samoglasnika ostaje jedno slovo onda se ono dodaje poslednjem slogu (proveri jer nisam 100% siguran ) .... na primer rec SUTRADAN , po tvom programu je su-tra-da-n a gramaticki ispravno podeljeno na slogove je su-tra-dan , tako da bi trebao tu da promenis malo algoritam i uslove za podelu .


Ovo ako je ispravno nije teško ispraviti, još večeras dobijaš alg sa ovim ispravkama.
 
Odgovor na temu

galaksija
Novi Sad

Član broj: 49290
Poruke: 82



+4 Profil

icon Re: Algoritam za podelu reci na slogove25.08.2014. u 21:49 - pre 117 meseci
Evo preliminarnog algoritma sa predloženim izmenama:
Citat:
casperns2:

Ono sto jos nisi definisao je sta se desava ako se unese jedan suglasnik , da ne izbacuje gresku . I kod podele slogova , stavio si da ti se slog deli na samoglasnik, ali koliko znam ako u reci posle samoglasnika ostaje jedno slovo onda se ono dodaje poslednjem slogu (proveri jer nisam 100% siguran ) .... na primer rec SUTRADAN , po tvom programu je su-tra-da-n a gramaticki ispravno podeljeno na slogove je su-tra-dan , tako da bi trebao tu da promenis malo algoritam i uslove za podelu .


Code:

import java.awt.Component;

import javax.swing.JOptionPane;

public class Word {
    public static Component frame = null;
    public static final String GRUPA_SAMOGLASNICI = "AEIOUaeiou";
    
    private static boolean isSamoglasnik(char c) {
        return GRUPA_SAMOGLASNICI.indexOf(c) != -1;
    }

    public static String getAllSyllables(String word) {
        String result = "";
        if (word.length() == 0 || word.length() == 1) {
            
            JOptionPane.showMessageDialog(frame, "Molimo da unesete reč dužu od jednog slova!", 
                                                 "Greška u unosu",
                                                 JOptionPane.ERROR_MESSAGE);
            System.exit(1);

        } else {
            char character;
            int duzinaReci = word.length();
            for (int i = 0; i < duzinaReci; i++) {
                character = word.charAt(i);
                if (isSamoglasnik(character) == false) {
                    result += character;
                } else if (i == duzinaReci - 2 && isSamoglasnik(character)) {
                    result += character;
                } else {
                    result += character + "-";
                }
            }
            if (result.endsWith("-")) {
                result = result.substring(0, result.length() - 1) + "";
            }
        }
        return result;
    }
}

// Algoritam se testira na sledeci nacin

class Lang {

    public static void main(String[] args) {
        String rec = JOptionPane.showInputDialog("Unesite rec za analizu");
        JOptionPane.showMessageDialog(Word.frame, Word.getAllSyllables(rec));
        System.out.println(Word.getAllSyllables(rec));
    }
}
 
Odgovor na temu

galaksija
Novi Sad

Član broj: 49290
Poruke: 82



+4 Profil

icon Re: Algoritam za podelu reci na slogove25.08.2014. u 22:52 - pre 117 meseci
Još malo sređenije, ali bi trebalo da se dodaju još neke stvari koje su u komentaru.

Code:

import java.awt.Component;

import javax.swing.JOptionPane;


//TODO 
/* 1. Primeri za zatvorene slogove su:
            av-li-ja
            tram-vaj
            jad-nik
*/ 
/*  2. Sonant N kao nosilac sloga

           I-dn, I-bn
*/
/*   3.Suglasničke grupe (pravila podele reči na slogove kada su nosioci sloga suglasnici)

                1) granica sloga je između dva suglasnika ukoliko su oni sonanti
                        or-la, slom-ljen, tram-vaj
                2) granica sloga je između dva suglasnika ako je prvi praskavi, a drugi nije v, r, l, lj, j
                        lop-ta, lep-tir, jad-nik
                3) granica sloga je ispred suglasnika ako je prvi strujni ili sliveni
                        la-sta, vo-ćka, ma-čka
                4) granica sloga je ispred suglasnika ako je drugi suglasnik v, r, l, lj, j 
                        mu-dro, je-dva, to-pljen, sve-tlost

    Granica sloga može biti:
        1) fonetska (nastaje usled fonetskih osobina glasa): o-du-ze-ti, ra-zlju-ti-ti
        2) psihološka ili semantička (kada osećamo da je nešto prefiks): od-u-ze-ti, raz-lju-ti-ti

        U srpskom jeziku prednost se daje psihološkoj, odnosno semantičkoj granici sloga.
*/


public class Word {
    public static Component frame = null;
    public static final String GRUPA_SAMOGLASNICI = "AEIOURaeiour";
    public static final String SONANT_SAMOGLASNIK = "Rr";

    private static boolean isSamoglasnik(char c) {
        return GRUPA_SAMOGLASNICI.indexOf(c) != -1;
    }

    // Sonant R kao nosilac sloga
    private static boolean isSonantSamoglasnik(char c) {
        return SONANT_SAMOGLASNIK.indexOf(c) != -1;
    }

    public static String getAllSyllables(String word) {
        String result = "";
        if (word.length() == 0 || word.length() == 1) {

            JOptionPane.showMessageDialog(frame, "Molimo da unesete reč dužu od jednog slova!", 
                                                  "Greška u unosu",
                                                  JOptionPane.ERROR_MESSAGE);
            System.exit(1);

        } else {
            char character;
            int duzinaReci = word.length();
            for (int i = 0; i < duzinaReci; i++) {
                character = word.charAt(i);
                // Sonant R kao nosilac sloga
                if (isSonantSamoglasnik(character) == true && word.charAt(0) == 'r') {
                    result += character + "-";
                } else if (i == duzinaReci - 2 && isSamoglasnik(character)) {
                    result += character;

                } else if (isSamoglasnik(character) == false) {

                    result += character;

                } else {
                    result += character + "-";
                }
            }
        }
        if (result.endsWith("-")) {
            result = result.substring(0, result.length() - 1) + "";
        }

        return result;
    }
}

// Algoritam se testira na sledeci nacin

class Lang {

    public static void main(String[] args) {
        String rec = JOptionPane.showInputDialog("Unesite rec za analizu");
        JOptionPane.showMessageDialog(Word.frame, Word.getAllSyllables(rec));
        System.out.println(Word.getAllSyllables(rec));
    }
}
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+711 Profil

icon Re: Algoritam za podelu reci na slogove26.08.2014. u 07:23 - pre 117 meseci
Okačite to na github.
 
Odgovor na temu

jovan1982
Jovo Krneta
ekonomista
Novi Banovci

Član broj: 290143
Poruke: 76
217.24.18.*

Sajt: www.bar-codes.org


+1 Profil

icon Re: Algoritam za podelu reci na slogove01.09.2014. u 11:24 - pre 117 meseci
Evo jos nekih manjih izmena

/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/

package lang;

import java.util.ArrayList;

/**
*
* @author jkrne
*/
public class Word {



private String word;
private String result="";
public Word(String a)
{
this.word=a;
}


public String getAllSyllables()
{
if(this.word.length()==3)
return this.word;

if(this.word.length()==2)
return this.word;

if(this.word.length()==1)
return this.word;

ArrayList<Integer> syllablesLocations =new ArrayList<Integer>();
int syllablesCounter=0;
char c;
for (int j = 0; j<word.length(); j++) {
c=word.charAt(j);
result=result+c;
if((c=='a' || c=='A' || c=='e' || c=='E'|| c=='i' || c=='I' || c=='o' || c=='O' || c=='u' || c=='U'))
{
syllablesCounter=syllablesCounter+1;
syllablesLocations.add(j);
result=result+"-";
result=result.replace("--", "-");
}


}
//brisanje poslednjeg znaka za podelju '-' na kraju reci
if(result.charAt(result.length()-1)=='-')
{
result=result.substring(0, result.length()-1);
result=result.replace("--", "-");
}

//ako je podeljeno tako da je ostalo poslednje slovo samo za sebe
if(result.charAt(result.length()-2)=='-')
{
result=result.substring(0, result.length()-2)+result.charAt(result.length()-1);
result=result.replace("--", "-");
}

//primer za zatvorene slogove poput avlija , ukoliko je pocetno slovo samoglasnika
if(result.charAt(1)=='-')
{
result=result.substring(0, 1)+result.substring(2, 3)+result.substring(1, 2)+ result.substring(3, result.length());
result=result.replace("--", "-");
}

//ukoliko su reci neravnomerno podeljene - prvi slog ima 2 a drugi 4 slova
String test[]=result.split("-");
if(test[0].length()==2 && test[1].length()==4)
{
test[0]=test[0]+test[1].substring(0, 1);
test[1]=test[1].substring(1, test[1].length());
result="";
for (int i = 0; i < test.length; i++) {
if(i!=0)
{
result=result+"-"+test;
result=result.replace("--", "-");
}
else
{
result=result+test;
result=result.replace("--", "-");
}
}
if(result.charAt(result.length()-1)=='-')
{
result=result.substring(0, result.length()-1);
result=result.replace("--", "-");
}

}




return result;




}

}


i implementacija sa
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/

package lang;

import javax.swing.JOptionPane;

/**
*
* @author jkrne
*/
public class Lang {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
String rec="";
while(!rec.equalsIgnoreCase("x"))
{
rec=JOptionPane.showInputDialog("Unesite rec za analizu ili X za prekid rada aplikacije");
if(rec==null)
{
JOptionPane.showMessageDialog(null, "Prijatan dan!");
return;
}

String podeljeno="";

Word w= new Word(rec);
podeljeno= w.getAllSyllables();



if(!podeljeno.equalsIgnoreCase("x"))
{
JOptionPane.showMessageDialog(null, podeljeno);

}
else
JOptionPane.showMessageDialog(null, "Prijatan dan!");
}
//System.out.println(podeljeno);



// TODO code application logic here
}

}
 
Odgovor na temu

galaksija
Novi Sad

Član broj: 49290
Poruke: 82



+4 Profil

icon Re: Algoritam za podelu reci na slogove01.09.2014. u 16:36 - pre 117 meseci
Probaj da koristis tagove za formatiranje programerskog koda, da bi bolje videli !
 
Odgovor na temu

jovan1982
Jovo Krneta
ekonomista
Novi Banovci

Član broj: 290143
Poruke: 76
*.ptt.rs.

Sajt: www.bar-codes.org


+1 Profil

icon Re: Algoritam za podelu reci na slogove06.09.2014. u 17:41 - pre 117 meseci
Evo započeo sam projekat na https://github.com/Jovan1982/P...ci-na-slogove-u-srpskom-jeziku
svako ko je zaintereson može da se priključi (ja lično nemam neko iskustvo u radu sa GITHUB-om) .
 
Odgovor na temu

galaksija
Novi Sad

Član broj: 49290
Poruke: 82



+4 Profil

icon Re: Algoritam za podelu reci na slogove06.09.2014. u 18:54 - pre 117 meseci
Jovane, cenim tvoj trud ali molim te pogledaj makar neki od mnogih tutorijala za GIT/GitHub, evo ja ti jedan preporucujem:

https://www.youtube.com/watch?v=73I5dRucCds

PS: ako zeliš mogao bih da ti snimim na Srpskom karatak tutorial kao "uvod u GitHub" i da postavim na YT. Javi...
 
Odgovor na temu

jovan1982
Jovo Krneta
ekonomista
Novi Banovci

Član broj: 290143
Poruke: 76
*.ptt.rs.

Sajt: www.bar-codes.org


+1 Profil

icon Re: Algoritam za podelu reci na slogove06.09.2014. u 20:04 - pre 117 meseci
Pogledacu ovo na YT kada budem imao malo vremena . Hvala!
 
Odgovor na temu

jovan1982
Jovo Krneta
ekonomista
Novi Banovci

Član broj: 290143
Poruke: 76
*.ptt.rs.

Sajt: www.bar-codes.org


+1 Profil

icon Re: Algoritam za podelu reci na slogove06.09.2014. u 22:24 - pre 117 meseci
Evo verujem da je ovo resenje problema , u vecini slucajeva - i onih komplaksnijih koje sam testirao dobio sam ok rezultate .
*Prvo se radi identifikovanje pisma da li je u pitanju latinica ili cirilica .
*Zatim se slogovi dele posle samoglasnika
*Ukoliko tako podeljena slogovi imaju u sebi suglasnike jedan do drugog oni se premestaju u prethodni slog

//glavna klasa

/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/

package lang;

import java.util.ArrayList;
import java.util.Arrays;
import static lang.Pismo.Cyr;
import static lang.Pismo.Lat;

/**
*
* @author Jovo
*/
public class Slog {

final String samoglasniciL="a,e,i,o,u";
final String sonatiL="j,v,r,m,l,lj,n,nj";
final String slogotvorniSonatiL="r,l,n";
final String suglasniciL="b,v,g,d,đ,dj,ž,z,j,k,l,lj,m,n,nj,p,r,s,t,ć,f,h,c,č,dž,š";
final String konsonantiL="b,g,d,z,ž,đ,dž,p,k,t,s,š,ć,č,h,f,c";
final String zvucniKonsonantiL="b,g,d,z,ž,đ,dž";
final String bezZvucniKonsonantiL="p,k,t,s,š,ć,č,h,f,c";

final String samoglasniciC="a,e,i,o,u";
final String sonatiC="j,v,r,m,l,lj,n,nj";
final String slogotvorniSonatiC="r,l,n";
final String suglasniciC="b,v,g,d,đ,dj,ž,z,j,k,l,lj,m,n,nj,p,r,s,t,ć,f,h,c,č,dž,š";
final String konsonantiC="b,g,d,z,ž,đ,dž,p,k,t,s,š,ć,č,h,f,c";
final String zvucniKonsonantiC="b,g,d,z,ž,đ,dž";
final String bezZvucniKonsonantiC="p,k,t,s,š,ć,č,h,f,c";

Pismo p;

private String rec;
private String slovo;
private StringBuilder recPodeljenaNaSlogove=new StringBuilder();
public void setRec(String r)
{
this.rec=r;
if(isCyrilic(this.rec))
p=Cyr;
else
p=Lat;
}
public String getRec()
{
return this.rec;
}
public Slog()
{

}
private boolean isCyrilic(String word)
{
int latCounter=0;
int cyrCounter=0;
char c;
for (int i = 0; i < word.length(); i++) {
c=word.charAt(i);
if(Character.UnicodeBlock.CYRILLIC.equals(Character.UnicodeBlock.of(c)))
{
cyrCounter++;
}
else
{
latCounter++;
}
if(latCounter>cyrCounter)
return false;
else
return true;
}

return true;
}
public boolean isSamoglasnikL(String s)
{
if(samoglasniciL.indexOf(s.toLowerCase())==-1)
return false;
else
return true;

}

public boolean isSonatL(String s)
{
if(sonatiL.indexOf(s.toLowerCase())==-1)
return false;
else
return true;
}

public boolean isSlogotvorniSonatiL(String s)
{
if(slogotvorniSonatiL.indexOf(s.toLowerCase())==-1)
return false;
else
return true;
}

public boolean isSuglasnikL(String s)
{
if(suglasniciL.indexOf(s.toLowerCase())==-1)
return false;
else
return true;
}

public boolean isKonsonantiL(String s)
{
if(konsonantiL.indexOf(s.toLowerCase())==-1)
return false;
else
return true;
}

public boolean isZvucniKonsonantiL(String s)
{
if(zvucniKonsonantiL.indexOf(s.toLowerCase())==-1)
return false;
else
return true;
}

public boolean isBezZvucniKonsonantiL(String s)
{
if(bezZvucniKonsonantiL.indexOf(s.toLowerCase())==-1)
return false;
else
return true;
}

public boolean isSamoglasnikC(String s)
{
if(samoglasniciC.indexOf(s.toLowerCase())==-1)
return false;
else
return true;

}

public boolean isSonatC(String s)
{
if(sonatiC.indexOf(s.toLowerCase())==-1)
return false;
else
return true;
}

public boolean isSlogotvorniSonatiC(String s)
{
if(slogotvorniSonatiC.indexOf(s.toLowerCase())==-1)
return false;
else
return true;
}

public boolean isSuglasnikC(String s)
{
if(suglasniciC.indexOf(s.toLowerCase())==-1)
return false;
else
return true;
}

public boolean isKonsonantiC(String s)
{
if(konsonantiC.indexOf(s.toLowerCase())==-1)
return false;
else
return true;
}

public boolean isZvucniKonsonantiC(String s)
{
if(zvucniKonsonantiC.indexOf(s.toLowerCase())==-1)
return false;
else
return true;
}

public boolean isBezZvucniKonsonantiC(String s)
{
if(bezZvucniKonsonantiC.indexOf(s.toLowerCase())==-1)
return false;
else
return true;
}

public String podeliNaSlogovePoSamoglasnicima()
{
/*
prvobitna podela reci na slogove gde se rec
na slogove deli samo po samoglasnicima
*/

//ukoliko je rac od 3 slova ili manje nemoj je rastavljati vrati celu rec
if(this.rec.length()<=3)
return this.rec;

char c;
for (int i = 0; i < this.rec.length(); i++) {
c=this.rec.charAt(i);
slovo=String.valueOf(c);
recPodeljenaNaSlogove=recPodeljenaNaSlogove.append(c);

if(this.p==Cyr)
{
if(isSamoglasnikC(slovo) && i<this.rec.length()-2)
recPodeljenaNaSlogove=recPodeljenaNaSlogove.append("-");
}
else
{
if(isSamoglasnikL(slovo) && i<this.rec.length()-2)
recPodeljenaNaSlogove=recPodeljenaNaSlogove.append("-");
}


}

return podeliNaSlogovePoSuglasnicima(this.recPodeljenaNaSlogove.toString());
}

private String podeliNaSlogovePoSuglasnicima(String prethodnoPodeljenoPoSamoglasnicima)
{
/*
ponovno deljenje vec podeljene reci po suglasnicima
kako bi smo identifikovali pogresno podeljene slogove
u kojima su ostali suglasnici jedan do drugug
*/
String[] t=prethodnoPodeljenoPoSamoglasnicima.split("-");
String iznovaDeljeno="";
for (int i = 1;i < t.length; i++) {

char c;

/*proveraj mi samo one slogove koji imaju 2 slova i vise
da li u tim slogovima postoje suglasnici koji su spojeni ako
postoje razdvojiti ih tako da ne budu u istom slogu*/
if(t.length()>=2)
{
if(this.p == Cyr)
{
/*ukoliko su u slogu dve suglasnika jedan do drugog
prebaci prvi suglasnik u prethodni slog za cirilicu*/
if(isSuglasnikC(t.substring(0, 1)) && isSuglasnikC(t.substring(1, 2)))
{
t[i-1]=t[i-1]+t.substring(0, 1);
t= t.substring(1, t.length());
}
}
else
{
/*ukoliko su u slogu dve suglasnika jedan do drugog
prebaci prvi suglasnik u prethodni slog za latinicu*/
if(isSuglasnikL(t.substring(0, 1)) && isSuglasnikL(t.substring(1, 2)))
{
t[i-1]=t[i-1]+t.substring(0, 1);
t= t.substring(1, t.length());
}

}

}

}
for (int i = 0; i < t.length; i++) {

iznovaDeljeno=iznovaDeljeno+t;
if(i!=t.length-1)
iznovaDeljeno=iznovaDeljeno+"-" ;
}


return iznovaDeljeno;
}










}
//enum koji se koristi za pismo

/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/

package lang;

/**
*
* @author Jovo
*/
public enum Pismo {
Lat,Cyr
}


//implementacija

/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/

package lang;

import javax.swing.JOptionPane;

/**
*
* @author jkrne
*/
public class Lang {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
String rec="";
while(!rec.equalsIgnoreCase("x"))
{
rec=JOptionPane.showInputDialog("Unesite rec za analizu ili X za prekid rada aplikacije");
if(rec==null)
{
JOptionPane.showMessageDialog(null, "Prijatan dan!");
return;
}

String podeljeno="";

Slog w= new Slog();
w.setRec(rec);
podeljeno= w.podeliNaSlogovePoSamoglasnicima();



if(!podeljeno.equalsIgnoreCase("x"))
{
JOptionPane.showMessageDialog(null, podeljeno);

}
else
JOptionPane.showMessageDialog(null, "Prijatan dan!");
}
//System.out.println(podeljeno);



// TODO code application logic here
}

}





Probajte malo i sami ako imate vremena pa mi kazite sta mislite :-)
P.S. Sam EliteSecurity mi je izmenio ćirilične konstante u latinične u kodu su konstante sa velikim C pisane u cirilici .
Ove na početku
final String samoglasniciC="a,e,i,o,u";
final String sonatiC="j,v,r,m,l,lj,n,nj";
final String slogotvorniSonatiC="r,l,n";
final String suglasniciC="b,v,g,d,đ,dj,ž,z,j,k,l,lj,m,n,nj,p,r,s,t,ć,f,h,c,č,dž,š";
final String konsonantiC="b,g,d,z,ž,đ,dž,p,k,t,s,š,ć,č,h,f,c";
final String zvucniKonsonantiC="b,g,d,z,ž,đ,dž";
final String bezZvucniKonsonantiC="p,k,t,s,š,ć,č,h,f,c";
u kodu se pišu ćiriličnim slovima ...
Pozdrav!

[Ovu poruku je menjao jovan1982 dana 06.09.2014. u 23:48 GMT+1]
 
Odgovor na temu

jovan1982
Jovo Krneta
ekonomista
Novi Banovci

Član broj: 290143
Poruke: 76
*.ptt.rs.

Sajt: www.bar-codes.org


+1 Profil

icon Re: Algoritam za podelu reci na slogove13.09.2014. u 01:17 - pre 116 meseci
Evo poslednje verzije na https://github.com/Jovan1982/P...m-jeziku/blob/master/Slog.java
ako neko ima neke primedbe bio bih rad da saslusam :-)
 
Odgovor na temu

[es] :: Java :: Algoritam za podelu reci na slogove

Strane: 1 2

[ Pregleda: 10589 | Odgovora: 22 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.