在清理文本后,我将文本转换为矩阵,并将对象数据类型转换为类别。
ids_list = ['arg_id','key_point_id']for cont in ids_list: train_df[cont] = train_df[cont].astype('category')
这里我使用了分词器。
from transformers import RobertaTokenizertokenizer = RobertaTokenizer.from_pretrained("roberta-base")train_df["argument"]=train_df["argument"].apply(lambda x:tokenizer(x)['input_ids'])train_df["topic"]=train_df["topic"].apply(lambda x:tokenizer(x)['input_ids'])train_df["key_point"]=train_df["key_point"].apply(lambda x:tokenizer(x)['input_ids'])
制作标记后的最终结果转换成trainX和trainY = label后。
我在这里迷失了 如何在这里实现LSTM?
我见过很多例子,大多数情况下它们只有一个列,另一个是目标列。所以我在这里对如何调整这些数据以适应LSTM感到困惑。
如果你想查看数据,这里是数据的链接: 数据链接
回答:
从你的问题中不清楚你将使用哪一列作为特征,哪一列作为目标。假设你想使用argument列来预测label,那么你应该将标记化的数据输入到LSTM模型中,并使用嵌入层。这里是一个使用pytorch的单特征列和单目标列的示例:
import torch as thimport torch.nn as nnvocab_size = tokenizer.vocab_sizeEMBED_DIM = 128 # 嵌入层将每个词转换为形状为[128, 1]的张量LSTM_HIDDEN_SIZE = 32class LSTMModelOneColOneTgt(nn.Module): def __init__(self): super().__init__() self.embedding = nn.Embedding(vocab_size, EMBED_DIM) self.lstm = nn.LSTM(EMBED_DIM, LSTM_HIDDEN_SIZE) ... def forward(self, x): x = self.embedding(x) x = self.lstm(x) ...
你可以将LSTM层的输出展平/池化,然后输入到你选择的密集层中来构建分类器。如果你想使用多个列作为特征,你可以将这些列合并为一个列并使用上述拓扑结构,或者为它们使用其他LSTM层。例如,要分别输入argument和topic列:
import torch as thimport torch.nn as nn
vocab_size = tokenizer.vocab_sizeEMBED_DIM = 128 # 对两个列输入使用相同的嵌入维度LSTM_HIDDEN_SIZE = 32 # 对两个列输入使用相同的隐藏大小class LSTMModelTwoColOneTgt(nn.Module): def __init__(self): super().__init__() self.embedding = nn.Embedding(vocab_size, EMBED_DIM) self.lstm_argument = nn.LSTM(EMBED_DIM, LSTM_HIDDEN_SIZE) self.lstm_topic = nn.LSTM(EMBED_DIM, LSTM_HIDDEN_SIZE) ... def forward(self, x_argument, x_topic): x_arg = self.embedding(x_arg) x_arg = self.lstm(x_arg) x_topic = self.embedding(x_topic) x_topic = self.lstm(x_topic) x = th.cat([x_arg, x_topic], dim=1) ...