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

Мне нужно написать скрипт, вероятно, на 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!

Есть идеи?

3 ответа

Решение

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

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

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

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

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

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

РЕДАКТИРОВАТЬ: В ответ на ваши проблемы:

Самый простой способ - начать с нормализации более коротких форм (используя gsub):

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

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

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

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

Другие вопросы по тегам