文本数据预处理相关操作
前言 字符函数
- chr()函数用一个范围在range(256)内的(就是0~255)整数作参数,返回一个对应的字符。
- unichr()跟它一样,只不过返回的是Unicode字符。
- ord()函数是chr()函数(对于8位的ASCII字符串)或unichr()函数(对于Unicode对象)的配对函数,它以一个字符(长度为1的字符串)作为参数,返回对应的ASCII数值,或者Unicode数值。
- 全角字符unicode编码范围从65281~65374 (对应的十六进制范围是: 0xFF01 ~ 0xFF5E)
- 半角字符unicode编码范围从33~126 (对应的十六进制范围从 0x21~ 0x7E)
- 空格比较特殊,全角为12288(0x3000),半角为 32 (0x20)
- 除空格外, 全角/半角按unicode编码排序在顺序上是对应的(半角 +65248 = 全角 or 半角 + 0x7e= 全角 )
- 所以可以直接通过用±法来处理非空格数据,对空格单独处理
一 汉字的判断
汉字的unicode编码范围 u4e00 到 u9fa5。
def is_chinese(uchar): """判断一个unicode是否是汉字""" if uchar >= u'\u4e00' and uchar<=u'\u9fa5': return True else: return False
二 数字0-9的判断
数字的unicode编码范围根据全角和半角,有两个不同区域,半角数字 u0030 到 u0039,全角数字 uff10 到 uff19。
def is_number(uchar): """判断一个unicode是否是半角数字""" if uchar >= u'\u0030' and uchar<=u'\u0039': return True else: return False def is_Qnumber(uchar): """判断一个unicode是否是全角数字""" if uchar >= u'\uff10' and uchar <= u'\uff19': return True else: return False
三 大小写字母的判断
字母的unicode编码根据字母大小写,以及全角和半角共有四个区域。
半角大写字母:u0041 - u005a ,半角小写字母:u0061 - u007a ;
全角大写字母:uff21 - uff3a , 全角小写字母:uff41 - uff5a 。
def is_alphabet(uchar): """判断一个unicode是否是半角英文字母""" if (uchar >= u'\u0041' and uchar <= u'\u005a') or (uchar >= u'\u0061' and uchar <= u'\u007a'): return True else: return False def is_Qalphabet(uchar): """判断一个unicode是否是全角英文字母""" if (uchar >= u'\uff21' and uchar <= u'\uff3a') or (uchar >= u'\uff41' and uchar <= u'\uff5a'): return True else: return False
四 非汉字、数字和字母的判断
判断除汉字、数字0-9、字母之外的字符。
def is_other(uchar): """判断是否非汉字,数字和英文字符""" if not (is_chinese(uchar) or is_number(uchar) or is_alphabet(uchar)): return True else: return False
五 半角和全角的转换
全角半角转换需要用到上面的数字、字母等判断。
1. 所有半角转全角
不是半角范围直接返回,空格半角特殊单独处理,其它半角和全角对应公式:半角 = 全角 - 0xfee0
def strB2Q(ustring): """半角转全角""" rstring = "" for uchar in ustring: inside_code = ord(uchar) if inside_code == 32: # 半角空格直接转化 inside_code = 12288 elif 32 <= inside_code <= 126: # 半角字符(除空格)根据关系转化 inside_code += 65248 rstring += chr(inside_code) return rstring
2. 所有全角转半角
和前面正好相反,公式对应:全角 = 半角 + 0xfee0
差值:0xfee0 —> 65248
全角空格: 0x3000 -> 12288
半角空格: 0x0020 -> 32
def strQ2B(ustring): rstring = "" for uchar in ustring: inside_code = ord(uchar) if inside_code == 12288: # 全角空格直接转换 inside_code = 32 elif 65281 <= inside_code <= 65374: # 全角字符(除空格)根据关系转化 inside_code -= 65248 rstring += chr(inside_code) return rstring
六 常用的中英文符号
1. 常用的英文符号
from string import punctuation punctuation
'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
2. 常用的中文符号
from zhon.hanzi import punctuation punctuation
'"#$%&'()*+,-/:;<=>@[\]^_`{|}~⦅⦆「」、\u3000、〃〈〉《》「」『』【】〔〕〖〗〘〙〚〛〜〝〞〟〰〾〿–—‘’‛“”„‟…‧﹏﹑﹔·!?。。'
注意:\u3000是中文的空白字符。
3. 删除中英文数字及常用符号以外的特殊字符
def clean_special_char(raw): CHAR_PATTERN = re.compile(u'[^0-9a-zA-Z\u4e00-\u9fa5!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~"#$%&'()*+,-/:;<=>@[\]^_`{|}~「」、、〃〜〝〞〟–—‘’‛“”„‟…‧﹑﹔·!?。。]+', re.UNICODE) return CHAR_PATTERN.sub('', raw)
其他
1. 网络评论文本处理
评论中存在网址、@用户、表情等脏数据,后续其实还有特殊符号、部分中文、韩文、日文等其他语言,数据清洗时需要剔除。
# 数据清洗 def sentence_remove(tweet): # 为了直观展示,这里分步处理,实际使用过程中建议合并 r = "[_.!+-=——,$%^,。?、~@#¥%……&*《》<>「」“”‘’(){}【】□‡()//\\\[\]\"]" tweet = emoji.replace_emoji(tweet, replace=' ') # 删除emoji tweet = re.sub(r'[http|https]*://[a-zA-Z0-9.?/&=:]*', ' ', tweet) # 删除网址 tweet = re.sub(r'@\S+', ' ', tweet) # 删除 @用户 tweet = re.sub(r, ' ', tweet) # 删除特殊符号 tweet = re.sub(r'\s+', ' ', tweet) # 删除多余空格换行符 # 删除 中日韩 三语 tweet = re.sub('[\u4e00-\u9fa5\uac00-\ud7ff\u3040-\u309f\u30a0-\u30ff]', '', tweet) return tweet translation_sentence= data['translation_sentence'].apply(sentence_remove).tolist()