Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Выделение слогов в слове


Автор: Rain 18.7.2006, 20:50
Привет!
Есть ли стандартная функция деления слов на слоги? Если нет может кто писал такую? Помогите пожалуйста! Или если есть формализованный алгоритм, прошу его привести!

Заранее спасибо! 

Автор: Rain 18.7.2006, 20:58
Привет!

Если есть формализованный алгоритм выделения слогов в слове, прошу его привести!

Заранее спасибо! 

Автор: Voldemar2004 18.7.2006, 21:03
Откуда функция будет знать какие в словах слоги, да еще в русских ?! smile А вообще можно что-то подобное реализовать так: по принципу "сколько в слове гласных, столько и слогов", например "молоко" - результат "мо", "ло", "ко". Здесь надо создать массив гласных букв и согласных, цикл по всему тексту со сравнением, далее делить слова по вышеописанному принципу. 

Автор: Romikgy 18.7.2006, 21:04
Цитата(Rain @  18.7.2006,  19:58 Найти цитируемый пост)
формализованный алгоритм выделения слогов в слове, 

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

Автор: BUGOR 18.7.2006, 21:11
Слог должен начинаться на одну или более согласных и заканчиваться гласной или начинаться на одну гласную и заканчиваться согласной. Вот и все условия. 

Автор: Romikgy 18.7.2006, 21:31
Цитата(BUGOR @  18.7.2006,  20:11 Найти цитируемый пост)
Слог должен начинаться на одну или более согласных и заканчиваться гласной

слово "взгляд", имхо оно же и слог , не подходит к твоему определению smile 

Автор: Rain 18.7.2006, 21:33
Да не это не тема! Наверняка есть уже наработанные алгоритмы! 

Автор: Romikgy 18.7.2006, 21:50
http://www.google.com.ua/search?hl=uk&q=%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D0%B8%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9+%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC+%D0%B2%D1%8B%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F+%D1%81%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2+%D0%B2+%D1%81%D0%BB%D0%BE%D0%B2%D0%B5&btnG=%D0%9F%D0%BE%D1%88%D1%83%D0%BA+%D1%83+Google&meta=

Добавлено @ 21:50 
второя ссылка может поможет 

Автор: sergejzr 18.7.2006, 22:27
Rain, не следует дублировать темы! 

Автор: Никто 20.7.2006, 19:01
Начинаешь с начала слова.Запоминаешь первую букву слова,потом переходишь на одну букву вперед ища гласную.Потом ищешь вторую гласную.Если нашел,то слог будет от начала отсчета до n-2,n-это номер второй гласной.Потом началом отсчета делаешь предыдущую букву перед гласной.И повторяешь все заново.Только сначала сделай массив букв и определи их.Если следующий будет пробел,следующее слово. 

Автор: DemoCode 20.7.2006, 19:12
Цитата(BUGOR @  18.7.2006,  22:11 Найти цитируемый пост)
Слог должен начинаться на одну или более согласных и заканчиваться гласной или начинаться на одну гласную и заканчиваться согласной. Вот и все условия.  

Есть слоги состоящие всего из одной гласной, например: кри-о-ни-ка, ме-те-о-рит. 

Автор: skyboy 20.7.2006, 19:16
яб-ло-ко просто не разбить, чтоб "начиналось с согласной". также, как в са-мо-лёт последний слог не заканчивается на гласную(закрытый слог). 

Автор: sergejzr 20.7.2006, 19:18
Я чтото тоже не смог найти. Придётся видимо думать самим smile

количество слогов в слове = количеству гласных - это факт. Вооюще, возможен такой алгоритм, или придётся исключения описывать?
Какие могут быть разбиения?

глас - на-я

про-стран-ство
про-сто
о-прос

вот например по разному при одинаковых буквах разбивается..
 

Автор: DemoCode 20.7.2006, 19:33
Цитата

Законы слогоделения в разных языках и даже диалектах одного языка неодинаковы. Например, представители севернорусского наречия произнесут при скандировании слово “дружба” так: друж-ба. А представители южнорусского наречия – иначе: дру-жба.
        В русском литературном языке деление на слоги опирается на   п р и н ц и п   в о с х о д я щ е й   з в у ч н о с т и .  Это обозначает, что звуки в слоге (незаконченом) располагаются от наименее звучного к наиболее звучному. Если звучность условно обозначить цифрами, получится следующее: 3 – гласный звук, 2 – сонорный согласный звук, 1 – остальные (шумные) согласные звуки. Разделение на слоги будет производится по принципу восходящей звучности: кни-га (1 2 3 - 1 3), и-на-че (3 - 2 3 - 1 3), по-ло-тно (1 3 - 2 3 - 1 2 3).
        Трудности при разделении слова на слоги могут возникнуть при стечении согласных. При этом в русском литературном языке, опирающемся на московское произношение, разделение на слоги будет осуществляться с учетом следующего:
        1. Если на границе слогов рядом оказались два шумных или два сонорных звука (кроме [j]), они относятся к последующему гласному: пу-шка, и-зба, во-лна.
        2. Если в сочетании согласных первый [j], он всегда отходит к предшествующему гласному: вой-на, май-ка.
        3. В сочетании согласных, первым из которых является сонорный, а вторым – шумный, сонорный может отходить к предшествующему гласному: кон-спект, Вол-га.
 

