学习目标:

  1. 理解Embedding层的用法。
  2. 掌握利用Embedding层对单词进行向量化。

学习内容:

对如下中文词语,利用Embedding层训练,得到向量化的特征,并在二维平面上把词语显示出来,分析相应的结果。

docs = ['非常 ',' ',' 漂亮',' ','做得 ',' 极了',' ',' ',' ','做得 ','非常 恶心',' 极了']

labels = array([1,1,1,1,1,1,0,0,0,0,0,0])


学习过程:

不足三个单词的中文词语用0补充, 第一个词语训练之前对应的单词向量:

第一个词语训练之后对应的单词向量:

每个中文词语对应的单词向量:

在二维平面上显示每个单词编码的位置图,如下图所示:

训练的样本量太少,中文词语的分布从上图中看不出有啥规律。


源码:

# In[2]: 利用Tokenizer类进行编码
from keras.preprocessing.text import Tokenizerdef oneHotEncode(samples):#只考虑最常使用的前1000个单词tokenizer = Tokenizer(num_words = 1000)tokenizer.fit_on_texts(samples)#把句子分解成单词数组sequences = tokenizer.texts_to_sequences(samples)return sequencessamples = ['The cat jump over the dog', 'The dog ate my homework']
vecs = oneHotEncode(samples)
#print(vecs)  # [[1, 3, 4, 5, 1, 2], [1, 2, 6, 7, 8]]
# 如果要独热编码,则可以构造1000个元素的全0向量,然后把对应编号处的元素设为1即可# In[3]: 使用Keras的 Embedding层 对单词的编码进行训练
from numpy import array
from keras.preprocessing.text import one_hot
from keras.preprocessing.sequence import pad_sequences
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Flatten
from keras.layers.embeddings import Embedding
# 定义一系列简单文本,前一半表示赞美,后一半表示批判
#docs = ['Well done',
#'Good work',
#'Great effort',
#'nice work',
#'Excellent',
#'Weak',
#'Poor effort',
#'quit bad',
#'it is terrible',
#'like a shit']
docs = ['非常 好','很 棒','真 漂亮','真 好','做得 好','好 极了','很 差',
'不 行','太 差','做得 差','非常 恶心','坏 极了']# 属于赞美性质的文本用1表示,属于批评性质的文本用0表示
#labels = array([1,1,1,1,1,0,0,0,0,0])
labels = array([1,1,1,1,1,1,0,0,0,0,0,0])
# 假定单词量有50个
vocab_size = 50encoded_docs = oneHotEncode(docs)
print(encoded_docs)
# 规定每个文本3个单词,不足3个的用0补足
max_length = 3
padded_docs = pad_sequences(encoded_docs, maxlen=max_length, padding='post')
print(padded_docs)model = Sequential()
'''
Embedding层本质上是一个矩阵,高为vocab_size, 宽为8,矩阵的每一行对应每个单词向量
由于我们设定每篇文本的单词量为4个,每个单词对应一个8元素的向量,
因此我们把一篇文本对应的向量也就是一个含有4个元素的向量输入Embedding层后,
得到4*8的一个二维矩阵,其中的4对应输入文本向量中元素个数,8对应每个单词的向量维度
'''
# Embedding类将正整数(索引)转换为固定大小的密集向量,通过矩阵乘法进行数据降维。
emebdding_layer = Embedding(vocab_size, 8, input_length=max_length)
model.add(emebdding_layer)print("vector for word Well before train is:")
print(emebdding_layer.get_weights()[0][0])model.add(Flatten())
model.add(Dense(1, activation='sigmoid'))model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])print(model.summary())
# 训练网络
model.fit(padded_docs, labels, epochs=50, verbose=0)print("vector for word Well after train is:")
print(emebdding_layer.get_weights()[0][0])# In[4]:
#建立单词与编号之间的对应关系
word2Num = {}
for idx, doc in enumerate(docs):words = doc.split()for i, word in enumerate(words):print("{0} => {1}".format(word, encoded_docs[idx][i]))word2Num[word] = encoded_docs[idx][i]embeddings = emebdding_layer.get_weights()[0]
#建立单词与向量之间的连续
vectors = []
words = []
for word, num in word2Num.items():print("{0} => {1}".format(word, embeddings[num]))words.append(word)vectors.append(embeddings[num])# In[5]: 在二维平面上显示每个单词编码的位置图
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #显示中文标签
plt.rcParams['axes.unicode_minus'] = False #显示负号
tsne_model = TSNE(perplexity=40, n_components=2, init='pca', n_iter=2500, random_state=23)
new_values = tsne_model.fit_transform(vectors)x = []
y = []
for value in new_values:x.append(value[0])y.append(value[1])plt.figure(figsize=(10, 10))
plt.title('单词编码位置图')
for i in range(len(x)):plt.scatter(x[i], y[i])plt.annotate(words[i], xy=(x[i], y[i]), xytext=(5,2), textcoords='offset points',ha='right',va='bottom')
plt.show()

