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