热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

WSDm问题语义匹配分类算法,SentenceEmbedding实现,自然语言处理

优化版后的网络架构图:参考文献:https:arxiv.orgpdf1808.08762.pdf实现代码(自己修改了一部分,

优化版后的网络架构图:


参考文献:

https://arxiv.org/pdf/1808.08762.pdf

 


实现代码(自己修改了一部分,性能更高):

# -*- coding: utf-8 -*-
"""
Created on Thu Nov 22 12:02:08 2018@author: Lenovo
"""import pandas as pd
from keras.layers import Subtract,Dense,Reshape,BatchNormalization,Lambda,Flatten,Dot,MaxPooling2D,AveragePooling2D,AveragePooling1D,Concatenate,MaxPooling1D,Conv2D,Conv1D,Embedding,CuDNNLSTM,Input,Activation,Multiply,Bidirectional,Dropout
from keras.models import Model,Sequential
from keras.optimizers import SGD,Adam
from keras.callbacks import ModelCheckpoint,EarlyStopping
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences
from keras.utils.np_utils import to_categorical
import numpy as np
from data_process import get_data
from keras.utils import plot_model
import matplotlib.pyplot as plt
import keras.backend as K
import tensorflow as tfdef adbsub(x):x1,x2 = xreturn tf.abs(tf.subtract(x1,x2))def calc_01(x):x_1,x_2 = xreturn K.cast(K.equal(x_1,x_2),dtype='float32')def stack_dot_01(x):x_1,x_2 = xreturn K.stack(x,axis=-1)category = ["unrelated","agreed","disagreed"]
#train_x_1,train_x_2,label,vsize,test_x_1,test_x_2,test,train_jiao,test_jiao = get_data()x_1_input = Input(shape=([50]))
x_2_input = Input(shape=([50]))
x_jiao_in = Input(shape=([1]))embedder = Embedding(input_dim=vsize+1, output_dim=300)
x_1_in = embedder(x_1_input)
x_2_in = embedder(x_2_input)
#x_1 = Conv1D(32,3,strides=1,padding='same',activation='relu')(x_1)
#x_2 = Conv1D(32,3,strides=1,padding='same',activation='relu')(x_2)
##x_1 = BatchNormalization()(x_1)
##x_2 = BatchNormalization()(x_2)
###做这个池化 有可能会导致信息失真
#x_1 = MaxPooling1D(pool_size=3,strides=2)(x_1)
#x_2 = MaxPooling1D(pool_size=3,strides=2)(x_2)
#
bilstm_1 = Bidirectional(CuDNNLSTM(units=150,return_sequences=True,return_state=True))
lstm11 = bilstm_1(x_1_in)
x_1_b_m_1 = MaxPooling1D()(lstm11[0])
lstm12 = bilstm_1(x_2_in)
x_2_b_m_1 = MaxPooling1D()(lstm12[0])
#
bilstm_2 = Bidirectional(CuDNNLSTM(units=150,return_sequences=True,return_state=True))
lstm21 = bilstm_2(Multiply()([x_1_in,lstm11[0]]))
x_1_b_m_2 = MaxPooling1D()(lstm11[0])
lstm22 = bilstm_2(Multiply()([x_2_in,lstm12[0]]))
x_2_b_m_2 = MaxPooling1D()(lstm12[0])#
bilstm_3 = Bidirectional(CuDNNLSTM(units=150,return_sequences=True,return_state=True))
lstm31 = bilstm_3(Multiply()([x_1_in,lstm21[0]]))
x_1_b_m_3 = MaxPooling1D()(lstm31[0])
lstm32 = bilstm_3(Multiply()([x_2_in,lstm22[0]]))
x_2_b_m_3 = MaxPooling1D()(lstm32[0])x_Concatenate = Concatenate()([x_1_b_m_1,x_2_b_m_1])
x_Subtract = Lambda(adbsub)([x_1_b_m_2,x_2_b_m_2])
x_Multiply = Multiply()([x_1_b_m_3,x_2_b_m_3])
x_m_1 = Concatenate()([x_Concatenate,x_Subtract,x_Multiply])#x_m_2 = Concatenate()([x_2_b_m_1,x_2_b_m_2,x_2_b_m_3])#x_1 = BatchNormalization()(x_1)
#x_2 = BatchNormalization()(x_2)
##
#bilistm_merge = Multiply()([x_1,x_2])
#b_out = Bidirectional(CuDNNLSTM(units=128))(bilistm_merge)
#b_jiao = Bidirectional(CuDNNLSTM(units=128))(bilistm_merge)
#b_out = BatchNormalization()(b_out)
#
#bilstm_2 = Bidirectional(CuDNNLSTM(units=50))
#x_1 = bilstm_2(x_1)
#x_2 = bilstm_2(x_2)
#x_1 = BatchNormalization()(x_1)
#x_2 = BatchNormalization()(x_2)
#
#x_2c = Concatenate(axis=-1)([x_1,x_2])
#x_2c = BatchNormalization()(x_2c)
##
#x_2c = Reshape((2,100,1))(x_2c)
#x_2c = Conv2D(2,kernel_size=(2,3),strides=(1,1),padding='same',activation='relu')(x_2c)
#x_2c = BatchNormalization()(x_2c)
#x_2c = Conv2D(2,kernel_size=(2,3),strides=(1,1),padding='same',activation='relu')(x_2c)
#x_2c = BatchNormalization()(x_2c)
#
#x_2c = AveragePooling2D((2,2),(1,1))(x_2c)
#x_2c = Flatten()(x_2c)
#x_2c = Dense(256,activation='relu')(x_2c)
#print(x_2c.shape)
#x_1 = Reshape((1,100))(x_1)
#x_2 = Reshape((100,1))(x_2)
#x_01 = Lambda(calc_01)([x_1,x_2])
#x_dot = Multiply()([x_1,x_2])
#
#x_dot = Reshape((200,200,1))(x_dot)
#x_01 = Reshape((200,200,1))(x_01)
#
#x = Lambda(stack_dot_01)([x_dot,x_01])
#print(x.shape)
#x = Conv2D(16,kernel_size=(3,3),strides=(1,1),padding='same',activation='relu')(x)
#x = Conv2D(16,kernel_size=(3,3),strides=(1,1),padding='same',activation='relu')(x)
##x = BatchNormalization()(x)
#x = MaxPooling2D((2,2),(2,2))(x)
##
#x = Conv2D(32,kernel_size=(3,3),strides=(1,1),padding='same',activation='relu')(x)
#x = Conv2D(32,kernel_size=(3,3),strides=(1,1),padding='same',activation='relu')(x)
##x = BatchNormalization()(x)
#x = MaxPooling2D((2,2),(2,2))(x)
##
#x = Conv2D(32,kernel_size=(3,3),strides=(1,1),padding='same',activation='relu')(x)
#x = Conv2D(32,kernel_size=(3,3),strides=(1,1),padding='same',activation='relu')(x)
##x = BatchNormalization()(x)
##x = AveragePooling2D((2,2),(2,2))(x)
##x = Conv2D(64,kernel_size=(3,3),strides=(1,1),padding='same',activation='relu')(x)
##x = Conv2D(64,kernel_size=(3,3),strides=(1,1),padding='same',activation='relu')(x)
##x = BatchNormalization()(x)
#x = MaxPooling2D((2,2),(2,2))(x)
##
#
x = Flatten()(x_m_1)
x = Dropout(0.5)(x)
##x = BatchNormalization()(x)
##x = Multiply()([x_1,x_2])
##x = Activation('relu')(x)
x = Dense(256,activation='relu')(x)
#x_jiao_in_1 = Dense(5)(x_jiao_in)
#x_jiao_in_1 = Dense(1)(x_jiao_in)
x = Concatenate(axis=1)([x,x_jiao_in])#x = BatchNormalization()(x)
#x = Concatenate(axis=-1)([x,b_out])
#x = Conv2D(32,kernel_size=(3,3),strides=(1,1),padding='same',activation='relu')(x)
#x = Conv2D(32,kernel_size=(3,3),strides=(1,1),padding='same',activation='relu')(x)
#x = MaxPooling2D((2,2),(2,2))(x)
#x = Reshape((3,256,1))(x)
#x = Conv2D(3,kernel_size=(3,256),strides=(1,1),padding='valid',activation='relu')(x)
##x = BatchNormalization()(x)
#x = Conv2D(3,kernel_size=(3,256),strides=(1,1),padding='same',activation='softmax')(x)
##x = BatchNormalization()(x)
#out = Reshape(([3]))(x)
#x = Flatten()(x)#x = Dropout(0.2)(x)print('朴实无华网络__很猛')
#x = Concatenate(axis=-1)([x_1,x_2])
#x = Flatten()(x)x = Dropout(0.2)(x)out = Dense(3,activation='softmax')(x)model = Model([x_1_input,x_2_input,x_jiao_in],[out])model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['acc'])
model.summary()
plot_model(model,'model.png')
mcp = ModelCheckpoint('wsdm_duoronghe_jiyuci_best.h5',save_best_only=True,monitor='val_acc',verbose=1)
es = EarlyStopping(patience=5,monitor='loss',verbose=1)
cl = [mcp,es]
history = model.fit(x=[train_x_1,train_x_2,train_jiao],y=label,class_weight={0:1,1:5,2:10},batch_size=256,epochs=100,verbose=1,callbacks=cl,validation_split=0.1,shuffle=True)x=history.epoch
y=history.history['acc']
plt.plot(x,y,label="acc")y=history.history['loss']
plt.plot(x,y,label="loss")y=history.history['val_acc']
plt.plot(x,y,label="val_acc")y=history.history['val_loss']
plt.plot(x,y,label="val_loss")result = model.predict(x=[test_x_1,test_x_2])a= np.argmax(result,axis=1)result = pd.DataFrame()
result['Id']=test.id.values
result['Category']=[category[i] for i in a]result.to_csv('submit.csv',index_label=None)

总体架构图:


sentence embedding架构图:


训练呈现:


推荐阅读
  • 自然语言处理(NLP)——LDA模型:对电商购物评论进行情感分析
    目录一、2020数学建模美赛C题简介需求评价内容提供数据二、解题思路三、LDA简介四、代码实现1.数据预处理1.1剔除无用信息1.1.1剔除掉不需要的列1.1.2找出无效评论并剔除 ... [详细]
  • 利用决策树预测NBA比赛胜负的Python数据挖掘实践
    本文通过使用2013-14赛季NBA赛程与结果数据集以及2013年NBA排名数据,结合《Python数据挖掘入门与实践》一书中的方法,展示如何应用决策树算法进行比赛胜负预测。我们将详细讲解数据预处理、特征工程及模型评估等关键步骤。 ... [详细]
  • 吴恩达推出TensorFlow实践课程,Python基础即可入门,四个月掌握核心技能
    量子位报道,deeplearning.ai最新发布了TensorFlow实践课程,适合希望使用TensorFlow开发AI应用的学习者。该课程涵盖机器学习模型构建、图像识别、自然语言处理及时间序列预测等多个方面。 ... [详细]
  • 本文探讨了图像标签的多种分类场景及其在以图搜图技术中的应用,涵盖了从基础理论到实际项目实施的全面解析。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 本文详细介绍了福昕软件公司开发的Foxit PDF SDK ActiveX控件(版本5.20),并提供了关于其在64位Windows 7系统和Visual Studio 2013环境下的使用方法。该控件文件名为FoxitPDFSDKActiveX520_Std_x64.ocx,适用于集成PDF功能到应用程序中。 ... [详细]
  • Coursera ML 机器学习
    2019独角兽企业重金招聘Python工程师标准线性回归算法计算过程CostFunction梯度下降算法多变量回归![选择特征](https:static.oschina.n ... [详细]
  • 程序员如何优雅应对35岁职业转型?这里有深度解析
    本文探讨了程序员在职业生涯中如何通过不断学习和技能提升,优雅地应对35岁左右的职业转型挑战。我们将深入分析当前热门技术趋势,并提供实用的学习路径。 ... [详细]
  • 随着 ChatGPT 在全球范围内的火热,众多开发者希望利用这一先进技术。然而,由于 OpenAI 官方网站注册流程复杂及支付条件限制,使得国内开发者难以便捷地接入这项技术。为了解决这个问题,APISpace 提供了一种简便的方式,让国内开发者可以轻松体验并使用 ChatGPT。 ... [详细]
  • 本文介绍了如何利用snownlp库对微博内容进行情感分析,包括安装、基本使用以及如何自定义训练模型以提高分析准确性。 ... [详细]
  • 独家解析:深度学习泛化理论的破解之道与应用前景
    本文深入探讨了深度学习泛化理论的关键问题,通过分析现有研究和实践经验,揭示了泛化性能背后的核心机制。文章详细解析了泛化能力的影响因素,并提出了改进模型泛化性能的有效策略。此外,还展望了这些理论在实际应用中的广阔前景,为未来的研究和开发提供了宝贵的参考。 ... [详细]
  • 点互信息在自然语言处理中的应用与优化
    点互信息(Pointwise Mutual Information, PMI)是一种用于评估两个事件之间关联强度的统计量,在自然语言处理领域具有广泛应用。本文探讨了 PMI 在词共现分析、语义关系提取和情感分析等任务中的具体应用,并提出了几种优化方法,以提高其在大规模数据集上的计算效率和准确性。通过实验验证,这些优化策略显著提升了模型的性能。 ... [详细]
  • AI TIME联合2021世界人工智能大会,共探图神经网络与认知智能前沿话题
    AI TIME携手2021世界人工智能大会,共同探讨图神经网络与认知智能的最新进展。自2018年在上海首次举办以来,WAIC已成为全球AI领域的年度盛会,吸引了众多专家学者和行业领袖参与。本次大会将聚焦图神经网络在复杂系统建模、知识图谱构建及认知智能应用等方面的技术突破和未来趋势。 ... [详细]
author-avatar
zsx2502853407
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有