关键词的相似度刚开始采用的是杰卡德相似度,但是会出现非常多0的情况,这个情况不太利于区分关键词之间的相似度。所以进行改进变为向量化关键词后算embedding的余弦相似度。
ELMO原理
尝试ELMO模型进行单词向量化
ELMO模型的基本组成单元为lstm,输入门、遗忘门、输出门等计算公式如下图
ELMO是双向lstm语言模型,第一个是使用了多层LSTM,第二个是增加了后向语言模型,不仅可以前文预测后文,也增加了后文预测前文的内容。
elmo使用的双向lstm语言模型,论文中简称biLM。作者将公式结合起来,得到所要优化的目标:最大化对数前向和后向的似然概率
ELMo 是 biLMs 几层激活的串联。语言模型的不同层对单词上的不同类型的信息进行编码(如在双向LSTM神经网络中,词性标注在较低层编码好,而词义消歧义用上层编码更好)。连接所有层可以自由组合各种文字表示,以提高下游任务的性能。
主要代码
# Import our dependencies# Import
import tensorflow as tf
import pandas as pd
import tensorflow_hub as hub
import os
import re
from keras import backend as K
import keras.layers as layers
from keras.models import Model
import numpy as np
# Initialize session
sess = tf.Session()
K.set_session(sess)
# Now instantiate the elmo model
elmo_model = hub.Module("https://tfhub.dev/google/elmo/1", trainable=True)
sess.run(tf.global_variables_initializer())
sess.run(tf.tables_initializer())
# Build our model
# We create a function to integrate the tensorflow model with a Keras model
# This requires explicitly casting the tensor to a string, because of a Keras quirk
def ElmoEmbedding(x):
return elmo_model(tf.squeeze(tf.cast(x, tf.string)), signature="default", as_dict=True)["default"]
input_text = layers.Input(shape=(1,), dtype=tf.string)
embedding = layers.Lambda(ElmoEmbedding, output_shape=(1024,))(input_text)
dense = layers.Dense(256, activation='relu')(embedding)
pred = layers.Dense(1, activation='sigmoid')(dense)
model = Model(inputs=[input_text], outputs=pred)
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()
# Fit!
model.fit(train_text,
train_label,
validation_data=(test_text, test_label),
epochs=5,
batch_size=32)
生成关键词embedding算余弦相似度
import numpy as np
def cosine_distance(v1, v2): # 余弦距离
if type(v1)==list:
v1 = np.array(v1)
if type(v2)==list:
v2 = np.array(v2)
if v1.all() and v2.all():
return np.dot(v1, v2.T) / (np.linalg.norm(v1) * np.linalg.norm(v2))
else:
return 0
结果
对所有关键词的embedding加和求平均
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020063022415249.png
遇到的问题
在加载模型时我发现在colab里面tensorflow的版本为2.2.0,这样的话需要改为model.load,或者将colab tensorflow降为1.x版本
参考
https://blog.csdn.net/weixin_37947156/article/details/83146184?ops_request_misc=&request_id=&biz_id=102&utm_term=elmo&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-1-83146184#31-elmo训练流程