Pull to refresh

Comments 59

класс. блеск. восторг.

сорок сороков плюсов.
Ну наконец-то мы узнаем где это тридевятое царство тридесятое государство.
И насколько далёки тридевять земель.
т.е. парсер ещё и привязку по местности выдаёт?
точнейшие координаты в пространственно-временном контиуунуме с привязкой к конкретной спирали вероятностной матрицы
Что касается последнего раздела, мне всегда было интересно, сколько же это – «дофига»

То есть алгоритм в принципе любую фразу/слово переведет в число, даже нечисловую?

Разумеется. Если в слове «жук» сделать две ошибки, то получится «ежик», и хотя это совершенно разные слова, с точки зрения программы они отличаются лишь наполовину.
Алгоритм помимо значения возвращает величину ошибки в пределах от 0 до 1. По ней можно сделать вывод, считать ли полученное число нужным Вам результатом или нет.

https://ru.wikipedia.org/wiki/Тьма:


Тьма — число в старинном русском счёте, равное десяти тысячам в малом счёте либо миллиону (тьма великая).

Верно распознал, однако!

«Тьма тем» — соответственно сто миллионов.
Тут уже, скорее, тьма-тьмущая! :)
UFO just landed and posted this here
Класс!
Что больше интересно вам, читатели, сами алгоритмы или фрагменты кода?
Алгоритмы!

Заголовок спойлера
GermanNumber.Parse(«VierUndFünfzigTausendDreiHundertAchtUndZwanzig»);
может быть распознано как «двадпать» или даже как «двапать»

Не знаю как в четверке, но в трешке можно было задать белый список слов
+ какое-нибудь огромное пенальти для слов не из словаря (language_model_penalty_non_dict_word)
+ белый список букв (tessedit_char_whitelist)
Сначала я использовал третью версию tesseract. Белый список символов позволил хорошо распознавать сами числа, но не текст прописью. Для некачественных изображений ситуация была ужасная. Кроме того, пенальти для слов не из словаря, – нерекомендуемое средство, оно не только не улучшает разбор, а напротив, зачастую ухудшает его.

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

В целом же четверка дает значительно более качественный разбор, чем тройка при меньшем времени обработки, что для моей задачи критично.
— Три тысячи тридцатый!
— Моя фамилия Зозо, товарищ прапорщик.
Спасибо, интересный алгоритм, сразу несколько интересных решений применено.
В моменте, где идёт деление токена на части ввиду возможного слияния и есть проблема «двапать», показалось возможным решением сохранять варианты до последующего парсинга: «два пять» отсеклось бы как некорректный вариант. С другой стороны, давать некоторый штраф разделенным токенам по сравнению с исходными в любом случае нужно, и если на практике этого хватает, то и нет смысла усложнять.

Спасибо, интересно. Знаю об обратной библиотеке Humanizer, которая превращает числа в прописные числа.

Весьма впечатляющее качество распознавания!
Очень интересный код, спасибо! Сразу начал обдумывать возможное портирование на С :)
Будет 5.000.000. Хотя токена «мульт» нет существует, слово сопоставляется с токеном «миллион» функцией Вагнера-Фишера лучше, чем с другими токенами.
UFO just landed and posted this here
Ну это из разряда фантастики. «вотьлум» сопоставилось с 800 с ошибкой 0.611, а «ьтяп» вообще ни с чем не сопоставилось. Итого 800.
UFO just landed and posted this here
На самом деле, «осемнадцать» – интересный пример. Казалось бы, возможно равное сопоставление как с «восемнадцать», так и с «семнадцать», но добавление буквы «в» стоит немного дешевле, чем удаление «о», т.к. длина токена «восемнадцать» больше на 2 символа, получаем 1 / 12 (0.083) против 1 / 10 (0.100). Поэтому однозначный ответ – 18 с величиной ошибки 0.083.
UFO just landed and posted this here
UFO just landed and posted this here
Почему вы не хотите скачать проект и экспериментировать с ним сколько вам угодно? Ссылка на проект есть в статье.
UFO just landed and posted this here
Консольное приложение нацелено на .NET Core 2.1, сама библиотека для .NET Standart 2.0. Если не запускается под линухой, значит там устаревшая версия .NET Core.
Как вариант, можно перенацелить проект на более старую версию коры, должно работать.
UFO just landed and posted this here

