1. 文本预处理概述

和机器学习任务一样,自然语言处理任务的第一步工作也是文本(数据)准备或叫文本(数据)预处理。文本预处理的流程如下图所示:
在这里插入图片描述
文本预处理工作以分词步骤为界,之前的文本标准化和文本清洗是语料级(篇章级)颗粒度文本处理,之后词的清洗、标准化和文本表示是单词级颗粒度文本处理。

语料级文本处理的作用对象是数据集中的每一篇语料,它比单词级文本处理效率更高,并且可以提前去除影响分词效果的障碍(如:英文中按空格分词,但与单词直接相邻的逗号等标点会产生非标准单词的分词结果(‘word,’ 标准形式应该是’word’))。

单词级文本处理执行在语料分词之后,它的处理对象是每篇语料中的每一个单词,主要执行单词的过滤、单词写法的标准化(如大写数字与阿拉伯数字书写形式的统一、统一英文单词不同时态、语态书写形式的统一等)、拼写纠错和文本表示四大步工作。

2. 文本标准化

2.1 字符编码标准化(全角英文字符转半角)

在计算机中,所有中文字符都是全角字符,而英文字母、阿拉伯数字及符号有全角和半角两种unicode编码方式。它们的全角字符unicode编码从65281~65374 (十六进制 0xFF01 ~ 0xFF5E),半角字符unicode编码从33~126 (十六进制 0x21~ 0x7E);而空格符比较特殊,全角unicode编码为12288 (0x3000),半角为32 (0x20)。

可见除空格符外,每个全角字符的unicode编码等于其半角字符的unicode编码加65248,因此字符unicode编码标准化实现代码如下:

#全角转半角
def full_to_half(text:str):      #输入为一个句子
    _text = ""
    for char in text:
        inside_code = ord(char)#以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值
        if inside_code == 12288:    #全角空格直接转换
            inside_code = 32
        elif 65281 <= inside_code <= 65374:  #全角字符(除空格)根据关系转化
            inside_code -= 65248
        _text += chr(inside_code)
    return _text 

2.2 英文大小写字母统一化

英文字母大小写的统一化可直接借助python内置字符串方法实现,具体代码如下:

#大写字母转为小写字母
def upper2lower(text:str):
    return text.lower()

2.3 中文繁简字统一化

中文繁体字与简体字的统一化借助opencc包的OpenCC类实现,该类通过不同的转换功能代码实现不同的文字转化功能,转换功能代码表如下所示:

转换代码功能说明
t2s繁体中文转简体
s2t简体中文转繁体
s2twp简体中文转繁体中文(带短语)
t2hk繁体中文转繁体(香港标准)
hk2s繁体中文(香港标准)转简体中文
s2hk简体中文转繁体中文(香港标准)
t2tw繁体中文转繁体(台湾标准)
tw2s繁体中文(台湾标准)转简体中文
tw2sp繁体中文(台湾标准)转简体中文(带短语)
s2tw简体中文转换成繁体中文(台湾标准)

繁简体统一化实现代码如下:

from opencc import OpenCC

#大写字母转为小写字母
def chinese_standard(text:str, conversion='t2s'):
	cc = OpenCC(conversion)
    return cc.convert(text)

3. 文本清洗

文本清洗中,常通过Unicode码过滤来去除非文本内容。Unicode码表中,中日韩统一表意文字字符区间为 4E00~9FA5,半角英文字母、阿拉伯数字及符号的字符区间为 0x21~0x7E,所以标准文本字符范围为 [ 4E00 , 9FA5 ] ∪ [ 0x21 , 0x7E ] [\text{4E00}, \text{9FA5}] \cup[\text{0x21}, \text{0x7E}] [4E00,9FA5][0x21,0x7E]

非文本内容过滤与标点符号过滤一同借助正则表达式实现,具体代码如下:

import re
def clear_character(text):	
	#只取合法字符
	pattern = [
		"[^\u4e00-\u9fa5^a-z^A-Z^0-9^\u0020^\u0027^\u002e]",  # save_standing_character
		"\.$"  # remove_full_stop
	]
    return re.sub('|'.join(pattern), '', text)

4. 分词

敬请详见作者文章: 文本表示:分词.

5. 词的清洗

敬请详见作者文章: 文本表示:词的清洗.

6. 词的标准化

敬请详见作者文章: 文本表示:词的标准化.

7. 拼写纠错

敬请详见作者文章: 文本预处理:拼写纠错.

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