NLP进阶之(四)于Tensorflow中使用Word Embedding

本节为遇到问题的教程章节,我这里使用了Tensorflow的Embedding模型,通常,我们会有一些文本文件,在对这些文本数据进行分词(包括去停用词、词干化等)后构建词汇表(vocabulary),那么如何在tensorflow中使用Word Embedding呢?

1. 文本预处理

 #对上述字符串进行分词

text = '''然而 , 即使 这样 , 大数据 ( 分析 ) 对于 绝 大 部分 人 来 说 仍 停留 在 概念 层面 , 或者 是 给人 很 “ 高 大 上 ” 、 不接地气 的 印象 ,
因为 这个 词 似乎 和 “ 技术 ” 、 “ 编程 ” 紧密 联系 在 一起 。

其实 不然 , 经过 这几年 的 发展 , 大数据 应用 已经 触手可及 ,
比如 笔者 上面 用到 的 谷歌趋势 ,
以及 互联网 从业者 很 熟悉 的 百度指数、 微指数 等  , 都是 一些 大家 触手可及 的 大数据分析 工具 。
借助 这些 工具 , 我们 只 需要 在 了解 业务知识 的 情况 下 ,就 能 完成 一些 大数据趋势分析 、 事件 ( 传播 ) 分析 、用户画像 分析 等 。

在 本文 中 , 笔者 将会 介绍 大数据 分析 主要 的 处理 对象 — 社会化媒体 ( Social Media ) ,
以及 对 社会化媒体 进行分析 的 重要手段 — — 社会化聆听 ( Social  Listening ) 。 最后 , 笔者 将 以 汽车 行业 的 一个 实操 案例 , 来 讲述 如何 使用 社会化聆听 ( 工具 )来 对 社会化媒体 大数据 进行 分析 , 虽然 “ 隔行如隔山 ” , 但 “ 隔行不隔理 ”, 其他 领域 的 读者 也 可以 借鉴 这种 分析思路 和 方法 , 来 帮助 自己 在 产品设计 / 运营 、 市场调研 中 达成 目标 。'''

tokenized = text.split(' ')
tokenized = [i.strip().strip('|、|,|。(|)|\n')  for i in tokenized]
tokenized = [i.strip()  for i in tokenized if len(i) >0]
vocab = {k:v for v,k in enumerate(np.unique(tokenized))}

这是一个非常简单的示例,我们通常需要以并行的方式来对多个文本源进行更多的预处理,产生字符(tokens),并创建词汇表(vocab)。 例如,您可以使用PySpark有效地进行文本预处理。
下面,我们打印出词汇表(vocabulary)

