注意:以下图片均引用自 《动手学深度学习》
一、文本预处理
预处理一般有四步1.读入文本 2.分词 3.建立字典,将每个词映射到一个唯一的索引(index)
4.将文本从此的序列转换为索引序列
1.读入文本
import collections
import re
def read_time_machine():
with open('/home/kesci/input/timemachine7163/timemachine.txt', 'r') as f: ##将文本打开
lines = [re.sub('[^a-z]+', ' ', line.strip().lower()) for line in f] ##运用正则表达式处理文本
return lines
re.sub 表示对 符合 [^a-z]+ 规则的文本 , 用‘ ’ 进行替换,也就是替换成空格
并且用 line.strip().lower() 将每行文本开头或结尾的空格或者换行符去除,并且将所有字母小写化
上面的正则表达式 是指 所有非a-z的字符并且长度大于等于1
经过此次变换我们 只剩下 所有英文字符和空格。
当然 对于 类似于 doesn’t 的处理 会出现 [‘doesn’, ’ ', ‘t’]的结果,这个并不是我们想要的
这里展示一下部分 读取结果
2.分词
现在我们需要把这个list变成每个元素都是一个单词,而不是一个元素有好几个单词的情况,这就是我们要做的分词
def tokenize(setences, token='word'):
if token == 'word': ## 词分词,列表中每个最小元素是个单词
return [setence.split() for setence in setences]
elif token == ‘char’: ##字母级分词,每个最小元素是个字母
return [list(sentence) for sentence in sentences]
else:
print('ERROR: unkown token type '+token)
我们现在做 词分词 所以用默认展示结果
3.建立字典
我们要将上面每个词建立独立的索引编号,并且每个词在字典里不会重复出现
def vocab(tokens):
##set(sum(tokens, [])) sum(list, []) 对列表含列表情况进行去除, 只剩下一个列表
a = {}
for i,j in enumerate(list(set(sum(tokens[0:52], [])))):
a[j] = i
return a
4.将文本从此的序列转换为索引序列
b = []
for i in range(len(tokens[0])):
b.append(a[tokens[0][i]])
b
5.分词工具推荐
现在有几个