Псевдокод для скрипта для проверки точности транскрипции/редактирования расстояний

Мне нужно написать сценарий, возможно, на Ruby, который возьмет один блок текста и сравнит несколько транскрипций записей этого текста с оригиналом, чтобы проверить точность. Если это совсем запутанно, я попробую объяснить по-другому...

У меня есть записи нескольких разных людей, читающих сценарий, состоящий из нескольких предложений. Все эти записи были несколько раз переведены в текст другими людьми. Мне нужно взять все транскрипции (сотни) и сравнить их с оригинальным сценарием для точности.

У меня проблемы даже с осмыслением псевдокода, и мне интересно, может ли кто-нибудь указать мне правильное направление. Есть ли установленный алгоритм, который я должен учитывать? Мне было предложено расстояние Левенштейна, но мне кажется, что оно не справится с более длинными строк, учитывая различия в выборе знаков препинания, пробелов и т. д. — пропуск первого слова разрушил бы весь алгоритм, даже если бы все остальные слова были идеальными. Я открыт ко всему - спасибо!

Редактировать:

Спасибо за советы, псих. Однако меня больше всего беспокоит такая ситуация:

Оригинальный текст:

I would've taken that course if I'd known it was available!

Транскрипция

I would have taken that course if I'd known it was available!

Даже при пословном сравнении токенов эта транскрипция будет помечена как довольно ошибочная, хотя она почти идеальна, и это едва ли крайний случай! «Был бы» и «был бы» обычно произносятся очень похоже, особенно в этой части мира. Есть ли способ сделать подход, который вы предлагаете, достаточно надежным, чтобы справиться с этим? Я думал о том, чтобы провести пословное сравнение как в прямом, так и в обратном направлении и построить своего рода составную оценку, но это развалилось бы с такой транскрипцией:

I would have taken that course if I had known it was available!

Любые идеи?


person GarlicFries    schedule 14.10.2011    source источник


Ответы (3)


Простая версия:

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

Возможные улучшения:

  1. Вы можете ввести токены для пунктуации (или заменить их все простым токеном, например '.').
  2. Алгоритм расстояния Левенштейна можно изменить таким образом, чтобы неправильное написание символа, который находится рядом с символом на клавиатуре, генерировало меньшее расстояние. Вы могли бы потенциально применить это, чтобы при сравнении отдельных слов вы использовали расстояние Левенштейна (нормализованное, так что его значение колеблется от 0 до 1, например, путем деления его на длину более длинного из двух слов), а затем используйте это значение в расчете «внешнего» расстояния.

Трудно сказать, какой алгоритм лучше всего сработает с вашими данными. Мой совет: убедитесь, что у вас есть автоматизированный способ визуализации или тестирования вашего решения. Таким образом, вы можете быстро повторить и поэкспериментировать со своим решением и посмотреть, как ваши изменения повлияют на конечный результат.

EDIT: В ответ на ваши вопросы:

Проще всего было бы начать с нормализации более коротких форм (используя gsub):

str.gsub("n't", ' not').gsub("'d", " had").gsub("'re", " are")

Обратите внимание, что вы даже можете расширить «s» до «is», даже если это грамматически неправильно, потому что если John's означает «John is», то вы правильно поняли, а если это означает «принадлежит John», тогда скорее всего, оба текста будут содержать одинаковую форму, так что вы не увеличите дистанцию, расширив оба "неправильно". Другой случай, когда это должно означать «У Джона», но тогда после «s», вероятно, будет «получить», так что вы также легко справитесь с этим.

Вероятно, вы также захотите иметь дело с числовыми значениями (1st = first и т. д.). Как правило, вы, вероятно, можете улучшить результат, выполнив некоторую предварительную обработку. Не волнуйтесь, если это не всегда правильно на 100%, это должно быть достаточно правильно :)

person psyho    schedule 14.10.2011
comment
Пользователи клавиатуры Dvorak, такие как я, скинут ваше возможное улучшение № 2 ;-) - person Wizard of Ogz; 14.10.2011
comment
Моя ошибка в том, что расстояние Левештейна действительно хорошо справляется с проблемами, подобными тем, которые я упомянул. Токенизация ввода фактически ослабляет алгоритм. - person GarlicFries; 25.10.2011

Поскольку в конечном счете вы пытаетесь сравнить, как разные расшифровщики справились с тем, как отрывок звучит, вы можете попробовать сравнить с помощью фонетического алгоритма, такого как Метафон.

person Michael J. Barber    schedule 14.10.2011
comment
Однако цель состоит в том, чтобы проанализировать точность. Они никогда не должны расшифровываться как «там» или «их». - person GarlicFries; 14.10.2011

Поэкспериментировав с проблемами, которые я отметил в этом вопросе, я обнаружил, что расстояние Левенштейна действительно учитывает эти проблемы. Я не совсем понимаю, как и почему, но после экспериментов вижу, что это так.

person GarlicFries    schedule 25.10.2011