在NLP中,文本有时候会包含很多空格或者是其他一些无用的符号,如果保留这些符号,在分词的时候这些符号也会被分出来,就会导致分词的结果不好。因此对文本的数据清洗是必要的。
一、去除无用的符号
使用正则匹配re去除文本中的无用符号:
def clean_txt(sentence):
remove_chars = '[·’!"\#$%&\'()#!()*+,-./:;<=>?\@,:?¥★、….>【】[]《》?“”‘’\[\\]^_`{|}~]+'
string = re.sub(remove_chars, "", sentence)
return string
def test():
test_txt = '#【郭美美申请低保,居然获准通过!】郭美美对记者说,她其实就是一个失业人员,并不是大家想象的那样。她还说:她已经向政府申请了低保,目前已经获批。'
test_txt_clean = clean_txt(test_txt)
print('原文本:',test_txt)
print('处理后文本:',test_txt_clean)
原文本: #【郭美美申请低保,居然获准通过!】郭美美对记者说,她其实就是一个失业人员,并不是大家想象的那样。她还说:她已经向政府申请了低保,目前已经获批。
处理后文本: 郭美美申请低保居然获准通过郭美美对记者说她其实就是一个失业人员并不是大家想象的那样。她还说她已经向政府申请了低保目前已经获批。
还有一种方法是使用replace()这个方法也可以去掉所有不需要的符号或者把文本中的某些字符串替换:
contents = ' 【郭美 美申请低保,居然获准 通过! 】 !'
print('原文本:'+contents)
# 删除所有空格
def clean_txt(txt): #定义函数
result= txt.replace(' ','') # 去掉文本中的空格
return result
result = clean_txt(contents)
print('处理后文本:',result)
原文本:【郭美 美申请低保,居然获准 通过! 】 !
处理后文本:【郭美美申请低保,居然获准通过!】!
contents = '郭美美申请低保,居然获准通过...'
print('原文本:'+contents)
# 替换指定字符串,把省略号转为句号
def clean_txt(txt):
result= txt.replace('...','。') # 去掉文本中的空格
return result
result = clean_txt(contents)
print('处理后文本:',result)
原文本:郭美美申请低保,居然获准通过…
处理后文本:郭美美申请低保,居然获准通过。
二、去除表情符号
我们的文本数据中经常会带有很多表情,这些表情不仅仅会降低我们对文本处理的质量,它们有时是无法utf-8编码的,可以使用正则匹配删除这些表情符号。
def clean(desstr,restr=''):
#过滤表情
try:
co = re.compile(u'['u'\U0001F300-\U0001F64F' u'\U0001F680-\U0001F6FF'u'\u2600-\u2B55]+')
except re.error:
co = re.compile(u'('u'\ud83c[\udf00-\udfff]|'u'\ud83d[\udc00-\ude4f\ude80-\udeff]|'u'[\u2600-\u2B55])+')
return co.sub(restr, desstr)
print(clean('郭美美申请低保,居然获准通过!🙌🏻💗🚩'))
原文本:郭美美申请低保,居然获准通过!🙌🏻💗🚩
处理后文本:郭美美申请低保,居然获准通过!
代码中的正则编码解释如下:
<U+1F300> - <U+1F5FF> # 符号和象形字
<U+1F600> - <U+1F64F> # 表情符号
<U+1F680> - <U+1F6FF> # 交通符号和地图符号
<U+2600> - <U+2B55> # 其它符号
三、文本只保留汉字
我们在处理文本时通常只针对文字,而符号、数字等是没有意义的,所以想只留下汉字时:
def is_chinese(uchar):
if uchar >= u'\u4e00' and uchar <= u'\u9fa5': # 判断一个uchar是否是汉字
return True
else:
return False
def allcontents(contents):
content = ''
for i in contents:
if is_chinese(i):
content = content+i
return
centent = '#【郭美美申请低保,居然获准通过!】郭美美对记者说,她其实就是一个失业人员,并不是大家想象的那样。'
result = allcontents(contents)
print('原文本:',centent)
print('处理后文本:',result)
原文本:#【郭美美申请低保,居然获准通过!】郭美美对记者说,她其实就是一个失业人员,并不是大家想象的那样。
处理后文本:郭美美申请低保居然获准通过郭美美对记者说她其实就是一个失业人员并不是大家想象的那样
四、中文繁体、简体转换
如果文本中既有繁体也有简体,那处理起来有些不方便,需要进行繁体中文与简体中文的转换。首先安装OpenccPy,OpenccPy是一款 python 中文繁简体转换工具:
pip install openccpy
from opencc import OpenCC
sentence = '這裡是繁體'
print('原文本',sentence)
def Simplified(sentence):
new_sentence = Converter('zh-hans').convert(sentence) # 繁体转为简体
print('处理后文本:',new_sentence)
def Traditional(sentence):
new_sentence = Converter('zh-hant').convert(sentence) # 简体转为繁体
print('处理后文本:',new_sentence)
Simplified(sentence)
原句子为:這裡是繁體
处理后文本:这里是简体
处理后文本:這裡是繁體