用100行python代码发现语音识别文本错误词,并将结果和正确词一一对应
在做nlp任務時,我們常常和語音結合起來,即將語音轉為文本,然后將文本做一系列任務。
但是語音轉換成文本,肯定有一系列錯誤。
我們可以文本糾錯
文本糾錯見我的另一篇博客。
中文文本糾錯 算例實現(有算例完整代碼)
這篇博客中提到要準備一個 正確詞的txt。
那究竟什么是正確詞,對于特殊任務怎么辦,
于是我們得首先發現語音識別對那些詞容易識別錯誤。
然后將那些經常錯誤的詞對于的正確詞添加進文本糾錯系統里的正確詞txt中。
然后再文本糾錯。
本文講解如何發現語音轉換中 錯誤詞和正確詞
代碼
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # @Author: yudengwu # @Date : 2020/10/6 #endcoding: utf-8import numpy as npdef correct_error(sentence1,sentence2):""":param sentence1: 正確文本:param sentence2:語音轉換的文本:return: 正確字周圍的詞數組,錯誤字周圍的詞數組"""correct = []for i in range(len(sentence1)):#bianif sentence1[i] not in sentence2:correct1 = sentence1[i - 2:i + 2] # 存在錯誤的正確字,附近的詞 (i - 2:i + 2,我取長度為4即一個成語的長度correct.append(correct1)error = []for j in range(len(sentence2)):if sentence2[j] not in sentence1:error1 = sentence2[j - 2:j + 2] # 存在錯誤的錯誤字,附近的詞error.append(error1)return correct,error#余弦距離計算相似度 def cosine_similarity(sentence1: str, sentence2: str) -> float:""":param sentence1: 正確詞:param sentence2:錯誤詞:return: 兩個詞 的相似度"""seg1 = [word for word in sentence1]seg2 = [word for word in sentence2]word_list = list(set([word for word in seg1 + seg2]))#建立詞庫word_count_vec_1 = []word_count_vec_2 = []for word in word_list:word_count_vec_1.append(seg1.count(word))#文本1統計在詞典里出現詞的次數word_count_vec_2.append(seg2.count(word))#文本2統計在詞典里出現詞的次數vec_1 = np.array(word_count_vec_1)vec_2 = np.array(word_count_vec_2)#余弦公式num = vec_1.dot(vec_2.T)denom = np.linalg.norm(vec_1) * np.linalg.norm(vec_2)cos = num / denomsim = cos#return simdef result(sentence1,sentence2):correct,error=correct_error(sentence1,sentence2)finally_result=[]#存放[[正確詞1,錯誤詞1],[正確詞2,錯誤詞2]]similarity = []for str1 in correct:#遍歷每一個候選正確詞for str2 in error:#遍歷每一個候選錯誤詞similarity1 = cosine_similarity(str1, str2)#計算候選正確詞 與候選錯誤詞之間的相似度similarity.append(similarity1)#相似度存放進數組print('相似度',similarity)if max(similarity)==0.0:breakelse:max_index = similarity.index(max(similarity)) # 相似度最大的錯誤詞所在索引# print(str1, error[max_index])finally_result.append([str1, error[max_index]]) # 存放【正確詞i,錯誤詞i】similarity = [] # 匹配掉了一個正確詞,清空相似度數組用于存放下一個正確詞和各個錯誤詞之間的相似度return finally_resultif __name__=='__main__':sentence1 = "重慶是中國的四大火爐之一,風景秀麗,是人間天堂。 "sentence2 = "重慶是中國的四大火爐之一,風景銹麗,是人間天棠。"print('正確文本sentence1: ',sentence1)print('語音文本sentence2:',sentence2)#sentence1=input('請輸入正確文本:')#sentence2=input('請輸入語音文本:')correct, error=correct_error(sentence1,sentence2)print('corret',correct)print('error',error)finally_result=result(sentence1,sentence2)print(finally_result)結果
第一種情況:
給出一段文本,說話的人照著文本說完全部。(即不缺字少字)
第二種情況:
給出一段文本,說話的人少讀了(少字)
少讀部分不參與計算(即人間天堂沒有經過語音,不能直接認為有錯)
第三種情況:
給出一段文本,說話的人多讀了(多字)
多讀部分不參與計算(即人間天堂 經過語音,即使我明知道有錯 ,但多讀部分我們并不關心。不認為有錯)
在這個代碼的基礎上,可以自己結合業務修改代碼。用于批量處理數據。然后整理成表格,一列正確候選詞,一列錯誤候選詞。
然后篩選高頻詞。
還需要點人工處理(因為如果一個字出現語音轉換錯誤,那么它會出現多次,并且在表格中是相鄰的)
人為刪除一些重復的吧。
對比
原始人工
給出一個表格,表格里有很多文本,成百上千。
兩列數據,第一列正確文本,第二列語音轉換文本。
一個文本長度幾十字,幾百字。
人得讀完一條正確文本,再讀對應的語音文本,尋找正確詞和錯誤詞,再復制到另一個表格中。
現在
應用程序,直接生成 正確詞-錯誤詞 表格
表格共兩列
第一列正確字詞,第二列錯誤字詞。
人需要做的就是 將相鄰幾行刪除只保留一行()
如圖所示,刪除相鄰多余的慶,信訪
時間成本縮小幾倍。
(此圖是我很久以前用其他代碼跑出來的結果,現在也忘啦那份代碼寫的是哈,數據集也丟啦,總之這個代碼跑出來的結果和此圖類似,自己刪除相鄰重復項就可以。)
因為原始數據肯定有很多文本,信訪肯定在不同文本中出現,
在結果表格中,信訪可能在不同位置出現,然后可以應用表格統計詞頻。
最后發現高頻錯誤詞。
將結果寫入文本糾錯的 正確字詞txt中,進行文本糾錯。
文本糾錯前面有鏈接,不再發啦。
此方法是我自己想的,可能不是很好,如果你有更好的方法請告訴我,讓我學習一下。
電氣專業的計算機萌新:余登武。
寫博文不容易。如果你覺得本文對你有用,請點個贊支持下。
總結
以上是生活随笔為你收集整理的用100行python代码发现语音识别文本错误词,并将结果和正确词一一对应的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 洋房和高层的区别优势(洋房和高层的区别)
- 下一篇: 室内装修风格分类大全图(室内装修风格分类