深度学习在含多文本列的NLP结构化数据上的LSTM实现方法
你当前分词代码的最后一行存在语法错误,tokenizer(x).['input_ids']多了一个多余的英文句号,修正为tokenizer(x)['input_ids']即可正常运行。
针对多列文本适配LSTM的需求,有两种成熟实现方案:
方案1:多输入分支LSTM(效果更优)
你的数据包含argument、topic、key_point三个独立文本列,以及两个分类ID列,可以用Keras函数式API搭建多输入模型,每类特征单独处理后再融合,步骤如下:
步骤1:序列统一长度
分词后的输入ID长度不一致,需要做填充/截断统一长度:
from tensorflow.keras.preprocessing.sequence import pad_sequences from tensorflow.keras import layers, Model # 自定义序列最大长度,可根据实际文本长度调整 MAX_SEQ_LEN = 64 # 三个文本列分别做填充 arg_seq = pad_sequences(train_df['argument'].tolist(), maxlen=MAX_SEQ_LEN, padding='post', truncating='post') topic_seq = pad_sequences(train_df['topic'].tolist(), maxlen=MAX_SEQ_LEN, padding='post', truncating='post') kp_seq = pad_sequences(train_df['key_point'].tolist(), maxlen=MAX_SEQ_LEN, padding='post', truncating='post') # 分类ID转数值编码 arg_id_arr = train_df['arg_id'].cat.codes.values.reshape(-1, 1) kp_id_arr = train_df['key_point_id'].cat.codes.values.reshape(-1, 1)
步骤2:搭建多输入LSTM模型
# 输入层定义 input_arg = layers.Input(shape=(MAX_SEQ_LEN,), name='argument_input') input_topic = layers.Input(shape=(MAX_SEQ_LEN,), name='topic_input') input_kp = layers.Input(shape=(MAX_SEQ_LEN,), name='keypoint_input') input_arg_id = layers.Input(shape=(1,), name='arg_id_input') input_kp_id = layers.Input(shape=(1,), name='kp_id_input') # 共享文本Embedding层(RoBERTa词表大小为50265) text_emb = layers.Embedding(input_dim=50265, output_dim=128, mask_zero=True) # 三个文本分支分别过LSTM提取特征 arg_feat = layers.LSTM(64)(text_emb(input_arg)) topic_feat = layers.LSTM(32)(text_emb(input_topic)) kp_feat = layers.LSTM(32)(text_emb(input_kp)) # 分类ID特征提取 arg_id_feat = layers.Flatten()(layers.Embedding(train_df['arg_id'].nunique(), 8)(input_arg_id)) kp_id_feat = layers.Flatten()(layers.Embedding(train_df['key_point_id'].nunique(), 8)(input_kp_id)) # 特征融合 concat_feat = layers.Concatenate()([arg_feat, topic_feat, kp_feat, arg_id_feat, kp_id_feat]) # 输出层 dense = layers.Dense(64, activation='relu')(concat_feat) output = layers.Dense(1, activation='sigmoid')(dense) # 该匹配任务为二分类,用sigmoid激活 # 模型编译训练 model = Model(inputs=[input_arg, input_topic, input_kp, input_arg_id, input_kp_id], outputs=output) model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) model.fit( [arg_seq, topic_seq, kp_seq, arg_id_arr, kp_id_arr], trainY, epochs=10, batch_size=32, validation_split=0.2 )
方案2:文本拼接成单序列(实现更简单)
如果不想搭建多分支模型,可以直接把三个文本的分词结果按topic + [SEP] + argument + [SEP] + key_point的顺序拼接成一个长序列,统一填充后当做单文本输入普通的单输入LSTM即可,代码更简洁,但特征区分度不如多分支方案。
内容的提问来源于stack exchange,提问作者Ifan 767
相关产品推荐
相关产品推荐

