原文地址在这里。

什么是词嵌入?

“词嵌入”是一系列旨在将语义映射到几何空间的自然语言处理技术。这是通过将数字向量与字典中的每个单词相关联来完成的,这样任何两个向量之间的距离(例如 L2 距离或更常见的余弦距离)将捕获两个相关单词之间的部分语义关系。这些向量形成的几何空间称为嵌入空间。

例如,“椰子”和“北极熊”是语义完全不同的词,因此合理的嵌入空间会将它们表示为相距很远的向量。但是“厨房”和“晚餐”是相关词,因此应该彼此靠近嵌入。

理想情况下,在一个好的嵌入空间中,从“厨房”和“晚餐”出发的“路径”(一个向量)将精确地捕捉这两个概念之间的语义关系。在这种情况下,关系是“x 出现的位置”,因此您会期望向量厨房 - 晚餐(两个嵌入向量的差异,即从晚餐到厨房的路径)捕获这种“x 出现的位置”关系。基本上,我们应该有向量恒等式:晚餐 +(x 出现的地方)=厨房(至少近似)。如果确实如此,那么我们可以使用这样的关系向量来回答问题。例如,从一个新向量开始,例如“工作”,并应用这个关系向量,我们应该在某个时候变得有意义,例如工作 +(x 出现的地方)= 办公室,回答“工作在哪里出现?”。

词嵌入是通过将降维技术应用于文本语料库中词之间的共现统计数据集来计算的。这可以通过神经网络(“word2vec”技术)或矩阵分解来完成。

GloVe 词嵌入

我们将使用 GloVe 嵌入,您可以在此处阅读。 GloVe 代表“词表示的全局向量”。 这是一种流行的嵌入技术,基于分解单词共现统计矩阵。

具体来说,我们将使用在 2014 年英语维基百科转储中计算的 400k 单词的 100 维 GloVe 嵌入。 您可以在此处下载它们(警告:点击此链接将开始下载 822MB)。

20 新闻组数据集

我们将尝试解决的任务是将来自 20 个不同新闻组的帖子分类为它们最初的 20 个类别——臭名昭著的“20 个新闻组数据集”。 您可以在此处阅读有关数据集的信息并下载原始文本数据。

类别在语义上是相当不同的,因此会有完全不同的词与之相关联。 以下是一些示例类别:

comp.sys.ibm.pc.hardware
comp.graphics
comp.os.ms-windows.misc
comp.sys.mac.hardware
comp.windows.xrec.autos
rec.motorcycles
rec.sport.baseball
rec.sport.hockey

方法

以下是我们将如何解决分类问题:

将数据集中的所有文本样本转换为单词索引序列。 “单词索引”只是单词的整数 ID。 我们将只考虑数据集中最常出现的前 20,000 个单词,并将序列截断为最大 1000 个单词。
         准备一个“嵌入矩阵”,它将在索引 i 处包含我们单词索引中索引 i 的单词的嵌入向量。
        将此嵌入矩阵加载到 Keras 嵌入层中,设置为冻结(其权重,嵌入向量,在训练期间不会更新)。
         在它之上构建一个 1D 卷积神经网络,以我们 20 个类别的 softmax 输出结束。

准备文本数据

首先,我们将简单地遍历存储文本样本的文件夹,并将它们格式化为样本列表。 我们还将同时准备与样本匹配的类别索引列表:

texts = []  # list of text samples
labels_index = {}  # dictionary mapping label name to numeric id
labels = []  # list of label ids
for name in sorted(os.listdir(TEXT_DATA_DIR)):path = os.path.join(TEXT_DATA_DIR, name)if os.path.isdir(path):label_id = len(labels_index)labels_index[name] = label_idfor fname in sorted(os.listdir(path)):if fname.isdigit():fpath = os.path.join(path, fname)if sys.version_info < (3,):f = open(fpath)else:f = open(fpath, encoding='latin-1')t = f.read()i = t.find('\n\n')  # skip headerif 0 < i:t = t[i:]texts.append(t)f.close()labels.append(label_id)print('Found %s texts.' % len(texts))

然后我们可以将我们的文本样本和标签格式化为可以输入神经网络的张量。 为此,我们将依赖 Keras 实用程序 keras.preprocessing.text.Tokenizer 和  keras.preprocessing.sequence.pad_sequences。

