Страницы: 1 2 След.
RSS
Деление на слоги
 
Как поделить слова на слоги:карандаш,галоши?!
 
Для этого Вы должны обучить Excel правилам языка.
 
По крайней мере количество слогов посчитать несложно: оно будет равно количеству гласных.
 
Ничего себе задачи народ задает : ) Оля., почитайте здесь для начала  
 http://www.planetaexcel.ru/forum.php?thread_id=8735  
Юрий М, мне вот даже интересно стало, справяться ли с этой задачей регулярные выражения : ) А для того, чтобы иметь возможность это проверить, необхлдимо четко сформулировать правила разбиения. Че т русский вспоминать так не хочется)))
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Макросом, в принципе, не так уж и сложно. Вот правила:  
 http://www.licey.net/russian/phonetics/1_6  
не такие они и сложные, кому не лень - можно было б и написать. Зы. прочитал правила, и узнал что в это вопросе я безграмотен :(
 
{quote}{login=nerv}{date=18.02.2012 07:46}{thema=}{post}  
справяться ли с этой задачей регулярные выражения  {/post}{/quote}  
на мой взгляд они там и не нужны. Я б попробовал, но после болезни голова пока не варит.
 
Думаю, при большом желании, можно самостоятельно разработать алгоритм, взяв число гласных за основу анализа. Хотя, думаю, при достаточном упорстве и удаче можно найти уже готовый алгоритм. Мне с ходу удалось найти только реализацию для javascript:  
 http://forum.vingrad.ru/forum/s/f63ccda5b94563fc1e1c1ab01b17421b/topic-104640/anchor-entry795243/0.html
 
>на мой взгляд они там и не нужны. Ну-ну) Чтобы велик не изобретать, подобный этому  
 http://forum.vingrad.ru/index.php?showtopic=104640&view=findpost&p=799426  
достаточно одного регулярного выражения [это на вскидку]. >Мне с ходу удалось найти только реализацию для javascript. Я js знаю, но переводить не стану. Мотивации нет : )
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Для VBA будет  
 
Private smbRegExp As Object  
Private Sub Initialize_RegExp()  
   Set smbRegExp = CreateObject("VBScript.RegExp")  
   smbRegExp.Global = True: smbRegExp.IgnoreCase = True  
   smbRegExp.Pattern = "[аеёиоуыэюя]"
End Sub  
 
Public Function SyllableCount(ByVal Text As String) As Long  
   If smbRegExp Is Nothing Then Initialize_RegExp  
   SyllableCount = smbRegExp.Execute(Text).Count  
End Function
 
anvg, это Вы количество гласных подсчитали, а задача была:  
>поделить слова на слоги  
 
[Михаил С.] Я б попробовал, но после болезни голова пока не варит.
Желаю скорейшего выздоровления!
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Вообще-то автоматическая расстановка переносов - это достаточно сложный процесс, которому посвящено много разных статей. Но практически все алгоритмы, дающие приличный результат основаны на использовании таблиц правил переноса. По разным данным эти таблицы содержат от 3000 до 5000 правил. Оно вам надо, так заморачиваться?  
Можно, наверное, как-то умудриться использовать встроенный в Ворд переносчик... Но как к нему обратиться (в смысле как передать ему слово и получить обратно с расставленными переносами) ... ??? Да и тормозить, наверное, такая связка Excel-Word-Excel будет очень сильно. Вот, например, теме переносов посвящен сайт  
http://www.batov.ru/
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Гы:-) А вам не кажется, что Оля давно забыла о своем посте в форум? А вы тут бисер мечете...
Я сам - дурнее всякого примера! ...
 
>Вообще-то автоматическая расстановка переносов - это достаточно сложный процесс  
Не собираюсь спорить, но тем не менее, алгоритм, ссылку на кот. приводил anvg и я по мнению участников форума, рабочий.  
 
