Псевдокод для скрипта для проверки точности транскрипции / редактирования расстояний - PullRequest
1 голос
/ 14 октября 2011

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

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

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

Edit:

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

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

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 голос
/ 14 октября 2011

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

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

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

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

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

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

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

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

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

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

0 голосов
/ 25 октября 2011

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

0 голосов
/ 14 октября 2011

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

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