1

我需要编写一个脚本,可能是用 Ruby 编写的,它将获取一个文本块,并将该文本的许多转录记录与原始文本进行比较,以检查准确性。如果这完全令人困惑,我会尝试用另一种方式解释......

我有几个不同的人阅读一个只有几句话的脚本的录音。这些录音都被其他人多次转录回文本。我需要获取所有的转录(数百个)并将它们与原始脚本进行比较以确保准确性。

我什至无法概念化伪代码,并且想知道是否有人可以指出我正确的方向。我应该考虑一个既定的算法吗?有人向我建议了Levenshtein 距离,但考虑到标点​​符号选择、空格等方面的差异,这似乎不能很好地处理较长的字符串——即使每隔一个单词丢失第一个单词也会破坏整个算法很完美。我对任何事情都持开放态度——谢谢!

编辑:

感谢您的提示,心理医生。然而,我最大的担忧之一是这样的情况:

原文:

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!

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

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

有任何想法吗?

4

3 回答 3

1

简单版:

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

可能的改进:

  1. 您可以为标点符号引入标记(或将它们全部替换为简单的标记,如“.”)。
  2. 可以修改 Levenshtein 距离算法,以便拼写错误的字符与键盘上靠近的字符产生更小的距离。您可以潜在地应用它,以便在比较单个单词时,您将使用 Levenshtein 距离(标准化,使其值范围从 0 到 1,例如通过将其除以两个单词中较长者的长度),然后在“外部”距离计算中使用该值。

很难说哪种算法最适合您的数据。我的建议是:确保你有一些自动化的方式来可视化或测试你的解决方案。通过这种方式,您可以快速迭代和试验您的解决方案,并查看您的更改如何影响最终结果。

编辑: 针对您的担忧:

最简单的方法是从规范化较短的形式开始(使用 gsub):

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

请注意,您甚至可以将“'s”扩展为“is”,即使它在语法上不正确,因为如果 John's 的意思是“John is”,那么您就会正确理解,如果它的意思是“由 John 拥有”,那么很可能两个文本都包含相同的形式,因此您不会通过“错误地”扩展两者来拉开距离。另一种情况是它应该表示“John has”,但在“'s”之后可能会有“got”,所以你也可以轻松处理。

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

于 2011-10-14T10:43:25.527 回答
0

由于您最终要尝试比较不同的转录员如何处理段落的发音方式,您可以尝试使用语音算法(例如Metaphone )进行比较。

于 2011-10-14T11:36:50.710 回答
0

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

于 2011-10-25T07:07:35.723 回答