Между прочим, в дополнение к самому правому руководству согласно комментариям выше, я также установил более низкие контрастные руководства для столбцов 4, 8, 12, 16 и т.д. Это действительно помогает с удобочитаемостью кода.
Функция, которую я даю вам раньше, основана на этих простых правилах, описанных здесь :
Каждая гласная (a, e, i, o, u, y) в а слово считается одним слогом при условии следующие подправила:
- Игнорировать окончательные -ES, -ED, -E (кроме для -LE)
- Слова из трех букв или меньше считается одним слогом
- Последовательные гласные считаются одним слогом слог.
Вот код:
def new_count(word)
word.downcase!
return 1 if word.length <= 3
word.sub!(/(?:[^laeiouy]es|ed|[^laeiouy]e)$/, '')
word.sub!(/^y/, '')
word.scan(/[aeiouy]{1,2}/).size
end
Очевидно, это тоже не идеально, но все, что вы когда-либо получите с чем-то вроде этого, - это эвристика.
Я немного изменил код на обработать начало 'y' и исправлено регулярное выражение, чтобы лучше обрабатывать окончания 'les' (например, в "свечах").
Вот сравнение с использованием текста в вопросе:
# used to get rid of any puncuation
text = text.gsub!(/\W+/, ' ')
words = text.split(' ')
words.each do |word|
old = count_syllables(word.dup)
new = new_count(word.dup)
puts "#{word}: \t#{old}\t#{new}" if old != new
end
Результат:
logorrhoea: 3 4
used: 2 1
makes: 2 1
themselves: 3 2
Итак похоже, это улучшение.
Одна вещь, которую вы должны сделать, - это научить ваш алгоритм дифтонгам . Если я правильно читаю ваш код, он неправильно пометит слово «помощь» как имеющее два слога.
Вы также можете добавить «es» и тому подобное в свои окончания для особых случаев (у вас уже есть «ing») и просто не считайте это как слог, но это все равно может привести к некоторым ошибкам.
Наконец, для большей точности вы должны преобразовать введенные вами данные в схему правописания или алфавит, который имеет определенное отношение к произношению слова. В вашем примере "самих себя" алгоритм не имеет надежного способа узнать, что "e" "ves" отброшено. Однако, если вы измените его как «themselvz» или обучили алгоритм IPA и скармливали ему [ðəmsɛlvz], становится очень ясно, что слово произносится только с двумя слогами. Это, конечно, предполагает, что вы контролируете ввод, и это, вероятно, больше работы, чем просто подсчет слогов самостоятельно.
Для начала вам следует уменьшить len для суффиксов, которые должны быть исключены.
len-=1 if /.*[ing,es,ed]$/.match(word)
Вы также можете проверить Lingua :: EN :: Readability .
Он также может вычислять несколько показателей удобочитаемости, таких как индекс тумана и уровень Флеша-Кинкейда.
PS. Думаю, я знаю, откуда у вас функция из . DS.