文本数据预处理相关操作

前言 字符函数

  • 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()

 

posted @ 2022-07-21 13:49  IllidanStormrage  阅读(290)  评论(0编辑  收藏  举报