Автор: DemoCode 22.7.2006, 07:15
Вроде получилось...  Проверьте кому не лень. Слова вводить маленькими буквами.

Код

<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
  <title>Test</title>
  <script language="javascript">
    var vowel  = new String ('аеёиоуыэюя');                     // Гласные буквы
    var voiced = new String ('бвгджзлмнрхцчшщ');       // Звонкие и шипящие согласные
    var deaf   = new String ('кпстф');                             // Глухие согласные
    var brief  = new String ('й');                                      // Й
    var other  = new String ('ьъ');                                  // Другие
    var cons   = new String ('бвгджзйклмнпрстфхцчшщ'); // Все согласные
        // Валидация правильности введенной строки
        function validateString (s) {
       // Поленился делать :)
       return s;
        } // function validateString (s)
    // Есть ли в строке гласные?
    function isNotLastSep (remainStr) {
       var is = false;
       for (var i = 0; i < remainStr.length; i++) {
          if (vowel.indexOf (remainStr.substr (i, 1)) != -1) { is = true; break; }
       } // for (var i = 0; i < remainStr - 1; i++)
       return is;
    } // function isLastSep (remainStr)
    // Собственно функция разбиения слова на слоги
    function getSeparatedString (s) {
       // Добавляем слог в массив и начинаем новый слог
       function addSep () {
          sepArr.push (tmpS);
          tmpS = '';
       } // function addSep ()
       s = validateString (s);
       var tmpL   = new String ();  // Текущий символ
       var tmpS   = new String ();  // Текущий слог
       var sepArr = new Array ();   // Массив слогов
       for (var i = 0; i < s.length; i++) {
          tmpL = s.substr (i, 1);
          tmpS += tmpL;
          // Проверка на признаки конца слогов
          // если буква равна 'й' и она не первая и не последняя и это не последний слог
          if (
            (i != 0) && 
            (i != s.length -1) && 
            (brief.indexOf (tmpL) != -1) &&
            (isNotLastSep (s.substr (i+1, s.length-i+1)))
          ) { addSep (); continue; }
          // если текущая гласная и следующая тоже гласная
          if (
             (i < s.length - 1) && 
             (vowel.indexOf (tmpL) != -1) && 
             (vowel.indexOf (s.substr (i+1, 1)) != -1)
           ) { addSep (); continue; }
          // если текущая гласная, следующая согласная, а после неё гласная
          if (
             (i < s.length - 2) && 
             (vowel.indexOf (tmpL) != -1) && 
             (cons.indexOf (s.substr (i+1, 1)) != -1) && 
             (vowel.indexOf (s.substr (i+2, 1)) != -1)
           ) { addSep (); continue; }
          // если текущая гласная, следующая глухая согласная, а после согласная и это не последний слог
          if (
             (i < s.length - 2) && 
             (vowel.indexOf (tmpL) != -1) && 
             (deaf.indexOf (s.substr (i+1, 1)) != -1) && 
             (cons.indexOf (s.substr (i+2, 1)) != -1) &&
             (isNotLastSep (s.substr (i+1, s.length-i+1)))
          ) { addSep (); continue; }
          // если текущая звонкая или шипящая согласная, перед ней гласная, следующая не гласная и не другая, и это не последний слог
          if (
             (i > 0) && 
             (i < s.length - 1) && 
             (voiced.indexOf (tmpL) != -1) && 
             (vowel.indexOf (s.substr (i-1, 1)) != -1) && 
             (vowel.indexOf (s.substr (i+1, 1)) == -1) && 
             (other.indexOf (s.substr (i+1, 1)) == -1) && 
             (isNotLastSep (s.substr (i+1, s.length-i+1)))
          ) { addSep (); continue; }  
          // если текущая другая, а следующая не гласная если это первый слог
          if (
             (i < s.length - 1) && 
             (other.indexOf (tmpL) != -1) &&
             ((vowel.indexOf (s.substr (i+1, 1)) == -1) || 
             (isNotLastSep (s.substr (0, i))))
          ) { addSep (); continue; } 
       } // for (var i = 0; i < s.length; i++)
       sepArr.push (tmpS);
       return sepArr.join('-');
    } // function getSeparatedString (s)
  </script>
 </head>
 <body>
 <form>
    <input type="text" size="30" name="fromString" value="">
    <input type="button" value="Go!" onClick="document.forms[0].elements[2].value = getSeparatedString (document.forms[0].elements[0].value);">
    <br>
    <input type="text" size="30" name="toString" value="">
 </form>
 </body>
