在NLP自然语言处理领域,有时我们需要计算不同文本之间的相似度,将不同文本进行编码,然后处理成Embedding定长表示向量,然后使用LSTM进行输出文本表示,定义多个多输入源数据进行计算。
句子1:我不爱吃剁椒鱼头,但是我爱吃鱼头
句子2:我爱吃土豆,但是不爱吃地瓜
同样使用LSTM网络,把每个句子抽象成一个向量表示,通过计算这两个向量之间的相似度,就可以快速完成文本相似度计算任务。在实际场景里,我们也通常使用LSTM网络的最后一步hidden结果,将一个句子抽象成一个向量,然后通过向量点积,或者cosine相似度的方式,去衡量两个句子的相似度。
代码如下:
""" * Created with PyCharm * 作者: 阿光 * 日期: 2022/1/14 * 时间: 18:55 * 描述: """ import tensorflow as tf from keras import Model from tensorflow.keras.layers import * def get_model(): x_input = Input(shape=30) y_input = Input(shape=30) x_embedding = Embedding(input_dim=252173, output_dim=256)(x_input) y_embedding = Embedding(input_dim=252173, output_dim=256)(y_input) x_lstm = LSTM(128)(x_embedding) y_lstm = LSTM(128)(y_embedding) def cosine_distance(x1, x2): x1_norm = tf.sqrt(tf.reduce_sum(tf.square(x1), axis=1)) x2_norm = tf.sqrt(tf.reduce_sum(tf.square(x2), axis=1)) x1_x2 = tf.reduce_sum(tf.multiply(x1, x2), axis=1) cosin = x1_x2 / (x1_norm * x2_norm) return tf.reshape(cosin, shape=(-1, 1)) score = cosine_distance(x_lstm, y_lstm) output = Dense(1, activation='sigmoid')(score) model = Model([x_input, y_input], output) return model model = get_model() model.summary()