Pull to refresh

fuzzywuzzy и «Невидимая брань» между людьми и роботами-переводчиками

PythonSemanticsMachine learningLearning languages

Начала добраго добрейший быти и конец, право непщуют предели вещей


Наверное, во все века были переводчики-буквалисты и переводчики-«вольнодумцы». Последние чувствовали себя совершенно вправе изменять текст, перекопмоновывать его, выбрасывать одни куски и дописывать другие. А перед современными исследователями стоит типичный вопрос: «Что детально произошло во время трансформации оригинала? Что вычеркнуто, что сохранено, что переделано, что дописано?»


Перед тем, как вчитываться в тексты со всей тщательностью, хотелось попробовать отдать их роботам на предварительную проработку. Надежд на роботов у нас было мало, однако помощь от них мы получили существенную. О том, как мы заставили Google Translate и Яндекс.Переводчик тягаться в работе над греческим текстом «Невидимой брани», читайте под катом.


Рабочий материал


«Невидимая брань» — аскетический трактат, изначально написанный на итальянском, потом переведённый на греческий в XVIII веке, отредактированный в соответствии с восточно-христианской аскетической практикой, и после этого переведённый на русский. Но тоже не буквально, а с существенными изменениями. Описывая принципы своей работы по переводу на русский, святитель Феофан Затворник писал:


Я [эту книгу] не перевожу, но свободно перелагаю своею речью… прибавляя и убавляя и изменяя против подлинника.

Общий обзор редакторских изменений есть в работе еп. Феоктиста, но хотелось получить именно детальный diff по всему тексту.


Метод сопоставления


Для этого оба текста (новогреческий и русский) были разбиты на абзацы. Получилось примерно по 700 абзацев в каждом.


Греческий текст мы перевели на русский дважды — один раз при помощи Яндекс.Переводчика, другой раз — при помощи Google Translate. Просто создали большие страницы с полным текстом и открыли их через соответствующие веб-морды. Читать переведённый текст было почти невозможно: видимо, слишком сложный оригинал, однако что-то можно было из этого ужаса извлечь. Ключевые слова где-то должны были совпасть, циферки тоже.


Особого разнообразия инструментария для поиска нечётких дубликатов не нашлось, ухватились за fuzzywuzzy, который считает расстояние Левенштейна. Из четырёх функций: ratio, partial_ratio, token_sort_ratio, token_set_ratio — была выбрана последняя, не связанная ни с порядком слов, ни с их повторами. И, как оказалось впоследствии, выбор был правильным.


Для всех пар абзацев (русский vs греческий) были вычислены степени сходства token_set_ratio феофановского перевода с яндексовским и с гугловским. Решили не опираться ни на один из них в отдельности, а на их сумму (à la бивалютная корзина — и это тоже оказалось правильным решением), и далее уже глазками и ручками смотрелись и перепроверялись кандидаты с большими значениями этой суммы, а также рассматривались соседние с проверенными пары.


В итоге за несколько часов работы удалось сопоставить 2/3 абзацев, из остальных только единицы можно будет сопоставить вручную.


Перепроверка методов


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


Вычисление partial_ratio слишком времязатратное (было лениво 120 часов кряду гонять свою компутерку), но примерно за час были посчитаны остальные три функции: ratio, token_sort_ratio и token_set_ratio как для яндексовских, так и для гугловских переводов. Итого шесть функций близости текста и седьмая — наша «бивалютная корзина».


Теперь можно взглянуть на следующие таблички. Первая отвечает на вопрос: «Если мы для данного русского абзаца будем искать соответствующий греческий, рассматривая абзацы в порядке убывания схожести (вычисленной по данной функции), то какова вероятность, что мы увидим нужный абзац, просмотрев всего лишь первых трёх кандидатов


функция вероятность нахождения с трёх попыток
google_set_ratio + yandex_set_ratio 66.5%
google_ratio 65.0%
google_set_ratio 64.8%
yandex_ratio 62.0%
google_sort_ratio 61.8%
yandex_set_ratio 56.2%
yandex_sort_ratio 54.6%

То есть примерно в 2/3 случаев мы почти сразу наткнёмся на нужный абзац. А в остальной трети случаев придётся изрядно помучиться. Вот гляньте на вторую табличку, которая отвечает на вопрос: «Сколько в среднем придётся просмотреть кандидатов, пока мы увидим нужный абзац?»


функция среднее количество попыток
google_set_ratio + yandex_set_ratio 36.7
google_set_ratio 37.6
yandex_set_ratio 47.0
google_sort_ratio 65.9
yandex_sort_ratio 69.7
google_ratio 71.7
yandex_ratio 75.3

Просматривать 40 и более абзацев — это печальная печалька, и машина в таком случае вовсе не выглядит как разумный подсказчик. В итоге оптимальной стратегией при сопоставлении текстов будет «снять сливки», просматривая только наиболее вероятных кандидатов, а остальное сопоставление делать, исходя из структуры и каких-то иных факторов.


Похвала собственной интуиции


Удивительным для нас самих стало то, что взятая «с потолка» «бивалютная корзина» google_set_ratio + yandex_set_ratio сработала лучше всего, даже лучше, чем каждая из этих функций по отдельности. Кроме того, значения в обеих таблицах показывают, что по всем параметрам с этой задачей Google Translate справляется лучше, чем Яндекс.Переводчик. Так что отечественным роботам есть куда расти.


P.S. В использованных скриптах особой премудрости нет, но если кому надо, можем выложить. Сам же итог сопоставления вот тут.


P.P.S. Если кому интересно, то картинка в заголовке — это фрагмент страницы из «Букваря славено-греко-латинского» Фёдора Поликарпова-Орлова (1701 г.).


P.P.P.S. Может быть, есть научный журнал, куда этот текст, соответствующим образом допиленный, стоит предложить для публикации?

Tags:нечеткие дубликатымашинный переводгреческий языкрасстояние левенштейна
Hubs: Python Semantics Machine learning Learning languages
Total votes 12: ↑8 and ↓4 +4
Views4.5K

Popular right now

Machine Learning Engineer
from 190,000 to 230,000 ₽СберСанкт-Петербург
Senior Python Backend Developer (Machine Learning)
from 250,000 to 350,000 ₽FunCorpМосква
CV/ML engineer
from 150,000 to 350,000 ₽010.communityМоскваRemote job
AI-разработчик
from 70,000 to 100,000 ₽Университет Искусственного ИнтеллектаRemote job
3d data developer (python)
from 100,000 to 150,000 ₽SoftariaНовосибирскRemote job