Как мне кажется, для таких случаев стоит использовать какой-то параметр уверености. Например, рассматривать 2 наиболее вероятных варианта. И не парсить слово, если у них ошибки достаточно близки.
Но тут, конечно, от задачи зависит. Где-то может быть нужно распарсить любой ценой, а где-то неправильный или неоднозначный парсинг недопустим.

Надо закоммитить новые токены
1—4 Few (мало)
5—9 Several (несколько)
10—19 Pack (стая)
20—49 Lots (скопище)
50—99 Horde (орда)
100—249 Throng (толпа)
250—499 Swarm (туча)
500—999 Zounds (тьма)
более 1000 Legion (легион)

Для этого надо научить выдавать диапазон, а не только число. Кстати, интересная мысль...

Это только когда астрологи объявят неделю токенов — тогда можно увеличить количество токенов и токенов-берсерков вдвое
Ага, и если это драконы, то всегда Few будет 4

А разве few не как "пара" переводилось?

Нет, там всё каплю сложнее:
image

Которая зависит от количества крестьян в нападающей армии?

Спасибо, очень доступно написано и интересно
ИМХО — в разделе экспертного мнения не хватает «до… я». Doomer3D можно Вас попросить прогнать через модель? Скриншот не обязателен, но результат очень интересен…
Вообще-то в статье ответ упомянут =)
Это тысяча.
И да, в вывод не вошла еще одна мера, которую воспитание добавить не позволило, но программа считает, что она равна тысяче =)

Я так понял, что это оно самое и есть.


(upd: автор опередил)

UFO just landed and posted this here
Хм, а мой отец ввсягда говорит «полста», к сожалению не видел какое слово он использует в прописи.
А как насчет склонений и вариаций ошибок в них? Вещи вроде «восемьюстами пятьюдесятью пятью дисками», «к семистам тридцати восьми детям». Думаю, что в таких числах многие носители допускают ошибки, типа «к семьсот тридцати восьми детям». Как забарывали?
С иностранными языками как направлением развития мысль прикольная, но тут надо быть _очень_ осторожным: в разных языках сильно разные подходы к формированию чисел. В финском например правильным написанием многозначных чисел является слитное (стодвадцатьтритысячичетырестапятьдесятшесть), вне зависимости от их длины — надо заметно усложнять токенизацию, в немецком — тоже, кажется, слитно, но что важнее, там не очень «прямой» порядок числительных — в каждом классе (сотни-десятки единицы {тысяч, миллионов, <просто>}) там порядок сотни-единицы-десятки, если не говорить о словах, подобных английским eleven, twelve — 11 и 12. А что-то вроде 121 на немецком будет hunderteinundzwanzig — сто-один-и-двадцать, если пытаться воспроизвести это на русском.
Это тема для второй части.

Один из пользователей пообещал расписать правила для немецкого, для английского я и сам сделаю.

Если у кого есть желание, можете прислать мне на почту правила для интересующего вас языка (другими языкам я не владею), а я запилю конвертер для них.
Я в общем и целом описал то, что сам знаю (финский покрывается этим описанием примерно полностью — всё как у нас примерно, но слитно) — практического интереса у меня нет совсем, посмотреть на результат/почитать статью я бы с радостью. Плюсиком бы наградил что за эту, что за грядущую, но кармы нет. :)
UFO just landed and posted this here
Базовый алгоритм парсинга числа:
Вход: «двадцать девятнадцать»
Токены: 20, 19
Уровни: 2, 1
Результат: 39?
Действительно проблема! Добавлю решение в ближайшее время.
Интересно, что я «работаю» с обратной стороны. У меня капча «уродует» числа, чтобы их трудно было распознать.

Кто победит, моя капча или ваш парсер? :)

warcry.ru/api/v1/captcha_test?digits=4

Количество знаков от 1 до 16.
\u0442\u044b\u0440\u0438\u0442\u0438\u0448\u0447\u0438\u0434\u044b\u0432\u0435\u0441\u0430\u0442\u0438\u0441\u043e\u0440\u044b\u043a\u0442\u0430\u0440\u0438

Сделайте JSON_UNESCAPED_UNICODE, пожалуйста

Сделал, прошу проверить.
Спасибо за информацию!
Sign up to leave a comment.

Articles