>Гы:-) А вам не кажется, что Оля давно забыла о своем посте в форум?  
Думаю, так и есть. Признаться, мне абсолютно все равно. Интересно было порассуждать на тему самой задачи.
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Привила слогоделения могут быть разные в зависимости от того, для чего оно применяется. Большинство "гифенаторов" (в том числе, все версии гифенатора Батова) - это средства автоматического переноса слов. Совсем другой алгоритм требуется для подтекстовки нот в вокальной музыке (каждый слог должен располагаться под своей нотой или группой нот). Тут скорее подошел бы алгоритм с форума vingrad.ru, но и он несовершенен, так как не учитывает морфологию. А вот пример реализованной и широко известной в узком кругу музыкантов утилиты С.Лебедева: http://www.notovodstvo.ru/downloads/rhyphen/ (не знаю, на каком языке, точно не на VBA). Жаль, что обещанные немецкий и французский модули так и не появились.  
Что касается подсчета слогов, то с этим только в русском языке всё так просто. Правда, глядя на код уважаемого anvg этого не скажешь :-) Я, конечно, дилетант и ничего в нем не понял, а сам в свое время сделал что-то вроде  
 
Public Function SyllableCount(ByVal Text As String) As Long  
voc = Array("А", "Е", "Ё", "И", "О", "У", "Ы", "Э", "Ю", "Я", "а", "е", "ё", _ "и", "о", "у", "ы", "э", "ю", "я")  
cons = Text  
For i = 0 To 19  
cons = Replace(Сons, voc(i), "")  
Next i  
SyllableCount = Len(Text) - Len(cons)  
End Function  
 
Можно, конечно и без замен обойтись, просто посчитать вхождения гласных.  
 
А теперь представьте себе подсчет слогов в английском тексте (итальянском, французском, если кто в курсе). Подобных замен потребуются сотни. О практическом смысле расскажу, если найдутся любопытные. (Пишу это только из желания поддержать интересующую меня тему; ни в какой помощи я тут не нуждаюсь; алгоритмы мои далеки от совершенства, но вполне удовлетворяют условиям задачи).
 
еще вариант:  
Function SyllableCount&(Text$)  
Dim i&  
For i = 1 To Len(Text)  
   If InStr("аеёиоуыэюя", LCase(Mid(Text, i, 1))) Then SyllableCount = SyllableCount + 1  
Next i  
End Function
 
{quote}{login=MCH}{/quote}  
Спасибо, отличный вариант! Некоторых приемов я не знал, теперь буду активно применять :-)
 
Вообще-то Оля просила поделить на слоги слова "ка-ра-ндаш" и "га-ло-ши".  
:)  
 
зы. деление на слоги не совпадают с правилами переноса.  
 
Количество слогов:  
=СУММПРОИЗВ(--ЕЧИСЛО(ПОИСК({"а";"е";"и";"у";"ы";"о";"э";"я";"ю";"ё"};ПСТР(A1;СТРОКА(1:20);1))))
 
Формула замысловатая, но считает она слоги только в первых 20 знаках строки :-)
 
=СУММПРОИЗВ(ДЛСТР(A1)-ДЛСТР(ПОДСТАВИТЬ(СТРОЧН(A1);{"а":"е":"ё":"и":"о":"у":"ы":"э":"ю":"я"};)))  
 
формула массива:  
=СЧЁТ(1/(ПОИСК(ПСТР(A1;СТРОКА($1:$99);1);" аеёиоуыэюя")-1))
 
{quote}{login=leongur}{date=21.02.2012 05:36}{thema=}{post}Формула замысловатая, но считает она слоги только в первых 20 знаках строки :-){/post}{/quote}Вообще-то, насколько я понял, речь шла об одном слове. При большом желании не сложно переделавть и на всю строку, тем более, что все равно больше 256 знаков не обработает.  
=СУММПРОИЗВ(--ЕЧИСЛО(ПОИСК({"а";"е";"и";"у";"ы";"о";"э";"я";"ю";"ё"};ПСТР(A1;СТРОКА(1:256);1))))
 
Да все уж давно забыли, о чем там речь шла. В моей же задаче порой и 32767 знаков было не достаточно :-)
 
{quote}{login=Оля.}{date=18.02.2012 05:25}{thema=Деление на слоги}{post}Как поделить слова на слоги:карандаш,галоши?!{/post}{/quote}  
Как-то так.    
Правда пока работает с отдельными словами, с текстом не совсем корректно.
 
Забыл зарегитьcя. Выше - я
 
