亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 difflib 突出顯示(僅)單詞錯誤?

如何使用 difflib 突出顯示(僅)單詞錯誤?

翻閱古今 2023-03-22 16:34:13
我正在嘗試將語音轉文本 API 的輸出與地面實況轉錄進行比較。我想要做的是將語音到文本 API 遺漏或誤解的基本事實中的單詞大寫。例如:真相:  The quick brown fox jumps over the lazy dog.語音到文本輸出: the quick brown box jumps over the dog期望的結果: The quick brown FOX jumps over the LAZY dog.我最初的直覺是從基本事實中刪除大寫和標點符號并使用 difflib。這讓我得到了準確的差異,但我無法將輸出映射回原始文本中的位置。我想保留基本事實的大寫和標點符號來顯示結果,即使我只對單詞錯誤感興趣。有什么方法可以將 difflib 輸出表示為原始文本的詞級變化嗎?
查看完整描述

3 回答

?
慕斯王

TA貢獻1864條經驗 獲得超2個贊

我還想建議一個使用 difflib 的解決方案,但我更喜歡使用 RegEx 進行單詞檢測,因為它會更精確并且更能容忍奇怪的字符和其他問題。


我在您的原始字符串中添加了一些奇怪的文字以表明我的意思:


import re

import difflib


truth = 'The quick! brown - fox jumps, over the lazy dog.'

speech = 'the quick... brown box jumps. over the dog'


truth = re.findall(r"[\w']+", truth.lower())

speech = re.findall(r"[\w']+", speech.lower())


for d in difflib.ndiff(truth, speech):

    print(d)

輸出


  the

  quick

  brown

- fox

+ box

  jumps

  over

  the

- lazy

  dog

另一個可能的輸出:


diff = difflib.unified_diff(truth, speech)

print(''.join(diff))

輸出


---

+++

@@ -1,9 +1,8 @@

 the quick brown-fox+box jumps over the-lazy dog


查看完整回答
反對 回復 2023-03-22
?
HUX布斯

TA貢獻1876條經驗 獲得超6個贊

為什么不將句子拆分成單詞然后在這些單詞上使用 difflib?


import difflib


truth = 'The quick brown fox jumps over the lazy dog.'.lower().strip(

    '.').split()


speech = 'the quick brown box jumps over the dog'.lower().strip('.').split()


for d in difflib.ndiff(truth, speech):

    print(d)


查看完整回答
反對 回復 2023-03-22
?
神不在的星期二

TA貢獻1963條經驗 獲得超6個贊

所以我想我已經解決了這個問題。我意識到 difflib 的“contextdiff”提供了其中有變化的行的索引。為了獲取“ground truth”文本的索引,我刪除了大寫/標點符號,將文本拆分為單個單詞,然后執行以下操作:



altered_word_indices = []

diff = difflib.context_diff(transformed_ground_truth, transformed_hypothesis, n=0)

for line in diff:

  if line.startswith('*** ') and line.endswith(' ****\n'):

    line = line.replace(' ', '').replace('\n', '').replace('*', '')

    if ',' in line:

      split_line = line.split(',')

      for i in range(0, (int(split_line[1]) - int(split_line[0])) + 1):

        altered_word_indices.append((int(split_line[0]) + i) - 1)

    else:

      altered_word_indices.append(int(line) - 1)


在此之后,我將更改后的單詞大寫打印出來:


split_ground_truth = ground_truth.split(' ')

for i in range(0, len(split_ground_truth)):

    if i in altered_word_indices:

        print(split_ground_truth[i].upper(), end=' ')

    else:

        print(split_ground_truth[i], end=' ')

這讓我可以打印出“The quick brown FOX jumps over the LAZY dog”。(包括大寫/標點符號)而不是“快速的棕色 FOX 跳過 LAZY 狗”。


這不是一個超級優雅的解決方案,它需要經過測試、清理、錯誤處理等。但這似乎是一個不錯的開始,并且可能對遇到相同問題的其他人有用。我會把這個問題懸而未決幾天,以防有人想出一種不太粗略的方法來獲得相同的結果。


查看完整回答
反對 回復 2023-03-22
  • 3 回答
  • 0 關注
  • 132 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號