关键词的相似度计算

本文探讨了使用ELMO模型进行关键词向量化的过程,解释了为何从杰卡德相似度转向余弦相似度,详细介绍了ELMO模型的原理及其实现代码,包括双向LSTM语言模型的使用,以及如何通过整合不同层的激活来提高下游任务的性能。
摘要由CSDN通过智能技术生成

关键词的相似度刚开始采用的是杰卡德相似度,但是会出现非常多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训练流程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值