用于检查转录准确性/编辑距离的脚本的伪代码

时间:2011-10-14 08:35:01

标签: ruby algorithm pseudocode edit-distance

我需要编写一个脚本,可能是在Ruby中,它将采用一个文本块并将该文本的一些记录转录与原始文件进行比较,以检查其准确性。如果那只是完全混乱,我会尝试另辟蹊径......

我有几个不同的人在录制一个长达几句话的剧本的录音。这些录音都被其他人多次转录回文本。我需要将所有转录(数百个)转换为原始脚本以进行准确比较。

我甚至无法概念化伪代码,并想知道是否有人可以指出我正确的方向。我应该考虑建立一个算法吗? Levenshtein distance已被建议给我,但考虑到标点​​符号选择,空格等的差异,这似乎无法很好地处理较长的字符串。 - 错过第一个单词会破坏整个算法,即使其他每一个字都很完美。我对任何事情持开放态度 - 谢谢!

编辑:

感谢提示,psyho。然而,我最担心的一个问题是:

原文:

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!

即使对标记进行逐字比较,这个转录也会被标记为非常错误,即使它几乎是完美的,但这几乎不是边缘情况! “will've”和“would have”通常发音非常相似,尤其是在这个世界的这一部分。有没有办法让你建议的方法足够强大,以解决这个问题?我已经考虑过向前和向后运行一个单词比较并建立一种综合得分,但这会因为这样的转录而崩溃:

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

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

简单版本:

  1. 将您的输入标记为单词(将包含单词,标点符号等的字符串转换为小写单词数组,不带标点符号)。
  2. 使用Levenshtein距离(单词)将原始数组与转录数组进行比较。
  3. 可能的改进:

    1. 您可以为标点符号引入标记(或者使用像'。'这样的简单标记替换所有标记。)
    2. 可以修改Levenshtein距离算法,以便拼错一个字符,该字符与键盘上的字符相近会产生较小的距离。您可以使用它,因此在比较单个单词时,您将使用Levenshtein距离(标准化,因此它的值范围从0到1,例如将其除以两个单词中较长的单词的长度),然后在“外部”距离计算中使用该值。
    3. 很难说哪种算法最适合您的数据。我的建议是:确保您有一些可视化或测试解决方案的自动化方法。通过这种方式,您可以快速迭代并试验您的解决方案,并查看更改如何影响最终结果。

      修改 回应您的疑虑:

      最简单的方法是开始规范较短的表格(使用gsub):

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

      请注意,你甚至可以将“'s”扩展为“is”,即使它在语法上不正确,因为如果John的意思是“John is”,那么你就会把它弄好,如果它意味着“拥有John” “,那么很可能两个文本都包含相同的形式,所以你不会通过扩展”错误“来延长距离。另一种情况是它应该意味着“John has”,但是之后“s”可能会“得到”,所以你也可以轻松处理它。

      您可能还想处理数值(1st = first等)。通常,您可以通过执行一些预处理来改善结果。不要担心,如果它不总是100%正确,它应该足够正确:)

答案 1 :(得分:0)

由于您最终试图比较不同的抄录员如何处理声音的传递方式,您可以尝试使用Metaphone这样的语音算法进行比较。

答案 2 :(得分:0)

在试验了我在这个问题中提到的问题之后,我发现Levenshtein Distance实际上考虑了这些问题。我不完全理解如何或为什么,但可以在实验后看到这种情况。