Ruby, слоги количества

Между прочим, в дополнение к самому правому руководству согласно комментариям выше, я также установил более низкие контрастные руководства для столбцов 4, 8, 12, 16 и т.д. Это действительно помогает с удобочитаемостью кода.

8
задан Kevin Brown 20 February 2015 в 03:13
поделиться

3 ответа

Функция, которую я даю вам раньше, основана на этих простых правилах, описанных здесь :

Каждая гласная (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

Итак похоже, это улучшение.

11
ответ дан 5 December 2019 в 10:43
поделиться

Одна вещь, которую вы должны сделать, - это научить ваш алгоритм дифтонгам . Если я правильно читаю ваш код, он неправильно пометит слово «помощь» как имеющее два слога.

Вы также можете добавить «es» и тому подобное в свои окончания для особых случаев (у вас уже есть «ing») и просто не считайте это как слог, но это все равно может привести к некоторым ошибкам.

Наконец, для большей точности вы должны преобразовать введенные вами данные в схему правописания или алфавит, который имеет определенное отношение к произношению слова. В вашем примере "самих себя" алгоритм не имеет надежного способа узнать, что "e" "ves" отброшено. Однако, если вы измените его как «themselvz» или обучили алгоритм IPA и скармливали ему [ðəmsɛlvz], становится очень ясно, что слово произносится только с двумя слогами. Это, конечно, предполагает, что вы контролируете ввод, и это, вероятно, больше работы, чем просто подсчет слогов самостоятельно.

4
ответ дан 5 December 2019 в 10:43
поделиться

Для начала вам следует уменьшить len для суффиксов, которые должны быть исключены.

len-=1 if /.*[ing,es,ed]$/.match(word)

Вы также можете проверить Lingua :: EN :: Readability .

Он также может вычислять несколько показателей удобочитаемости, таких как индекс тумана и уровень Флеша-Кинкейда.

PS. Думаю, я знаю, откуда у вас функция из . DS.

1
ответ дан 5 December 2019 в 10:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: