You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

深度学习在含多文本列的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 00:51:04