自然语言处理(NLP)之一:文本预处理(文本准备)
拿到文本数据后,自然语言处理任务的第一步工作是文本(数据)准备或叫文本(数据)预处理。文本预处理的流程如下图所示:
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. 拼写纠错
敬请详见作者文章: 文本预处理:拼写纠错.
更多推荐
所有评论(0)