Pull to refresh

Comments 4

К сожалению, всё сильно сложнее, чем хотелось бы думать. И количество возможных случаев и конфликтов с их распознаванием таково, что простым скриптом это не распарсить. Просто несколько примеров «на подумать», наверняка не всё вспомню:

  1. Дроби бывают не только десятичные. Есть может быть одна пятая и одна двадцать пятая.

  2. У некоторых дробей есть нетипичные названия: половина, треть, четверть и т. п.

  3. Да и не только у дробей: пара, тройка, дюжина.

  4. Числительные бывают порядковыми. Можно сказать, что этот вопрос легко решается за счёт морфологии, но точно ли ваш код правильно различит слова «десятый [по порядку]» и «десятая [часть]»?

  5. Для степеней десятки существует короткая и длинная шкалы со своими именованиями чисел.

Если что, я ни в коем случае не обесцениваю вашу работу, и я только за то, чтобы было много разных доступных для использования решений. Но, к сожалению, код, который обрабатывает все варианты — это скорее набор из хаков, чем вот такая работа со словарём.

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

val ru = Locale("ru", "ru")
val icu = RuleBasedNumberFormat(ru, SPELLOUT)
println(icu.parse("одна двадцатая")) // 1
println(icu.parse("пятьдесят девять целых тридцать две")) // 59

где тут ML (machine learning)? может быть, вы хотели сказать NLP (natural language processing)?

Sign up to leave a comment.

Articles