Jak podzielić wyraz na sylaby ?

0

Nie wie ktoś jak podzielić wyraz na sylaby ?
Jeżeli ktoś ma algorytm, lub kod źródłowy programu niech mi wyślijcie na adres: [email protected]... :-*

0

Ciekawy temat. Kodu nie mam, ale może coś się wymyśli w trakcie :)
Każda sylaba zawiera 1 samogłoskę. Poza tym w sylabie powinno być obok siebie jak najmniej spółgłosek obok siebie.
Teoretycznie powinno to być proste, ale...
Jest taki mały haczyk. Literka 'i' nie zachowuje się normalnie. Jeżeli po niej występuje samogłoska, to jest traktowana jak spółgłoska.
Wobec tego algorytm powinien wyglądać mniej więcej tak:

  1. Znajdź pierwszą samogłoskę s1. Jeżeli jest to 'i', a za nią występuje bezpośrednio inna samogłoska to 1.
  2. Znajdź drugą samogłoskę s2. Jeżeli jest to 'i', a za nią występuje bezpośrednio inna samogłoska to 2. Jeżeli nie znaleziono samogłoski to przejdź do 6.
  3. Wyznacz środek podziału pomiędzy pierwszą, a drugą znalezioną samogłoską s3.
  4. Pierwsza sylaba obejmuje zakres liter od początku do wyznaczonego środka (s1-s3). Zwróć tę wartość jako sylabę i usuń z przeszukiwanego ciągu.
  5. s1 := s2 i przejdź do 2.
  6. Ostatnią sylabą jest s1 do końca.
0

Nie mam czasu analizować algorytmu Dryo, ale czy poradzi on sobie np z tym, ze mat-ka ale ma-toł? I z temu podobnymi zasadami?

0

Nie mam czasu analizować algorytmu Dryo, ale czy poradzi on sobie np z tym, ze mat-ka ale ma-toł? I z temu podobnymi zasadami?

Te akurat są proste:
S := 'Matka';

  1. Wyszukujemy pierwszą samogłoskę: 'a' (S[2])
  2. Wyszukujemy drugą samogłoskę: 'a' (S[5])
  3. Szukamy środka pomiędzy obydwoma samogłoskami ((2+5) div 2=3 S[3]='t')
  4. Pierwsza sylaba S[1]->S[3]='Mat'; Nasz nowy ciąg ma postać: 'ka'
  5. Ponieważ dalej nie ma już więcej samogłosek (punkt 2 odpadł) to druga i ostatnia sylaba to 'ka'
    Więc mamy Mat-ka
    Chyba prawidłowo.
    A teraz dla 'Matoł' wyglądałoby to tak:
    S := 'Matoł';
  6. Wyszukujemy pierwszą samogłoskę: 'a' (S[2])
  7. Wyszukujemy drugą samogłoskę: 'a' (S[4])
  8. Szukamy środka pomiędzy obydwoma samogłoskami ((2+4) div 2=2 S[2]='a')
  9. Pierwsza sylaba S[1]->S[2]='Ma'; Nasz nowy ciąg ma postać: 'toł'
  10. Ponieważ dalej nie ma już więcej samogłosek (punkt 2 odpadł) to druga i ostatnia sylaba to 'toł'
    Gra?
0

Ale jeszcze trzeba uwzglednic:

  • jezeli wystepuja dwie spolgloski obok siebie
  • uwzglednic zasade nie rozdzielnosci dwuznakow typu 'ch', 'rz', sz', 'cz'

.. a tak poza tym mysle nad troche innym algorytmem, ale nie wiem czy sie sprawdzi, pierw przemysle zanim napisze, a poza tym jest juz pozno.
[cya]

0

[stuk] Zauważyłem błąd w swoim algorytmie. Źle podzieliłem :P
A oto co mówi słownik ortograficzny:
"1. Nie dzieli się:
a) wyrazów jednozgłoskowych, np.: wzrost, zgiełk, warstw
b) połącze liter: ch, cz, sz, dz, dź, dż, rz oznaczających jedną głoskę, np.: o-chota, be-czeć, ko-szyk, wo-dzu, nie-dźwiedź albo niedź-wiedź, droż-dże, bu-rza (ale wolno dzielić: od-żywiać się, nad-zór, mar-znąć (...)
c) grup: spółgłoska+i+samogłoska, np. bia-ły, wia-dro, mia-ra, nio-sę, pio-rę, cie-niej
d) dwugłosek: au, eu (tj. połączeń tych samogłosek wymawianych jednosylabowo) np.: au-tor, pau-za, pneu-ma-tyk, Eu-ge-niusz, Eu-ty-fron, Zeu-sa; natomiast można podzielić a-u, e-u wymawiane jako dwie sylaby, np.: Te-ze-usza, Ma-te-usz (...)
2. Dzielenie grup spółgłoskowych:
Grupę spółgłosek można albo całą przenieść do następnego wiersza, np.: wa-rstwa, Tu-rcja, albo podzielić dowolnie, np.: war-stwa, wars-twa, warst-wa, Tur-cja, Turc-ja (nie wolno tylko zostawiać w poprzenim wierszu całej grupy spółgłoskowej, oddzielonej od następującej po niej samogłoski, tzn. nie wolno dzielić tak: warstw-a, Turcj-a)
Odchyleniem do tej swobodnej zasady jest ograniczenie polegające na obowiązku oddzielania rdzenia od przedrostka (...)"
Dalej jest cały dłuuuugi paragraf na ten temat, co przekracza możliwości implimentacji go ze względu na niemożność ustalenia rdzenia i przedrostka w języku polskim (zbyt dużo wyjątków).
Jeszcze inne szczegółowe informacje na temat dzielenia (już całości nie zacytuję) to.
Pojedyncza spółgłoska należy do drugiej sylaby (nie-po-cie-szo-ny)
Dwie jednakowe spółgłoski muszą być rozdzielone (mięk-ki, pan-na)
Wolno dzielić obce ia, ie, io, iu w zgłoskach niekońcowych (bi-o-lo-gia, di-e-ta).
Jednym słowem. Można ułożyć prosty algorytm jedynie dla ogólnych zasad, nie sprawdzający się zawsze :(

1

Z tego co tutaj przeczytałem, nie macie algorytmu dzielącego wyraz na sylaby. A ja się niestety wpakowałem się w ten temat i teraz muszę sobie jakoś z tym poradzić. :/
Też coś próbowałem znaleźć, ale wszędzie były tylko ogólne zarysy algorytmu albo stwierdzenia, że takowy nie istnieje, ale nic dokładnego.
Najlepsze rozwiązanie jakie znalazłem z moimi małymi poprawkami wydaje się być godne uwagi:

  1. Trzeba wyróżnić "rdzenie" sylab:
    Sylaba zawiera w sobie jedną samogłoskę (aąeęioóuy), chyba że:
  • zawiera 'i' bezpośrenio po spółgłosce i bezpośrednio przed samogłoską, np: li-lia, wie-lo-pię-tro-wiec, pie-nią-dze
  • zawiera 'u' bezpośrenio po innej samogłosce (u brzmi prawie tak jak ł)
  1. Jak mamy już samogłoskę "wiodącą" to możemy określić podział:
  • dwuznaki nigdy sie nie dzielą (cz, sz, dż, dz, ch, rz)
  • rz nie zawsze jest dwuznakiem (np. zamarznięty), być może inne dwuznaki też mają tego typu wyjątki
  • spółgłoska po której znajduje się 'i' zawsze idzie razem z tym 'i'
  • jeśli pomiędzy dwoma samogłoskami z różnych sylab jest tylko jedna spółgłoska to idzie do drugiej sylaby
  • ą i ę zwykle kończą sylabę (wszystkie spółgłoski po nich idą do kolejnej sylaby)
  • zastawy 'sj' i 'nj' i 'cj' oraz często 'tr' i 'ts' nie lubią być dzielone
  • jeśli mamy do czynienia ze zlepkiem słów, podział zawsze idzie po miejscu sklejenia, nawet gdy z innych zasad wynikałoby inaczej, np: przed-ekran, roz-o-rać, nad-e-mis-ja (lub nad-e-mi-sja), su-per-ak-cja, an-ty-tre-ning, spół-u-kład
  • jeśli są 2 lub więcej spółgłosek to pierwsza z nich idzie do pierwszej sylaby, reszta do drugiej (dwuznaki liczymy jako jedną głoskę!) (zasada zachodzi tylko gdy nie wystepuje któryś z wcześniejszych warunków))
  • w razie wątpliwości lepiej jest przydzielić spółgłoskę do sylaby nastepującej, a nie poprzedzającej

