点击蓝字关注我
小编最近在处理一份语音转写文字的英文数据集。由于是语音转写得到的文本数据,毕竟没有人工撰写的数据干净✨,存在大量穿插混乱的token。人眼可以很容易发现,但简单的正则却无法解决。在这次处理过程中,使用到了一些很宝藏的正则表达式,这里记录下来,希望对大家有帮助。
️一、原数据出现重复token,出现”口吃“现象
去除多余空格
utt = "I 'm codebrid , I love NLP ."
# strip extra white space
utt = re.sub(' +', ' ', utt)
处理得到 "I 'm codebrid , I love NLP ."
去除连续的重复“一元”单词
utt = "I 'm I 'm codebrid , I I think I love NLP ."
# replace consecutive unigrams with a single instance
utt = re.sub('b(w+)s+1b', '1', utt)
处理得到 "I 'm I 'm codebrid , I think I love NLP ."
去除连续的重复“多元”单词(包括一元)
utt = "I 'm I 'm codebrid , I think I think I I love NLP ."
# same for bigrams
utt = re.sub('(b.+?b)1b', '1', utt)
处理得到 "I 'm codebrid , I think I love NLP ."
此处要注意,以上表达式匹配的是重复两次的单词,对于重复三次以上的会出现如下问题:
utt = "I 'm I 'm I 'm codebrid , I think I think I I I I love NLP ."
# (这人说话是得有多么口吃啊 )
utt = re.sub('(b.+?b)1b', '1', utt)
处理得到 "I 'm I 'm codebrid , I think I I love NLP ."
去除重复多次的“多元”单词(包括一元)
utt = "I 'm I 'm I 'm codebrid , I think I think I I I I love NLP ."
# (口吃不怕,brid有办法 )
utt = re.sub('(b.+?b)(1b)+', '1', utt)
处理得到 "I 'm codebrid , I think I love NLP ."
# (完美解决问题 )
️二、出现多语言混杂情况
去除中文token
utt = "我 是 那个 可爱 的 布雷德 I 'm codebrid , I think I love NLP ."
utt = re.sub("[u4e00-u9fa5]+", '', utt)
处理得到 " I 'm codebrid , I think I love NLP ."
# (此处要注意,中文token之间的空格并不能随着一起消除 )
只保留中文token
utt = "我 是 那个 可爱 的 布雷德 I 'm codebrid , I think I love NLP ."
# (此处呈现了两种sub使用方法 )
utt = re.sub("[^u4e00-u9fa5]+", '', utt)
utt = re.compile("[^u4e00-u9fa5]+").sub('', utt)
# (如果是unicode编码,可以在表达式前加 “u”,如下 )
utt = re.sub(u"[^u4e00-u9fa5]+", '', utt)
utt = re.compile(u"[^u4e00-u9fa5]+").sub('', utt)
处理得到 "我是那个可爱的布雷德"
️三、一些简单的匹配情况
去除指定通配符中的内容
utt = "I 'm codebrid ( just kidding ) , I think I love NLP { Natural Language Processing } ."
# (现在想要去除 花括号{}里的没有意义的token )
utt = re.sub(r'{.*?}', '', utt)
utt = re.compile(r'{.*?}').sub('', utt)
处理得到 "I 'm codebrid ( just kidding ) , I think I love NLP ."
# (现在想要去除 小括号()里的没有意义的token )
utt = re.sub(r'(.*?)', '', utt)
utt = re.compile(r'(.*?)').sub('', utt)
处理得到 "I 'm codebrid , I think I love NLP { Natural Language Processing } ."
# (考虑到括号左右的空格 ,可以在表达式左或右加一个空格)
utt = re.compile(r'(.*?) ').sub('', utt)
处理得到 "I 'm codebrid , I think I love NLP { Natural Language Processing } ."
去除首尾空格
utt = " I 'm codebrid , I love NLP . "
# (去除 首或尾 的空格 ,在本例子中,首部有空格,就不会再去除尾部空格)
# (此处呈现了两种sub使用方法 )
utt = re.sub('(^s*)|(s*$)', '', utt)
utt = re.compile(r'(^s*)|(s*$)').sub('', utt)
处理得到 "I 'm codebrid , I love NLP . "
# ^表示首部 ,$表示尾部
# (单独去除尾部空格 )
utt = " I 'm codebrid , I love NLP . "
utt = re.sub('(s*$)', '', utt)
utt = re.compile(r'(s*$)').sub('', utt)
处理得到 " I 'm codebrid , I love NLP ."
️四、一些常用正则表达式
https://m.jb51.net/article/17355.htm
匹配email地址
^[w-]+(.[w-]+)*@[w-]+(.[w-]+)+$
匹配url
^[a-zA-z]+://匹配(w+(-w+)*)(.(w+(-w+)*))*(?S*)?$
匹配html tag
<s*(S+)(s[^>]*)?>(.*?)<s*/1s*>
https://m.jb51.net/article/17355.htm
匹配非负整数(正整数 + 0)
^d+$
匹配正整数
^[0-9]*[1-9][0-9]*$
匹配非正整数(负整数 + 0)
^((-d+)|(0+))$
匹配负整数
^-[0-9]*[1-9][0-9]*$
匹配整数
^-?d+$
匹配非负浮点数(正浮点数 + 0)
^d+(.d+)?$
匹配正浮点数
^(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*))$
匹配非正浮点数(负浮点数 + 0)
^((-d+(.d+)?)|(0+(.0+)?))$
匹配负浮点数
^(-(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*)))$
匹配浮点数
^(-?d+)(.d+)?$
匹配由26个英文字母组成的字符串
^[A-Za-z]+$
匹配由26个英文字母的大写组成的字符串
^[A-Z]+$
匹配由26个英文字母的小写组成的字符串
^[a-z]+$
匹配由数字和26个英文字母组成的字符串
^[A-Za-z0-9]+$
匹配由数字、26个英文字母或者下划线组成的字符串
^w+$
参考链接:
常用正则表达式:https://m.jb51.net/article/17355.htm
正则基础:ttps://http://www.runoob.com/regexp/regexp-syntax.html
正则函数及修饰符:https://www.cnblogs.com/angle6-liu/p/10437671.html
啾?还不关注?
推荐阅读:
资源合集,走过路过不要错过
Pytorch | 多GPU并行 DataParallel
NLP开源工具 | Open-NMT
文章来自【NLP_笔记屋】
作者:codebrid
编辑:codebrid
一只刚刚刚刚成为职场小白的算法工程狮 ️,希望在这里可以与大家共同学习&进步
日常分享 机器学习/ 深度学习/ NLP/ 算法/ 数学基础 的学习笔记