【问题标题】:How to set multiple sequences as features in KERAS如何在 KERAS 中将多个序列设置为特征
【发布时间】:2021-07-31 09:56:06
【问题描述】:

我想用 Keras 制作命名实体识别模型。 这些是我关注的链接:

https://valueml.com/named-entity-recognition-using-lstm-in-keras/ https://djajafer.medium.com/named-entity-recognition-and-classification-with-keras-4db04e22503d

数据如下所示:

                word label
0          Thousands     O
1                 of     O
2      demonstrators     O
3               have     O
4            marched     O
...              ...   ...
44187          there     O
44188   accidentally     O
44189             or     O
44190   deliberately     O
44191              .     O

他们使用单词到向量,因此他们正在索引单词和标签,因此X 是我的特征(单词的索引序列),y 是我的结果(标签的索引序列):

max_len = 30
X = [[word2idx[w[0]] for w in s] for s in list_of_sentances]
X = pad_sequences(maxlen=max_len, sequences=X, padding="post", value=num_words-1)

y = [[label2idx[w[1]] for w in s] for s in list_of_sentances]
y = pad_sequences(maxlen=max_len, sequences=y, padding="post", value=label2idx["O"])
y = [to_categorical(i, num_classes=num_labels) for i in y]

但是如果我有这样的数据集怎么办:

这里我有另一个专栏,那就是POS。如何将POS 列的值添加到我的功能? 所以基本上,我不只想要我的 X 中的 word 值,我还想要我的 X 中的 POS 值。*(或任何其他值) 如果我有多个列,例如:

word
POS
is_capital_letter
word_length

...

如何将所有这些列添加到我的功能中?

这是我的模型: X = np.array(X) y = np.array(y)

x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=1)

print("x_train shape", x_train.shape)
print("x_test shape", x_test.shape)
#x_train shape (750, 75)
#x_test shape (250, 75)


input_word = Input(shape=(max_len,))

model = Embedding(input_dim = vocab_len+1, output_dim = 75, input_length = max_len)(input_word)
model = SpatialDropout1D(0.25)(model)
model = Bidirectional(LSTM(units = 25, return_sequences=True, recurrent_dropout = 0.2))(model)
out = TimeDistributed(Dense(num_labels, activation = "softmax"))(model)

model = Model(input_word, out)

【问题讨论】:

    标签: python machine-learning keras nlp


    【解决方案1】:

    Keras 中的 LSTM 层需要 [samples, timesteps, features] 维度的输入。

    • 样本通常是独立的观察值。在你的情况下,我假设这些是句子。
    • 时间步是连续给模型的单独输入变量。这些应该是一个句子中的单词。
    • 特征是一个观察的单独度量,又名。一个词的特征。

    在创建 X 的行中,您对句子和单词进行交互并转换“单个”特征(word),假设 w 包含数据集中的一行([word, label])。

    假设您有多个特征作为数据集中的前 n 列(目标是最后一列,例如 [word, POS, is_capital_letter, word_length, ..., label ]) 并且您已经按照与数据集中相同的顺序在 transforms 中收集/定义了必要的“transform”字典,然后您可以生成输入和目标,如下所示:

    transforms = (word2idx, pos2idx, ...)
    
    X = [[[transforms[i][w[i]]] for i in range(n)] for w in s] for s in list_of_sentances]
    Y = [[label2idx[w[n]] for w in s] for s in list_of_sentances]
    

    当然,如果您有数字或其他类型的特征,那么您应该使用其他方法进行转换,而不是 word2idxpos2idx、... dicts,例如MinMaxScaling 用于字长等。

    Padding 也适用于新的 X 和 Y,但它使用相同的 扩展每个特征,以达到 ma​​x_len 的长度。根据每个特征的替代值是什么,这里很有可能应该使用精细填充。

    【讨论】:

    • 对不起,我没听懂你,能不能给我写一个更详细的解释?
    • 我已经尝试过您的解决方案,但是当我想训练我的模型时出现错误:ValueError: Error when checks input: expected input_4 to have 2 dimensions, but got array with shape (750, 75 , 1, 1)
    猜你喜欢
    • 1970-01-01
    • 2021-12-12
    • 2019-07-31
    • 1970-01-01
    • 1970-01-01
    • 2020-07-03
    • 2019-06-13
    • 2019-01-14
    • 1970-01-01
    相关资源
    最近更新 更多