源码下载


学习产出:

  1. 理解了利用Embedding层对单词进行向量化的方法。

人工智能--Embedding层相关推荐

  1. 深入理解 Embedding层的本质

    继上文https://blog.csdn.net/weixin_42078618/article/details/82999906探讨了embedding层的降维效果,时隔一个月,分享一下嵌入层在NP ...

  2. 【文本分类】深入理解embedding层的模型、结构与文本表示

    [1] 名词理解   embedding层:嵌入层,神经网络结构中的一层,由embedding_size个神经元组成,[可调整的模型参数].是input输入层的输出.   词嵌入:也就是word em ...

  3. embedding层和全连接层的区别是什么 一般说embedding层,实现方式就是一个没有bias的fc层

    embedding层和全连接层的区别是什么 一般说embedding层,实现方式就是一个没有bias的fc层

  4. word2vec的词向量神经网络的embedding层的关系

    自己之前学习了一波word2vec的词向量&&神经网络的embedding,关于这2者的原理和实践,可以参看我之前的博客: 利用神经网络的embedding层处理类别特征 (一)理解w ...

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

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

  6. 点击率预测模型Embedding层的学习和训练

    导读: 本文将简要介绍推荐模型的发展历史,现状,和下一步的研究趋势.并重点介绍针对embedding数据的模型训练及优化.主要包含以下几大部分内容: CTR预测模型(CTR Models) 连续值处理 ...

  7. 利用神经网络的embedding层处理类别特征

    类别特征在现实里十分常见,处理的方法也很多,最常见的思路是转为one-hot编码,当然这种处理方式比较粗暴,在许多算法里效果也不是很好.还有的处理方式寻找类别特征的最优切分,这个需要特定工具的支持,如 ...

  8. pytorch embedding层详解(从原理到实战)

    做nlp很多时候要用到嵌入层,pytorch中自带了这个层 什么是embedding层 这是一个写的比较好的 我用最通俗的语言给你讲 在nlp里,embedding层就是把单词表['你','好','吗 ...

  9. keras.layers.Embedding层介绍

    本层应用,就是把稀疏矩阵变成一个密集矩阵,也称为查表,因为他们之间是一个一一映射关系.与其对应的是one-hot编码,multi-hot编码,对于特征维度过大的应用,直接使用会造成维度灾难. Embe ...

最新文章

  1. 微软私有云分享(R2)13 处理孤立资源
  2. android 底部表格布局TableLayout
  3. 旋转数组 java_数组中左旋转的Java程序
  4. oracle两个约束,Oracle中的约束介绍(2)
  5. gsea结果分析图怎么看_微信公众平台数据分析怎么看
  6. CSS常用单词-弹性盒(专业版)
  7. This关键字的一些更新的理解
  8. Bootstrap 框架学习目录
  9. 云免流控服务器响应失败,云免流服务器是否违法
  10. 连点器安卓手机版_【百度识图器安卓下载】百度识图器官方app下载 v3.6.0 手机版...
  11. STL-Intelligent IME
  12. oracle裁员原因_Oracle中国良心裁员:首批900人,赔偿N+6
  13. Win11怎么添加日语输入法
  14. Chrome浏览器上集成IE内核方案
  15. 大数据处理问题及解决方法
  16. 王者荣耀 服务器显示不出100区,王者荣耀为什么荣耀战区显示不出来
  17. Louvain 算法
  18. erp用php,erp为何不用php开发
  19. 80%的人分不清传感网与物联网的区别,这二者之间的具体区别到底是什么?
  20. 2016年,都有哪些企业进入了美国的储能业务“角斗场”

热门文章

  1. windows10桌面录屏软件哪个好
  2. raid读写速度对比_读写速度对比:两者伯仲之间_三星 840EVO mSATA_固态硬盘评测-中关村在线...
  3. MySQL左连接之后引起的排序问题
  4. 山东大学计算机菁英班就读体验
  5. PyCon China 2012,我们上海见!
  6. leetcode系列-714. 买卖股票的最佳时机含手续费
  7. 每年6月10祭奠歌迷家驹活动
  8. userAgent获取并判断是否pc
  9. unity Camera(摄像机)介绍
  10. 论文阅读 4 | A Survey on High-dimensional Gaussian Process Modeling with Application