</html>

  

 

Автор: sergejzr 22.7.2006, 12:10
Отличная работа!
Я залил на винград.
http://files.vingrad.ru/sergej.z/js/algorithms/slogi/  

Автор: Romikgy 22.7.2006, 16:00
Цитата(sergej.z @  22.7.2006,  11:10 Найти цитируемый пост)
Отличная работа!

не всегда 
вот твой пример
Цитата(sergej.z @  20.7.2006,  18:18 Найти цитируемый пост)
глас - на-я

вот что дал код
Код

гла-сна-я

 

Автор: DemoCode 24.7.2006, 08:16
Цитата(Romikgy @  22.7.2006,  17:00 Найти цитируемый пост)
гла-сна-я

Правильно. Так и должно быть 

Автор: DemoCode 24.7.2006, 16:24
Чтобы это работало и с заглавными буквами надо заменить строки с 6 по 11 на:

Код

    var vowel  = new String ('аеёиоуыэюяАЕЁИОУЫЭЮЯ');                     // Гласные буквы
    var voiced = new String ('бвгджзлмнрхцчшщБВГДЖЗЛМНРХЦЧШЩ');       // Звонкие и шипящие согласные
    var deaf   = new String ('кпстфКПСТФ');                             // Глухие согласные
    var brief  = new String ('йЙ');                                      // Й
    var other  = new String ('ьъЬЪ');                                  // Другие
    var cons   = new String ('бвгджзйклмнпрстфхцчшщБВГДЖЗКЛМНПРСТФХЦЧШЩ'); // Все согласные
 

Автор: ILAgent 25.7.2006, 01:18
Цитата(DemoCode @ 24.7.2006,  08:16)
Цитата(Romikgy @  22.7.2006,  17:00 Найти цитируемый пост)
гла-сна-я

Правильно. Так и должно быть

Нет, не правильно. Корень ГЛАС, он же слог.

Это говорит о том, что нельзя придумать такой алгоритм. Слова и слоги в русском языке формируются не в соответствии с каким либо алгоритмом, это не формальный язык.

А вообще на многих словах правильно работает, молодец ! 

Автор: sergejzr 25.7.2006, 02:31
DemoCode, ведь описал правила и по этим правилам гла-сна-я - правильно. Корни слов тут не причём. Там же и описано, что разбиение разниться  вразных частях страны. Его реализация - это одно из определений и является абсолютно точной! 

Автор: DemoCode 25.7.2006, 14:44
ILAgent, попробуй громко проскандировать слово "гласная", если ты вырос не на юге России, то у тебя получиться: "гла-сна-я". В "официальном" русском языке разбиение слов на слоги осуществляется на основе московского произношения. 

Автор: Romikgy 25.7.2006, 14:55
Цитата(DemoCode @  25.7.2006,  13:44 Найти цитируемый пост)
на основе московского произношения

когда это русский язык стал в  основе московский вариант? 

Автор: DemoCode 25.7.2006, 14:57
Цитата(Romikgy @  25.7.2006,  15:55 Найти цитируемый пост)
когда это русский язык стал в  основе московский вариант?

Видать уже давно, так даже в книгах ещё 60-х годов пишут.  

Автор: Romikgy 25.7.2006, 15:00
Цитата(DemoCode @  25.7.2006,  13:57 Найти цитируемый пост)
 так даже в книгах ещё 60-х годов пишут.  

в каких имено? 

Автор: DemoCode 25.7.2006, 15:04
Цитата(Romikgy @  25.7.2006,  16:00 Найти цитируемый пост)
в каких имено?  

Не помню, я в библиотеке смотрел. По-моему: Виноградов В.В. Русский язык.-М.,196*.

Добавлено @ 15:07 
Да вот и на сайте филологического факультета МГУ сказано, что:

Цитата

Московское произношение - способ произношения, свойственный жителям Москвы, признанный произносительной нормой русского литературного языка.


Добавлено @ 15:17 
Я сейчас позвонил знакомому филологу, он сказал, что не будет ошибкой хоть по-северному делить, хоть по-южному, и так и так будет правильно. 

Автор: Никто 26.7.2006, 14:36
Вообще-то алгоритм есть,но должны иметь место также и слова исключения. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)