{quote}{login=}{date=22.02.2012 12:22}{thema=Re: Деление на слоги}{post}Как-то так.    
Правда пока работает с отдельными словами, с текстом не совсем корректно.{/post}{/quote}  
Спасибо. К Вашему варианту добавил несколько строк, теперь и с текстом работает. Правда, нормы слогоделения по Вашей ссылке местами показались мне довольно сомнительными.
 
{quote}{login=MCH}{date=21.02.2012 06:00}{thema=}{post}=СУММПРОИЗВ(ДЛСТР(A1)-ДЛСТР(ПОДСТАВИТЬ(СТРОЧН(A1);{"а":"е":"ё":"и":"о":"у":"ы":"э":"ю":"я"};)))  
формула массива:  
=СЧЁТ(1/(ПОИСК(ПСТР(A1;СТРОКА($1:$99);1);" аеёиоуыэюя")-1)){/post}{/quote}  
 
Спасибо, до такого бы я не додумался! Только я не очень понял, зачем в первой формуле СУММПРОИЗВ ? То же самое получается и просто с СУММ.
 
У меня сразу выдал ошибку - переменная Р не объявлена, а у меня Option Explicit.  
Но все равно, спасибо за добавление.  
Зы. и у меня переменная SyllableCount& лишняя - осталась как артефакт.
 
{quote}{login=}{date=22.02.2012 05:56}{thema=Re: }{post}Спасибо, до такого бы я не додумался! Только я не очень понял, зачем в первой формуле СУММПРОИЗВ ? То же самое получается и просто с СУММ.{/post}{/quote}  
Достаточно использовать СУММ, т.к в формуле используется массив констант, а не ссылка на диапазон.
 
Если кто-нибудь четко сформулирует правила разбиения по слогам, я попробую UDF написать. Кстати, как поделить на слоги слово "вьетнам"?)  
 
В файле цветом отмечено сомнительное разбиение.
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
{quote}{login=nerv}{date=22.02.2012 10:15}{thema=}{post}Если кто-нибудь четко сформулирует правила разбиения по слогам,.. {/post}{/quote}  
По ссылке в файле правила изложены очень четко и полно. Вот цитата с одного из форумов, где обсуждались слоги: "Это ссылка на сайт, где выложена электронная версия книги "Современный русский язык", в то место, где рассматриваются слоги и слогоразделы:  
http://rusforus.ru/go.php?http://www.hi-edu.ru/e-books/xbook107/01/part-021.htm#i1525  
 
Можете сходить, посмотреть. Там не так подробно, но по сути тоже самое. Перенос слов хоть и производится в основном по слогам, но правила переноса несколько отличны.
 
Мне немного неловко, но хочу напомнить, что встрял в эту тему, так как давно ей интересуюсь. Никакой практической необходимости у меня в этом на сегодняшний день нет. Но я готов продолжить ее обсуждение из чисто спортивного интереса и ради остающейся за кадром Ольги.  
По поводу четкости и полноты изложения правил.  
"Если слог состоит из двух и более звуков, то начинается он обязательно с согласного!" А если подряд два гласных? (поэт, пиетет) или, того хуже, Трансаэро?  
Но даже, если закрыть глаза на подобные неточности, все правила выглядят довольно умозрительно. Либо морфология, либо фонетика. Потому что, решая любую практическую задачу, приходится учитывать и то, и другое. У машинного разбиения на слоги, по-моему, только три практические области применения: автоперенос, нотный набор (ноты со словами) и озвучивание текстов (генерация речи). Мне по роду моей деятельности приходилось иметь дело со второй. Я пользовался утилитой Лебедева (ссылка в первом моем посте), слегка поправляя то, что она выдавала. При этом руководствовался только своей интуицией. Потому что ноты читают глазами, перерабатывая одновременно кучу разнородной информации. И все это при этом нужно петь. Если по всем правилам фонетики разбить слова на слоги, то некоторые из них окажутся при беглом чтении неузнаваемыми (когда часть согласных оторвана от корня или, например, слог начинается с буквы "ы"). Для человека, поющего на родном языке, важнее, чтобы текст безошибочно читался, а уж произнесет он его как надо.  
Извиняюсь за столь отвлеченные рассуждения, но ничего более внятного сообщить не могу.  
nerv. Вьетнам я бы вообще делить поостерегся (мало Вам Кореи?) Но если чисто теоретически, то "Вьет-нам", наверное :-)
Страницы: 1 2 След.
Читают тему
Наверх