DSSM深度语义匹配原理与Tensorflow实现

    在工业界DSSM(Deep Structured Semantic Models)已经演化成一种语义匹配框架,不仅用于文本的匹配,也用于推荐系统的User-Item的匹配,本文描述与实现DSSM在文本匹配上的应用,主要内容如下:

  • DSSM原理
  • 数据预处理
  • 模型实现
  • 模型训练
  • 模型预测

DSSM原理

    DSSM的主要结构如下:

                          

主要分为表示层和匹配层,表示层可使用全连接、RNN、Transformer等等网络得到query和doc的向量,匹配层一般使用cosine相似度来计算query和1个正样本doc和N个负样本doc的相似度。这里就不讲解原始论文里DSSM的原理了,只讲其在文本上是如何使用的,有兴趣的朋友可以参考原论文《Learning Deep Structured Semantic Models for Web Search using Clickthrough Data》。

  • 表示层

原始论文中主要针对英文,为了降维做了word hashing,而中文常用汉字只有1万左右。我们将query和doc的字直接传入embedding,然后接一层双向的GRU,假设每个字的embedding表示为\omega _{it},则GRU表示为:

                                                               

然而,并不是每个字都是我们所需要的,所以在GRU后面再接一层Attention,其表示为:

                                                              

即通过一个线性层对GRU的输出进行变换,然后通过softmax公式计算出每个字的重要程度,最后与GRU的输出求和得到句子的表示。

  • 匹配层

   得到query和doc的向量表示之后(一般为64或128维向量),计算他们之间的cosine相似度:

                                                            

并通过softmax将query与正样本doc的相似度计算转换为后验概率,计算如下:

                                                              

其中\gamma为softmax平滑因子,可设置为固定值(如20,50等)也可以用一个参数去学习。D+为query对应的正样本,D'为随机采样的query对应的N个负样本。

训练时通过极大似然估计最小化损失函数:

                                                             

 

数据预处理

这里我们采用某新闻语料,训练样本格式为每行:标题\t正文,作为一条样本。

  • 将句子转换成ID序列
def sent2id(sent, vocab, max_size=30):
    sent = [vocab[c] for c in sent if c in vocab]
    sent = sent[:max_size] + 
  • 16
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是一个使用Microsoft Research Paraphrase Corpus DSSM模型进行语义匹配的代码示例: ``` import tensorflow as tf import numpy as np # 加载训练好的DSSM模型 model = tf.keras.models.load_model('msrp_dssm.h5') # 定义两个文本输入 text_a_input = tf.keras.Input(shape=(None,), dtype=tf.int32, name='text_a_input') text_b_input = tf.keras.Input(shape=(None,), dtype=tf.int32, name='text_b_input') # 将文本转换为词向量 embedding_layer = model.layers[0] text_a_embedding = embedding_layer(text_a_input) text_b_embedding = embedding_layer(text_b_input) # 计算两个文本的余弦相似度 similarity_layer = model.layers[1] similarity = similarity_layer([text_a_embedding, text_b_embedding]) # 创建模型 msrp_dssm = tf.keras.Model(inputs=[text_a_input, text_b_input], outputs=similarity) # 测试样例 text_a = 'The company is doing well.' text_b = 'The business is doing great.' text_a_tokens = [token for token in text_a.split()] text_b_tokens = [token for token in text_b.split()] # 将文本转换为词向量序列 text_a_sequence = np.array([embedding_layer.get_config()['input_dim'] + 1] + [embedding_layer.get_config()['word_index'][token] for token in text_a_tokens]) text_b_sequence = np.array([embedding_layer.get_config()['input_dim'] + 1] + [embedding_layer.get_config()['word_index'][token] for token in text_b_tokens]) # 对文本进行padding操作 max_sequence_length = max(len(text_a_sequence), len(text_b_sequence)) text_a_sequence = np.pad(text_a_sequence, (0, max_sequence_length - len(text_a_sequence)), 'constant') text_b_sequence = np.pad(text_b_sequence, (0, max_sequence_length - len(text_b_sequence)), 'constant') # 预测两个文本的相似度 similarity_score = msrp_dssm.predict([np.array([text_a_sequence]), np.array([text_b_sequence])])[0][0] print('文本A:', text_a) print('文本B:', text_b) print('相似度得分:', similarity_score) ``` 这个代码示例包含以下步骤: 1. 加载训练好的DSSM模型。 2. 定义两个文本输入。 3. 将文本转换为词向量。 4. 计算两个文本的余弦相似度。 5. 创建模型。 6. 测试样例。 7. 将文本转换为词向量序列。 8. 对文本进行padding操作。 9. 预测两个文本的相似度。 10. 输出相似度得分。 你可以将上述代码示例保存为.py文件,然后使用Python解释器运行它。当你运行代码时,它将输出相似度得分,表示两个文本的语义相似度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值