На мой взгляд, такие вещи лучше решать привлечением дополнительных словарей, при обнаружении слова в которых выставлять флаги. Как это сейчас делается для двойных русских фамилий.
Сейчас мне сложно вспомнить какие-то исключения, спать хочется. Всё зависит от фамилии, происхождения, словоупотребительной практики. Возможно, статья на «Грамоте» поможет пролить свет.
В репозитории сейчас имеются какие-то примитивные тесты на RSpec, но я их особо не читал. Процедура автоматической оценки по словарю АОТ открыта и реализована как Rake-задача rake evaluate.
Конечно нет, не так. Мы живём в неидеальном мире. Ни в коем случае нельзя забывать о человеческой невнимательности, которая может заключаться и в технической стороне дела. В реальном мире полно примеров, которые я привёл в предыдущем комментарии.
Если совсем интересно, то могу поделиться опытом. У меня есть сервис извлечения ключевых слов. У сервиса есть API, им пользуются люди. Некоторое время назад в Squash начали появляться ошибки, связанные с некорректными байтами в строках. Я начал смотреть дампы параметров. Оказалось, что в некоторых входных текстах наряду с нормальными буквами присутствуют неюникодные символы, которые появились в результате: 1) парсинга Веб-сайтов; 2) какой-то кривой конвертации из офисных форматов. Удаление неправильных байт из текстов решило все подобные проблемы.
Я могу. Неправильная последовательность байт — это наличие в строке символов, не соответствующих её кодировке. Зачастую данные, приходящие в работающую программу извне могут быть некорректны — как заведомо, так и неосознанно. Лучше отфильтровать некорректные байты сразу, чем потом хвататься за голову при ошибках в боевых условиях.
Например, существует кодировка UTF-8. Строка "vit\xC3\xA6" является корректной записью слова vitæ и не содержит недопустимых символов. В свою очередь, строка "hello\x00\x20\uDC80there" некорректна. Благодаря методу String#scrub она превратится в безобидное hello there.
Сам по себе метод нужный и не кажется мне костылём. Это всего лишь фильтрация данных.
Костыльность заключается в его вынужденной реализации с учётом особенностей JRuby, MRI, и других Ruby. Например, в какой-то версии MRI есть iconv в стандартной библиотеке, в какой-то новой версии его объявили устаревшим; в текущем JRuby 1.7.4 есть баг JRUBY-7007; в Rubinius также регулярно возникают проблемы с Unicode, и так далее.
Стандартизация метода и требуемого поведения — правильное решение.
В целом, согласен. За последнее время возникает ощущение, что создатели языка Ruby схватились и начали запихивать в себя вещи, которые им приглянулись в дизайне других языков. Чем-то напоминает эволюцию C# от Microsoft, который также набрал в себя слишком многое.
Для меня лично особенно ценен новый метод String#scrub. В задачах NLP на входе может быть любой мусор и зачастую непросто добиться одинакового поведения на разных реализациях Ruby. Раньше для этого были собственные костыли, теперь есть родное решение.
rake evaluate
.Если совсем интересно, то могу поделиться опытом. У меня есть сервис извлечения ключевых слов. У сервиса есть API, им пользуются люди. Некоторое время назад в Squash начали появляться ошибки, связанные с некорректными байтами в строках. Я начал смотреть дампы параметров. Оказалось, что в некоторых входных текстах наряду с нормальными буквами присутствуют неюникодные символы, которые появились в результате: 1) парсинга Веб-сайтов; 2) какой-то кривой конвертации из офисных форматов. Удаление неправильных байт из текстов решило все подобные проблемы.
Например, существует кодировка UTF-8. Строка
"vit\xC3\xA6"
является корректной записью слова vitæ и не содержит недопустимых символов. В свою очередь, строка"hello\x00\x20\uDC80there"
некорректна. Благодаря методуString#scrub
она превратится в безобидное hello there.Костыльность заключается в его вынужденной реализации с учётом особенностей JRuby, MRI, и других Ruby. Например, в какой-то версии MRI есть iconv в стандартной библиотеке, в какой-то новой версии его объявили устаревшим; в текущем JRuby 1.7.4 есть баг JRUBY-7007; в Rubinius также регулярно возникают проблемы с Unicode, и так далее.
Стандартизация метода и требуемого поведения — правильное решение.
String#scrub
. В задачах NLP на входе может быть любой мусор и зачастую непросто добиться одинакового поведения на разных реализациях Ruby. Раньше для этого были собственные костыли, теперь есть родное решение.