文章目录
处理文本数据
对于文本处理以及时间系列的处理,我们一般使用循环神经网络或者一维卷积神经网络
和其他的神经网络一样,深度学习模型不能直接接收原始的自然语言文本作为输入,它只能处理数值张量,并将文本向量化,对此可以有以下几种实现方法:
- 将文本分割为单词,并将每个单词都转换为一个向量
- 将文本分割为字符,每个字符对应一个向量
- 使用n-gram的方式提取字符串
需要注意的是n-gram与词袋方法属于一种特征提取工程,比如对某一类词组的连词提取,对于较少的文本数据集有较为高效的作用,但是大多数情况下我们不会使用。
6-1 单词级别的one-hot编码
one-hot编码是将每一个单词与一个唯一的整数索引相关联,然后将这个整数索引i转换为长度为N的二进制向量(N为词表大小),其中,这个向量志愿在第i个单元的元素是1,其余的元素均为0
import numpy as np
# 初始数据:每个样本是列表的一个元素
# 如下面的例子,这样的样本可以是一个句子,也可以是一个文档
samples = ['The cat sat on the mat.', 'The dog ate my homework.']
# 构建数据中的标记索引
token_index = { }
for sample in samples:
for word in sample.split():
# 使用split方法对样本进行分词,
# 在实际应用中还需要去掉标点符号以及特殊字符
if word not in token_index:
token_index[word] = len(token_index) + 1
# 对样本进行讽刺,只考虑样本前max-length个单词
max_length = 10
# 初始化结果矩阵
results = np.zeros(shape = (len(samples),
max_length,
max(token_index.values()) + 1))
# 将结果保存在results中
for i, sample in enumerate(samples):
for j, word in list(enumerate(sample.split()))[:max_length]:
index = token_index.get(word)
results[i, j, index] = 1.
6-2 字符级别的one-hot编码
import string
samples = ['The cat sat on the mat.', 'The dog ate my homework.']
# 设置为所有可打印的SASCII字符
charaters = string.printable
token_index = dict(zip(charaters, range(1, len(charaters) + 1)))
max_length = 50
# 存储结果
results = np.zeros((len(samples), max_length, max(token_index.values()) + 1))
# 循环嵌入字典
for i, sample in enumerate(samples):
for j, charater in enumerate(sample[:max_length]):
index = token_index.get(charater)
results[i, j, index] = 1.
6-3 用Keras实现单词级别的one-hot编码
from keras.preprocessing.text import Tokenizer
samples = ['The cat sat on the mat.', 'The dog ate my homework.']
# 创建一个分词器,只考虑前1000个最常见的单词
tokenizer = Tokenizer(num_words = 1000)
# 构建单词索引
tokenizer.fit_on_texts(samples)
# 将字符串转换为整数索引组成的列表
one_hot_results = tokenizer.texts_to_matrix(samples, mode = 'binary')
# 找回单词索引
word_index = tokenizer.word_index
print('Found %s unique tokens,' % len(word_index))
Found 9 unique tokens,
one-hot 散列技巧
one-hot的另外一种变体是one-hot散列技巧,如果遇到词表中唯一标记的数量太大无法处理就可以使用这种情况
这种方法没有为每个单词显示分配一个索引,而是将单词散列编码为固定长度的向量,通常用一个非常简单的的散列函数来实现
优点:避免维护一个显式的单词索引
缺点:可能会出现散列冲突
6-4 使用散列技巧的的单词级别的one-hot编码
samples = ['The cat sat on the mat.', 'The dog ate my homework.']
# 若单词数量接近或超过设定的最大长度(1000),那么会遇到散列冲突,进而降低编码的准确性
dimensionality = 1000
max_length = 10
results = np.zeros((len(samples), max_length, dimensionality))
for i, sample in enumerate(samples):
for j, word in list(enumerate(sample.split()))[:max_length]:
# hash 代表使用哈希散列编码
index = abs(hash(word)) % dimensionality
results[i, j, index] = 1.
写在最后
注:本文代码来自《Python 深度学习》,做成电子笔记的方式上传,仅供学习参考,作者均已运行成功,如有遗漏请练习本文作者
各位看官,都看到这里了,麻烦动动手指头给博主来个点赞8,您的支持作者最大的创作动力哟!
<(^-^)>
才疏学浅,若有纰漏,恳请斧正
本文章仅用于各位同志作为学习交流之用,不作任何商业用途,若涉及版权问题请速与作者联系,望悉知