《Python 深度学习》刷书笔记 Chapter 6 Part-1 神经网络处理文本序列的几种方法


处理文本数据


对于文本处理以及时间系列的处理,我们一般使用循环神经网络或者一维卷积神经网络

和其他的神经网络一样,深度学习模型不能直接接收原始的自然语言文本作为输入,它只能处理数值张量,并将文本向量化,对此可以有以下几种实现方法:

  • 将文本分割为单词,并将每个单词都转换为一个向量
  • 将文本分割为字符,每个字符对应一个向量
  • 使用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,您的支持作者最大的创作动力哟!
<(^-^)>
才疏学浅,若有纰漏,恳请斧正
本文章仅用于各位同志作为学习交流之用,不作任何商业用途,若涉及版权问题请速与作者联系,望悉知

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值