Python深度学习(处理文本数据)--学习笔记(十二)

本文介绍了如何使用深度学习处理文本数据,重点讲述了n-gram和词袋的概念,以及单词和字符的one-hot编码。接着讨论了词嵌入,包括如何利用Embedding层学习词嵌入和使用预训练的词嵌入,如GloVe。通过实例展示了从原始文本到词嵌入的完整流程,包括下载IMDB数据、分词、预处理和训练模型。
摘要由CSDN通过智能技术生成

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

  • 用于处理序列的两种基本的深度学习算法分别是循环神经网络(recurrent neural network)和一维卷积神经网络(1D convnet),这些算法的应用包括:(1)文档分类和时间序列分类,比如识别文字的主题或书的作者;(2)时间序列对比,比如估测两个文档或两支股票行情的相关程度;(3)序列到序列的学习,比如将英语翻译成法语;(4)情感分析,比如将推文或电影评论的情感划分为正面或负面;(5)时间序列预测,比如根据某地最近的天气数据来预测未来天气。

6.1 处理文本数据

  • 文本是最常用的序列数据之一,可以理解为字符序列或单词序列,但最常见的是单词级处理。后面几节介绍的深度学习序列处理模型都可以根据文本生成基本形式的自然语言理解,并可用于文档分类、情感分析、作者识别甚至问答(QA,在有限的语境下)等应用。当然,请记住,本章的这些深度学习模型都没有像人类一样真正地理解文本,而只是映射出书面语言的统计结构,但这足以解决许多简单的文本分类任务。深度学习用于自然语言处理是将模式识别应用于单词、句子和段落,这与计算机视觉将模式识别应用于像素大致相同。
  • 与其他所有神经网络一样,深度学习模型不会接收原始文本作为输入,它只能处理数值张量。文本向量化(vectorize)是指将文本转换为数值张量的过程。它有多种实现方法:(1)将文本分割为单词,并将每个单词转换为一个向量。(2)将文本分割为字符,并将每个字符转换为一个向量。(3)提取单词或字符的n-gram,并将每个n-gram转换为一个向量。n-gram是多个连续单词或字符的集合(n-gram之间可重叠)。
  • 将文本分解而成的单元(单词、字符或n-gram)叫作标记(token),将文本分解成标记的过程叫作分词(tokenization)。所有文本向量化过程都是应用某种分词方案,然后将数值向量与生产的标记相关联。这些向量组合成序列张量,被输入到深度神经网络中。将向量与标记相关联的方法有很多种。本节将介绍两种主要方法:对标记做one-hot编码(one-hot encoding)与标记嵌入(token embedding,通常只用于单词,叫作词嵌入(word embedding))。
理解n-gram和词袋
  • n-gram是从一个句子中提取的N个(或更少)连续单词的集合。这一概念中的“单词”也可以替换为“字符”。
  • 袋(bag)这一术语指的是标记组成的集合,而不是一个列表或序列,即标记没有特定的顺序。
  • 词袋是一种不保存顺序的分词方法(生成的标记组成一个集合,而不是一个序列,舍弃了句子的总体结构),因此它往往被用于浅层的语言处理模型,而不是深度学习模型。提取n-gram是一种特征工程,深度学习不需要这种四班而又不稳定的方法,并将其替换为分层特征学习。本章后面将介绍的一维卷积神经网络和循环神经网络,都能够通过观察连续的单词序列或字符序列来学习单词组合字符组的数据表示,而无须明确知道这些组的存在。在使用轻量级的浅层文本处理模型时(比如logistic回归和随机森林),n-gram是一种功能强大、不可或缺的特征工程工具。
6.1.1 单词和字符的one-hot编码
  • one-hot编码是将标记转换为向量最常用、最基本的方法。它将每个单词与一个唯一的整数索引相关联,然后将这个整数索引 i i i转为为长度为 N N N的二进制向量( N N N是词表大小),这个向量只有第 i i i个元素是1,其余元素都为0。当然,也可以进行字符级的one-hot编码。
# 单词级的one-hot编码
import numpy as np

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

token_index = {
   } # 构建数据中所有标记的索引
# 为每个唯一单词指定一个唯一索引。注意,没有为索引编号0指定单词。
for sample in samples:
    for word in sample.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))

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.

print(results)
# 字符级的one-hot编码
import string
import numpy as np

samples = ['The cat sat on the mat.', 'The dog ate my homework.']
characters = string.printable # 所有可打印的ASCII字符
token_index = dict(zip(characters, range(1, len(characters) + 1)))

max_length = 50

results = np.zeros((len(samples), max_length, max(token_index.values()) + 1))

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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值