from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequencestokenizer = Tokenizer(nb_words=MAX_NB_WORDS)
tokenizer.fit_on_texts(texts)
sequences = tokenizer.texts_to_sequences(texts)word_index = tokenizer.word_index
print('Found %s unique tokens.' % len(word_index))data = pad_sequences(sequences, maxlen=MAX_SEQUENCE_LENGTH)labels = to_categorical(np.asarray(labels))
print('Shape of data tensor:', data.shape)
print('Shape of label tensor:', labels.shape)# split the data into a training set and a validation set
indices = np.arange(data.shape[0])
np.random.shuffle(indices)
data = data[indices]
labels = labels[indices]
nb_validation_samples = int(VALIDATION_SPLIT * data.shape[0])x_train = data[:-nb_validation_samples]
y_train = labels[:-nb_validation_samples]
x_val = data[-nb_validation_samples:]
y_val = labels[-nb_validation_samples:]

准备嵌入层

接下来,我们通过解析预训练嵌入的数据转储来计算将单词映射到已知嵌入的索引:

embeddings_index = {}
f = open(os.path.join(GLOVE_DIR, 'glove.6B.100d.txt'))
for line in f:values = line.split()word = values[0]coefs = np.asarray(values[1:], dtype='float32')embeddings_index[word] = coefs
f.close()print('Found %s word vectors.' % len(embeddings_index))

此时,我们可以利用 embedding_index 字典和 word_index 来计算嵌入矩阵:

embedding_matrix = np.zeros((len(word_index) + 1, EMBEDDING_DIM))
for word, i in word_index.items():embedding_vector = embeddings_index.get(word)if embedding_vector is not None:# words not found in embedding index will be all-zeros.embedding_matrix[i] = embedding_vector

我们将此嵌入矩阵加载到嵌入层中。 请注意,我们设置 trainable=False 以防止在训练期间更新权重。

from keras.layers import Embeddingembedding_layer = Embedding(len(word_index) + 1,EMBEDDING_DIM,weights=[embedding_matrix],input_length=MAX_SEQUENCE_LENGTH,trainable=False)

嵌入层应该输入整数序列,即形状(样本、索引)的 2D 输入。 这些输入序列应该被填充,以便它们在一批输入数据中都具有相同的长度(尽管嵌入层能够处理异质长度的序列,如果您不将显式 input_length 参数传递给该层)。

Embedding 层所做的只是将整数输入映射到嵌入矩阵中相应索引处的向量,即序列 [1, 2] 将转换为 [embeddings[1], embeddings[2]]。 这意味着 Embedding 层的输出将是一个 3D 张量的形状(samples、sequence_length、embedding_dim)。

训练一维卷积网络

最后我们可以构建一个小的一维卷积网络来解决我们的分类问题:

sequence_input = Input(shape=(MAX_SEQUENCE_LENGTH,), dtype='int32')
embedded_sequences = embedding_layer(sequence_input)
x = Conv1D(128, 5, activation='relu')(embedded_sequences)
x = MaxPooling1D(5)(x)
x = Conv1D(128, 5, activation='relu')(x)
x = MaxPooling1D(5)(x)
x = Conv1D(128, 5, activation='relu')(x)
x = MaxPooling1D(35)(x)  # global max pooling
x = Flatten()(x)
x = Dense(128, activation='relu')(x)
preds = Dense(len(labels_index), activation='softmax')(x)model = Model(sequence_input, preds)
model.compile(loss='categorical_crossentropy',optimizer='rmsprop',metrics=['acc'])# happy learning!
model.fit(x_train, y_train, validation_data=(x_val, y_val),epochs=2, batch_size=128)

该模型仅在 2 个 epoch 后就在验证集上达到了 95% 的分类准确率。 通过使用一些正则化机制(例如 dropout)或通过微调嵌入层进行更长时间的训练,您可能会获得更高的准确度。

我们还可以通过不使用预训练的词嵌入来测试我们的表现,而是从头开始初始化我们的嵌入层并在训练期间学习它的权重。 我们只需要将我们的嵌入层替换为以下内容:

embedding_layer = Embedding(len(word_index) + 1,EMBEDDING_DIM,input_length=MAX_SEQUENCE_LENGTH)

在 2 个 epoch 之后,这种方法只能让我们达到 90% 的验证准确率,低于之前的模型在一个 epoch 内所能达到的水平。 我们预先训练的嵌入肯定给我们带来了一些东西。 一般来说,使用预训练嵌入与自然处理任务相关,因为可用的训练数据很少(在功能上,嵌入充当外部信息的注入,这可能对您的模型有用)。

