Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Обработка дореформенной орфографии мантикорой #7

Open
iprst opened this issue Jun 10, 2023 · 3 comments

Comments

@iprst
Copy link
Collaborator

iprst commented Jun 10, 2023

Появился вопрос. Сейчас обработано уже несколько тысяч книг из библиотеки, многие из которых, судя по всему, никогда раньше не распознавались. Весомая часть этих книг издана более ста лет назад, соответственно русский язык в них дореформенный, вот типичный пример распознанного текста:

Я. В. Воронецъ, остававшійся въ полку до половины 1858 года, былъ человѣкъ весьма добраго сердца и съ самаго вступленія въ управленіе заведеніемъ пріобрѣлъ общую любовь. Несмотря на почтенные уже года и совершенно бѣлые отъ сѣдины волосы, генералъ былъ очень энергиченъ, подвиженъ, бодръ и проворенъ. Говорилъ горячо, хвалилъ и распекалъ отрывисто, безъ длинныхъ наставленій и нравоученій. «Скверно, мерзко, честь, амбиція, вотъ что», или «молодцы, удальцы, честь, амбиція, вотъ что». Онъ былъ бездѣтенъ, но любилъ воспитанниковъ всею душой; почти всѣхъ зналъ по фамиліи, и каждый успѣхъ и отличіе воспитанника радовали много-добраго командира.

Беглый поиск по мантикоре ответа на вопрос не дал. Если вкрапления i в теории ещё можно как-то зарегулировать на основе украинского языка, то ѣ сомнительно.

В теории пути могут быть такими.

  1. Игнорируем символы, пусть токенизирует по буквам как есть и рассчитывает дистанцию слова от словарной формы.
  2. Пакетная замена всех i на и, ѣ на е, с удалением ъ если следующий символ пробел или знак препинания (т.е. не буква).
  3. Ищем официальный метод.

Дополнительной проблемой будет то, что даже с заменой символов многие слова далеки от текущих словарных форм:

при построеніяхъ какого-либо боеваго порядка // боеваго > боевого
баталіонные командиры // баталионные > батальонные
произошли слѣдующія перемѣны // следующия > следующие
имѣвшій особую походку съ выворачиваніемъ носковъ внаружу // внаружу > наружу

Для таких случаев, видимо, потребуется составлять словарь. Возможно такой словарь для мантикоры уже существует? Мне пока что не удалось найти.

@audetv
Copy link
Collaborator

audetv commented Jun 10, 2023

Пока не знаю. В мантикоре можно подключать таблицы символов, но как это работает на практике не знаю.
И пока не уверен, что это то, что будет нам нужно.
https://manual.manticoresearch.com/Creating_a_table/NLP_and_tokenization/Low-level_tokenization#charset_table

Основной момент в том, что у пользователя нет клавиатуры с дореформенным алфавитом и такой поисковый запрос он набрать не сможет. Т.е. даже если эти символы нормально «затокенезируются» (я даже не знаю, как это выразить сейчас обычными словами, пока пусть так будет), то можно ли будет их найти обычным запросом?
Надо будет проверить и быть может действительно придется составлять словарь: дореформенный - современный.

Будем искать способ.

@iprst
Copy link
Collaborator Author

iprst commented Jun 10, 2023

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

С клавиатуры теоретически набрать можно, но в принципе существует сценарий CTRL+C → CTRL+V, а также не будем исключать какие-то будущие варианты, например, расширения для браузеров или сервиса для операционных систем: человек читает что-то, выделил слово, ПКМ, меню → «концептуальный поиск svodd». Также есть вот такой сервис slavenica и существуют раскладки для клавиатуры с дореволюционными символами, они есть для андроида и виндовс точно, скорее всего и для остальных систем тоже найдутся.

Там же на славенице есть и словарь (вторая вкладка, ссылку сделать нельзя), наверное есть и другие подобные сервисы, в том числе более официальные. Но нас в первую очередь интересуют механизмы мантикоры, наверное.

Т.е. даже если эти символы нормально «затокенезируются» (я даже не знаю, как это выразить сейчас обычными словами, пока пусть так будет), то можно ли будет их найти обычным запросом?

Сложный вопрос. Я пока не понимаю в достаточной мере, что именно делает мантикора во время токенизации символов. Например — откуда она вообще берёт набор символов? Что будет если мы подадим ей данные в другой раскладке, где таблица символов просто другая?

@audetv
Copy link
Collaborator

audetv commented Jun 10, 2023

charset_table

# default
charset_table = non_cjk

# only English and Russian letters
charset_table = 0..9, A..Z->a..z, _, a..z, \
U+410..U+42F->U+430..U+44F, U+430..U+44F, U+401->U+451, U+451

# english charset defined with alias
charset_table = 0..9, english, _

