新闻文本数据中不仅包括了中文字符,还包括了数字、英文字符、标点等非常规字符,这些都是无意义,并且需要处理的数据,清洗的方法使用的是正则表达式。
方法一:借助Unicode编码,16进制筛出中文字符
匹配规则为:[\u4e00-\u9fa5],\un匹配n,其中n是一个用四个十六进制数字表示的Unicode字符,而4e00-9fa5之间的Unicode编码表示的是20000多个中文字符。具体编码如下:
#匹配[^\u4e00-\9fa5] def find_chinese(text): pattern=re.compile(r'[^\u4e00=\u9fa5]') chinese_txt=re.sub(pattern,'',text) return chinese_txt
解释:[\u4e00-\u9fa5]表示匹配汉字,[^\u4e00-\u9fa5]表示匹配除汉字以外的所有字符。
方法二:
去除标点符号
为方便之后分词工作,此处没有直接删掉特殊符号,而是以特殊符号用空格替换
#创建用于匹配特殊字符的正则表达式对象 pattern2=re.compile(r'[^\w]') #将特殊符号用空格替换 text=re.split(pattern2,text) print(text)
(背诵)文本中的英文,将其去除,防止后续中文词嵌入的过程中,英文、数字被误认为英文嵌入(有这种可能吗?)
import re #生成正则表达式对象,用于匹配以'('开始并以')'结束的内容 pattern=re.compile(r'\(.*?\)') #去除符合上述正则表达式的内容 text=re.sub(pattern,'',text) text
方法三:基于简单化正则表达式
去除空格,并将省略号更换为句号
print('处理前文本:'+text) def process(our_data): contents=our_data.replace(' ','') print('处理后文本'+contents) process(text)
去除标点和数字
print('xxx:'+text) def process(data): content1=data.replace(' ','') content2=content1.replace('...',',') print('xxx'+context2) process(text)
或者
只保留数字、汉字、英文、标点,而去除其他的东西(比如表情)
def is_chinese(uchar): if uchar>=u'\u4e00\ and uchar<='\u9fa5': #判断一个uchar是不是汉字 return True else: return False def allcontents(contents): content='' for i in content: if is_chinese(i): content=content+i print('\nxxxxx\n'+content) centents='xxxx' print('原句子为:\n'+centents) allcontents(centens)
Q1:.compile()函数
Q2:里边的正则r是如何处理的
Q3:xx.sub()是如何处理的
Q2.1:xx.findall()的用处,.compile()是用于匹配的
Q3:读懂内部正则表达式的方式
Q4:做好区分,split(),compile(),findall(),replace()