在 Keras 模型中使用预训练的词嵌入相关推荐

  1. 如何在深度学习过程中使用预训练的词表征(持续更新ing...)

    诸神缄默不语-个人CSDN博文目录 本文介绍在深度学习中如何应用预训练的词表征(word2vec等),应用到的框架包括numpy.PyTorch和TensorFlow 不同形式,见到了就补充总结一下. ...

  2. 在Keras的Embedding层中使用预训练的word2vec词向量

    文章目录 1 准备工作 1.1 什么是词向量? 1.2 获取词向量 2 转化词向量为keras所需格式 2.1 获取所有词语word和词向量 2.2 构造"词语-词向量"字典 2. ...

  3. PyTorch在NLP任务中使用预训练词向量

    在使用pytorch或tensorflow等神经网络框架进行nlp任务的处理时,可以通过对应的Embedding层做词向量的处理,更多的时候,使用预训练好的词向量会带来更优的性能.下面分别介绍使用ge ...

  4. 【从零开始学习深度学习】48.Pytorch_NLP实战案例:如何使用预训练的词向量模型求近义词和类比词

    目录 1. 下载预训练的词向量 2. 应用预训练词向量 2.1 求近义词 2.2 求类比词 本文将介绍如何使用已经在大规模语料上预训练的词向量模型来求近义词和类比词. 1. 下载预训练的词向量 基于P ...

  5. 神经网络 Embedding层理解; Embedding层中使用预训练词向量

    1.Embedding层理解 高维稀疏特征向量到低维稠密特征向量的转换:嵌入层将正整数(下标)转换为具有固定大小的向量:把一个one hot向量变为一个稠密向量 参考:https://zhuanlan ...

  6. 深度学习之循环神经网络(12)预训练的词向量

    深度学习之循环神经网络(12)预训练的词向量  在情感分类任务时,Embedding层是从零开始训练的.实际上,对于文本处理任务来说,领域知识大部分是共享的,因此我们能够利用在其它任务上训练好的词向量 ...

  7. github设置中文_【Github】100+ Chinese Word Vectors 上百种预训练中文词向量

    (给机器学习算法与Python学习加星标,提升AI技能) 该项目提供了不同表征(密集和稀疏)上下文特征(单词,ngram,字符等)和语料库训练的中文单词向量.开发者可以轻松获得具有不同属性的预先训练的 ...

  8. 预训练词向量中文维基百科,英文斯坦福glove预训练的词向量下载

    中文预训练词向量--基于中文维基百科语料训练 英文预训练词向量--斯坦福glove预训练的词向量 百度云分享:https://pan.baidu.com/s/1UpZeuqlNMl6XtTB5la53 ...

  9. 深度学习笔记 第五门课 序列模型 第二周 自然语言处理与词嵌入

    本文是吴恩达老师的深度学习课程[1]笔记部分. 作者:黄海广[2] 主要编写人员:黄海广.林兴木(第四所有底稿,第五课第一二周,第三周前三节).祝彦森:(第三课所有底稿).贺志尧(第五课第三周底稿). ...

最新文章

  1. 内存接口芯片,服务器平台,PCIe 芯片
  2. 磁悬浮地球仪底座驱动电路板分析
  3. thinkpad alert键一直处于按着的状态
  4. mysqld_safe启动mysql
  5. PHP 正在干掉 Python
  6. 北大程序设计实习MOOC 编程作业 《魔兽世界之二:装备》
  7. SpringCloud工作笔记039---spring cloud、javaweb中获取request对象的几种方法
  8. 基于51单片机的电池过压欠压报警电路protues仿真
  9. java 实验室预约系统_基于Java的实验室预约管理系统
  10. 智慧树python数据分析与数据可视化_智慧树知到Python数据分析与数据可视化答案免费查询...
  11. 【车道线检测】霍夫变换(HoughLines)检测直线详解
  12. camera调试名词及问题策略
  13. python接外包项目_微信外包项目,接口开发流程小记
  14. ifconfig命令用法举例
  15. nutch1.9和solr4.5集成 输出信息
  16. 试用期六个月,前三个月没有社保,这样的工作机会你会考虑吗?
  17. 接口与接口、接口与类之间的关系
  18. C语言编写两个函数,分别实现两个整数的最小公倍数和最大公约数
  19. Python学习:python time模块之time.mktime()
  20. LeetCode:917. 仅仅反转字母————简单

热门文章

  1. 4 SQL server(定义表的主键 外键 ,记录增删改查)
  2. 最新资讯!ONES 宣布收购「思否」技术社区!
  3. 实验报告模版Markdown格式 (2)
  4. Flash版(迷你音乐播放器mp3Player1.0 Beta1 )附源码
  5. django官方文档——django中的用户认证
  6. 在CSDN的六载时光,由你来决定今年的博客之星
  7. 衡量数据集中趋势的方法
  8. Vertx DNS解析源码
  9. 读书笔记:组织文化10个特点
  10. 乐高小颗粒零件清单 大全