{’/’: 0,
‘Listening’: 1,
‘Media’: 2,
‘Social’: 3,
‘—’: 4,
‘“’: 5,
‘”’: 6,
‘一个’: 7,
‘一些’: 8,
‘一起’: 9,
‘上’: 10,
‘上面’: 11,
‘下’: 12,

2. 词向量维度设置

现在,我们需要设定词向量的大小(Embedding size),也就是每个词汇向量的维度(the dimension of each vector),在这里,我将维数设定为50,词汇长度则是词汇表的词汇数量(len(vocab))。

EMBED_SIZE = 50
VOCAB_LEN = len(vocab.keys())

print(VOCAB_LEN)

131

我们知道需要设定我们想要嵌入的词汇(words)id。 下面,我们将采用“百度指数”和“大数据”这两个词汇作为示例:

words_ids = tf.constant([vocab["百度指数"], vocab["大数据"]])

记住,words_ids代表词汇表(vocabolary)中某些词汇的ID。 词汇表(vocabolary)是从词汇(tokens)ID的映射。

WHY为什么我们需要这么做? 神经网络只能输入数字, 所以我们需要将数字传给嵌入层(embedding layer)。
‘简单的’ 方法
我们可以使用tensorflow的低级API(low-level API)进行词嵌入。 我们首先需要设定一个大小为[VOCAL_LEN,EMBED_SIZE](20,50)的矩阵,紧接着,我们再使用tf.nn.embedding_lookup告诉TensorFlow在哪里去查找我们的词汇id。
调用tf.nn.embedding_lookup创建一个操作,它将根据第二个参数的索引来检索第一个参数的行。

embeddings = tf.Variable(tf.random_uniform([VOCAB_LEN, EMBED_SIZE]))
embed = tf.nn.embedding_lookup(embeddings, words_ids)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print(sess.run(embed))

3. 不同情况下Embedding设置情况

3.1 Keras层

在Keras中,非常方便,可以使用单独的一层来进行词嵌入(embeddings)

embeddings = tf.keras.layers.Embedding(VOCAB_LEN, EMBED_SIZE)
embed = embeddings(words_ids)

3.2 Tensorflow层

由于Tensorflow的API比较混乱,同时存在几种方法可以做同样的事情,有时我们并不清楚该使用哪一个。所以,这里还有另一个功能来创建词嵌入。

embed = tf.contrib.layers.embed_sequence(ids=words_ids, vocab_size=VOCAB_LEN, embed_dim=EMBED_SIZE)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print(sess.run(embed))

3.3 编写自定义模块

在这里,我们可以使用经典的范式—__init____call__来创建一个自定义类,用以构建词嵌入层。

class Embedding():
    def __init__(self, vocab_size, emd_dim=50):
        self.vocab_size = vocab_size
        self.emd_dim = emd_dim
        self.embeddings = tf.Variable(tf.random_uniform([self.vocab_size, self.emd_dim]))

    def __call__(self, words_id):
        return tf.nn.embedding_lookup(self.embeddings, words_ids)
embedding = Embedding(VOCAB_LEN, EMBED_SIZE)
embed = embeddings(words_ids)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print(sess.run(embed))

3.4 采用预训练的词嵌入模型

通过使用预先训练过的词嵌入模型,我们可以从中受益,因为它们可以提高模型的性能(准确率和训练效率)。 它们通常使用大量数据集进行训练,例如: 维基百科,百度百科等。

  • 有几个已经训练过的词嵌入模型,可以直接下载获得,最着名的是如下2个: word2vec以及glove

  • 我们可以在此阅读有关训练词向量模型,以及如何从头开始训练它们的更多信息也就是tensorflow教程 ,还有这篇美妙的博文

TensorFlow Hub

您可以使用TensorFlow_hub轻松使用预先训练过的词嵌入,完整模型清单是这里

让我们看看它的实际效果。

顺便说一句,TensorFlow Hub是有缺陷的,并且在Jupyter上运行不佳。 或者,至少在我们自己本地的机器上,可以尝试运行它。 在PyCharm上,我没有发现任何问题,所以我将复制并粘贴输出。

如果大家遇到类似的问题,可以在TensorFlowrepository上创建一个问题。

以往,加载到TensorFlow的预训练词嵌入模型并不简单方便。 你必须从某个地方下载它们,并通过额外写程序加载到你的程序中,然后再次存储它。 现在,我们可以使用TensorFlow Hub 轻轻松松的实现这一步骤。

import tensorflow_hub as hub

embed = hub.Module("https://tfhub.dev/google/nnlm-zh-dim128-with-normalization/1")
embeddings = embed(['百度指数','社会化媒体'])       #你甚至不需要提供词汇的id,可以直接将字符(tokens)喂到模型里去


with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    sess.run(tf.tables_initializer())

    print(sess.run(embeddings))

4. 总结

代码可以转移至我的github获取。

4.1 参考链接

[1]: Rong, Xin. “word2vec parameter learning explained.” arXiv preprint arXiv:1411.2738 (2014).
[2]:Pennington, Jeffrey, Richard Socher, and Christopher Manning. “Glove: Global vectors for word representation.” Proceedings of the 2014 conference on empirical methods in natural language processing (EMNLP). 2014.

猜你喜欢

转载自blog.csdn.net/qq_35495233/article/details/86619854