文本预处理
文本是一类典型的序列数据,一篇文章可以看作是字符或单词的序列,当使用神经网络处理文本时,是无法直接作用于字符串的,需要对其进行预处理。本节将介绍文本数据的常见预处理步骤,预处理通常包括四个步骤:
- 读入文本;
- 分词;
- 建立字典将每个词映射到一个唯一的索引(index);
- 将文本从词的序列转换为索引的序列,方便输入模型;
读入文本
以H. G. Wells的小说The Time Machine作为示例,展示文本预处理的具体过程。
import collections
import re
def read_time_machine():
with open(r'C:\Users\25756\Desktop\PythonCode\Pytorch\TheTimeMachinebyWells.txt', 'r',encoding='UTF-8') as f:
'''
将文本每一行全部转化为小写
且将非小写字母的其他字符全部用空格代替
'''
lines = [re.sub('[^a-z]+', ' ', line.strip().lower()) for line in f]
return lines
lines = read_time_machine()
print('# sentences %d' % len(lines))
# sentences 3583
collections模块:数据结构常用模块,常用类型有:计数器(Counter)/双向队列(deque)/默认字典(defaultdict)/有序字典(OrderedDict)/可命名元组(namedtuple)。Counter对访问对象进行计数并返回一个字典。具体可参考OneMore
re模块:python独有的匹配字符串模块,多基于正则表达式实现。具体可参考Brigth-Python之re模块
分词
对每个句子进行分词,也就是将一个句子划分成若干个词(token),转换为一个词的序列。
lines = read_time_machine()
print('# sentences %d' % len(lines))
def tokenize(sentences, token='word'):
"""Split sentences into word or char tokens"""
# 做单词级别的分词
if token == 'word':
return [sentence.split(' ') for sentence in sentences]
# 做字符级别的分词
elif token == 'char':
return [