第六章 深度学习用于文本和序列

1.1.单词和字符的one-hot编码

下面展示一些 内联代码片

"""
1.1.单词和字符的one-hot编码 
"""

# In[1]:.单词级的one-hot编码(简单示例)
import numpy as np

samples = ['The cat sat on the mat.', 'The dog ate my homework.']   # 初始数据:长度为2,每个样本是列表的一个元素(本例的样本是一个句子,但也可以是一整篇文档)
print(len(samples))

token_index = {}                     # 构建数据中所有标记的索引(字典)
for sample in samples:
    for word in sample.split():      # 利用split()方法对样本进行分词. 在实际应用中,还需要从样本中去掉标点和特殊字符
        if word not in token_index:  # 如果单词不在token_index中,就添加进去
            token_index[word] = len(token_index) + 1    # 为每个单词指定一个唯一索引. 注意:没有为索引为编号0指定单词
    print(token_index)
            
max_length = 10             # 对样本进行分词. 只考虑每个样本前max_length个单词

# 将结果保存在results中   3D (2, 10, 11) 210×110矩阵
results = np.zeros(shape=(len(samples),
                          max_length,
                          max(token_index.values()) + 1))
print(results.shape)

# enumerate()用于将一个可遍历的数据对象组合为一个索引序列,同时列出数据和数据下标
for i, sample in enumerate(samples):
    print(i,sample)
    for j, word in list(enumerate(sample.split()))[:max_length]:
        print(j, word)
        index = token_index.get(word)
        results[i, j, index] = 1.
        
print(results)                          # 已经将标记处理成张量


# In[2]:.字符级的one-hot编码(简单示例)
import string

samples = ['The cat sat on the mat.', 'The dog ate my homework.']  
characters = string.printable           # 所有可打印的ASCll字符

token_index = dict(zip(characters, range(1, len(characters) + 1)))   # 用zip和dict创建字典

max_length = 50                # 对样本进行分词. 只考虑每个样本前max_length个单词

# 将结果保存在results中  3D (2, 50, 101) 250×1010矩阵
results = np.zeros((len(samples),
                    max_length, 
                    max(token_index.values()) + 1))
print(results.shape)

for i, sample in enumerate(samples):   
    for j, character in list(enumerate(sample.split()))[:max_length]:
        index = token_index.get(character)
        results[i, j, index] = 1.



# In[3]:.用Keras实现单词级的one-hot编码(简单示例)(Tokenizer分词器)
from keras.preprocessing.text import Tokenizer  

samples = ['The cat sat on the mat.', 'The dog ate my homework.']  

tokenizer = Tokenizer(num_words=1000)   # 创建一个分词器(tokenizer),设置为只考虑前1000个最常见的单词
tokenizer.fit_on_texts(samples)         # 构建单词索引

sequences = tokenizer.texts_to_sequences(samples)     # 将字符转换为整数索引组成的列表
print(sequences)

# 也可以直接得到one-hot二进制表示. 这个分词器也支持除了one-hot编码外的其他向量化模式
one_hot_results = tokenizer.texts_to_matrix(samples, mode='binary')   

word_index = tokenizer.word_index     # 找回单词索引
print('Found %s unique tokens.' % len(word_index))      # 9个不同的单词  (只考虑前1000个最常见的单词)



# In[4]:.使用散列技巧的单词级的one-hot编码(简单示例)
samples = ['The cat sat on the mat.', 'The dog ate my homework.']  

# 将单词保存为长度为1000的向量. 如果单词数量接近1000个(或更多),那么会遇到很多散列冲突,这会降低这种编码方法的准确性
dimensionality = 1000   # 维数
max_length = 10

results = np.zeros((len(samples),             # 将结果保存在results中  3D (2, 10, 1000) 210×10000矩阵 
                    max_length, 
                    dimensionality))
print(results.shape)

for i, sample in enumerate(samples):   
    for j, character in list(enumerate(sample.split()))[:max_length]:
        index = abs(hash(word)) % dimensionality    # (散列函数)将单词散列为01000范围内的一个随机整数索引
        results[i, j, index] = 1.
print(results)


代码运行结果:
第一部分:在这里插入图片描述在这里插入图片描述
第二部分:(2, 50, 101)
第三部分:
[[1, 2, 3, 4, 1, 5], [1, 6, 7, 8, 9]]
Found 9 unique tokens.
第四部分:在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值