źródło: http://www.it-faq.pl/news_archives/pl.comp.programming/2004/jan/msg01313.html

Moje poprawki:

  • jeżeli chodzi wyrazy zawierające "au" i "eu" to zwykle się ich nie dzieli, wyjątek stanowią w zestwieniu "a-uk" i "e-usz", wówczas należy je rozdzielić;
  • właściwie każdy z dwuznaków ch, cz... itd ma jakieś swoje wyjątki, które niestety trzeba uwzględnić osobno.

Co do zasady z zestawami "cj", "sj"... itd, to martwią mnie określenia "często" i "nie lubią być", które nijak się mają do algorytmizacji.

Udało mi się nawet zaimplementować wszytkie te reguły za wyjątkiem dwóch: reguły "wyjątków dwuznaków" i reguły "słów sklejanych". A z tego co czytałem, to nawet najlepsze impementacje w 10% przypadków popełniają błędy przy podziale wyrazu na sylaby.

Jak już pisałem we wstępie nieświadomie wkopałem się w ten temat i teraz potrzebuję najlepszego algorytmu. Jest mi on m.in. potrzebny do oszacowania ilości sylab w języku polskim.

Mam nadzieję, że temat nie jest jeszcze wyczerpany i da się go rozwniąć ;).

Pozdrawiam

0

Przypadkiem nie pomieszaliście zasad dzielenia wyrazu (przenoszenie części słowa do nowej linii) z podziałem na sylaby.

Algorytm do dzielenia kiedyś robiłem - nie był zbytnio skomplikowany, ale ułatwiłem sobie trochę zadanie, poprzez zaostrzenie kilku reguł (mniej agresywnie dzielił, ale nie popełniał błędów (prawie) - nie musiałem uwzględniać tych tysięcy wyjątków).
Błędy występowały bardzo rzadko.

Takie słówko: 'podekranowy' :)

0
arturfir napisał(a)

Ale jeszcze trzeba uwzglednic:

  • jezeli wystepuja dwie spolgloski obok siebie
  • uwzglednic zasade nie rozdzielnosci dwuznakow typu 'ch', 'rz', sz', 'cz'

Też kiedyś to robiłem ale nie skończyłem tego. Ale jeśli chodzi o uwzględnianie czy "ch", "rz"... mają być nierozdzielne to lepiej w pierwszym etapie słowo podzielić na głoski i wstawić do tabeli. A potem pracować na pojedyńczych głoskach a nie literach. :)

0
grzesiek86-13 napisał(a)

Też kiedyś to robiłem ale nie skończyłem tego. Ale jeśli chodzi o uwzględnianie czy "ch", "rz"... mają być nierozdzielne to lepiej w pierwszym etapie słowo podzielić na głoski i wstawić do tabeli. A potem pracować na pojedyńczych głoskach a nie literach. :)

Pomimo, że odświeżyłeś stary wątek i powinienem go zablkować, to nie zrobię tego (dopiero się zarejestrowałeś, więc tylko upomnienie).

A co do rozdzielenia na głoski, to niestety przy słowie "tarzan" nie będziesz i tak wiedział, jak rozdzielić.

1 użytkowników online, w tym zalogowanych: 0, gości: 1