本节为遇到问题的教程章节,我这里使用了Tensorflow的Embedding模型,通常,我们会有一些文本文件,在对这些文本数据进行分词(包括去停用词、词干化等)后构建词汇表(vocabulary),那么如何在tensorflow中使用Word Embedding呢?
#对上述字符串进行分词
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,
…
现在,我们需要设定词向量的大小(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))
在Keras中,非常方便,可以使用单独的一层来进行词嵌入(embeddings)
embeddings = tf.keras.layers.Embedding(VOCAB_LEN, EMBED_SIZE)
embed = embeddings(words_ids)
由于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))
在这里,我们可以使用经典的范式—__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))
通过使用预先训练过的词嵌入模型,我们可以从中受益,因为它们可以提高模型的性能(准确率和训练效率)。 它们通常使用大量数据集进行训练,例如: 维基百科,百度百科等。
有几个已经训练过的词嵌入模型,可以直接下载获得,最着名的是如下2个: word2vec以及glove
我们可以在此阅读有关训练词向量模型,以及如何从头开始训练它们的更多信息也就是tensorflow教程 ,还有这篇美妙的博文
您可以使用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))
代码可以转移至我的github获取。
[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.