在做nlp任务时,我们常常和语音结合起来,即将语音转为文本,然后将文本做一系列任务。
但是语音转换成文本,肯定有一系列错误。
我们可以文本纠错
文本纠错见我的另一篇博客。
中文文本纠错 算例实现(有算例完整代码)
这篇博客中提到要准备一个 正确词的txt。
那究竟什么是正确词,对于特殊任务怎么办,
于是我们得首先发现语音识别对那些词容易识别错误。
然后将那些经常错误的词对于的正确词添加进文本纠错系统里的正确词txt中。
然后再文本纠错。
本文讲解如何发现语音转换中 错误词和正确词
代码
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Author: yudengwu
# @Date : 2020/10/6
#endcoding: utf-8
import numpy as np
def correct_error(sentence1,sentence2):
"""
:param sentence1: 正确文本
:param sentence2:语音转换的文本
:return: 正确字周围的词数组,错误字周围的词数组
"""
correct = []
for i in range(len(sentence1)):#bian
if 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 / denom
sim = cos#
return sim
def 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:
break
else:
max_index = similarity.index(max(similarity)) # 相似度最大的错误词所在索引
# print(str1, error[max_index])
finally_result.append([str1, error[max_index]]) # 存放【正确词i,错误词i】
similarity = [] # 匹配掉了一个正确词,清空相似度数组用于存放下一个正确词和各个错误词之间的相似度
return finally_result
if __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中,进行文本纠错。
文本纠错前面有链接,不再发啦。
此方法是我自己想的,可能不是很好,如果你有更好的方法请告诉我,让我学习一下。
电气专业的计算机萌新:余登武。
写博文不容易。如果你觉得本文对你有用,请点个赞支持下。