# you can override character mappings by redefining them, e.g. for case insensitive search with German umlauts you can use:
charset_table = non_cjk, U+00E4, U+00C4->U+00E4, U+00F6, U+00D6->U+00F6, U+00FC, U+00DC->U+00FC, U+00DF, U+1E9E->U+00DF
Accepted characters array, with case folding rules. Optional, default values are all characters of most non-CJK languages (non_cjk).

Яндекс перевод:

Charset_table - это основная рабочая лошадка процесса токенизации Manticore, процесса извлечения ключевых слов из текста документа или текста запроса. Он управляет тем, какие символы принимаются как допустимые, а какие нет, и как принятые символы должны быть преобразованы (например, следует ли удалять регистр или нет).

Вы можете думать о charset_table как о большой таблице или массиве, который имеет отображение для каждого из более чем 100 тысяч символов в Unicode. По умолчанию каждый символ соответствует 0, что означает, что он не встречается в ключевых словах и должен рассматриваться как разделитель. После упоминания в таблице символ сопоставляется с каким-либо другим символом (чаще всего либо с самим собой, либо со строчной буквой) и рассматривается как допустимая часть ключевого слова.

Формат ожидаемого значения представляет собой список отображений, разделенных запятыми. Два простейших сопоставления просто объявляют символ допустимым и сопоставляют один символ с другим одиночным символом соответственно. Но указание всей таблицы в такой форме привело бы к раздутым и едва поддающимся управлению спецификациям. Таким образом, существует несколько синтаксических сокращений, которые позволяют вам сопоставлять диапазоны символов одновременно. Полный список выглядит следующим образом:

Сопоставление A->a - Single char объявляет исходный символ 'A' разрешенным для использования в ключевых словах и сопоставляет его с целевым символом 'a' (но не объявляет 'a' разрешенным).

A..Z->a..z - Отображение диапазона, объявляет все символы в исходном диапазоне разрешенными и сопоставляет их с диапазоном назначения. Не объявляет диапазон назначения разрешенным. Также проверяется длина диапазона (длины должны быть равны).

a - Отображение случайного символа, объявляет символ разрешенным и сопоставляет его самому себе. Эквивалентно отображению a->a single char.

a..z - Отображение случайного диапазона, объявляет все символы в диапазоне разрешенными и сопоставляет их самим себе. Эквивалентно отображению диапазона a..z->a..z.

A..Z/2 - Карта полигона в шахматном порядке. Сопоставляет каждую пару символов со вторым символом. Более формально, объявляет нечетные символы в диапазоне разрешенными и сопоставляет их с четными; также объявляет четные символы разрешенными и сопоставляет их самим себе. Например, A..Z/2 эквивалентно A->B, B->B, C->D, D->D, ..., Y->Z, Z->Z. Этот ярлык сопоставления полезен для ряда блоков Unicode, где прописные и строчные буквы идут в таком чередующемся порядке вместо непрерывных фрагментов.

Управляющие символы с кодами от 0 до 32 всегда рассматриваются как разделители. Символы с кодами от 33 до 127, то есть 7-разрядные символы ASCII, могут использоваться в отображениях как есть. Чтобы избежать проблем с кодировкой файла конфигурации, 8-разрядные символы ASCII и символы Unicode должны быть указаны в форме U+xxx, где xxx - шестнадцатеричный кодовый номер. Эта форма также может быть использована для 7-битных символов ASCII для кодирования специальных символов: например, используйте U+2E для кодирования точки, U+2C для кодирования запятой. Минимально допустимый код символа в юникоде - U+0021.

Вы можете переопределить отображение символов, указав его снова с помощью другого отображения. Например, встроенный массив non_cjk включает символы Ä и ä и сопоставляет их оба с символом ascii a, что может не работать в некоторых случаях (например, для немецкого языка). В этом случае вы можете переопределить символы таким образом:

charset_table = non_cjk,U+00E4,U+00C4
для поиска с учетом регистра или

charset_table = non_cjk,U+00E4,U+00C4->U+00E4
для поиска без учета регистра.

ignore_chars

ignore_chars = U+AD
Ignored characters list. Optional, default is empty.

Полезно в случаях, когда некоторые символы, такие как знак мягкого переноса (U+00AD), следует не просто рассматривать как разделители, а полностью игнорировать. Например, если '-' просто отсутствует в charset_table, текст "abcdef" будет проиндексирован как ключевые слова "abc" и "def". Напротив, если '-' добавлено в список ignore_chars, тот же текст будет проиндексирован как одно ключевое слово "abcdef".

Синтаксис такой же, как и для charset_table, но разрешено только объявлять символы и не разрешено их сопоставлять. Кроме того, игнорируемые символы не должны присутствовать в charset_table.


Я так понимаю, что можно хоть каждый символ сопоставить с любым другим символом по тому же принципу, как мы делаем в концептуальном словаре. Как это технически подключать надо будет погуглить примеры, пока не знаю. Но еще же есть морфология, в общем вопрос понятен, изучаем по мере возмодностей.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants