我目前正在使用一个数据集,其中每行包含两件事:
- 文本
- 相关标签
两人都是荷兰人。
我正在尝试构建一个模型,该模型允许我根据从数据集中学到的内容为新文本分配标签。
我认为我遇到的问题是数据集本身非常小(大约 2000 条消息),但标签的分布也很不均匀。
例如,最常用的标签出现了 121 次,但大约有 40 个标签在不同的文章中只出现了 5 次。
我试图通过使用荷兰语词向量来解决数据量问题,并将它们用于嵌入层。这允许为最终模型提供更多上下文。
标签问题我还没有解决方案。我认为我应该制作一个自定义损失函数,让标签出现频率更高的文本在有效时权重更小,而出现更少的标签得分更高。但我不知道如何开始。如果你能帮助我,谢谢!
我的模型如下所示:
MAX_SEQUENCE_LENGTH = 100
EMBEDDING_DIM = 300
embedding_layer = Embedding(num_words,
EMBEDDING_DIM,
weights=[embedding_matrix],
input_length=MAX_SEQUENCE_LENGTH,
trainable=False)
sequence_input = Input(shape=(MAX_SEQUENCE_LENGTH,), dtype='int32')
embedded_sequences = embedding_layer(sequence_input)
x = Dropout(0.1)(embedded_sequences)
x = Conv1D(128, 5, activation='relu')(x)
x = MaxPooling1D(5)(x)
x = Conv1D(128, 5, activation='relu')(x)
x = MaxPooling1D(5)(x)
x = Flatten()(x)
x = Dense(128, activation='relu')(x)
preds = Dense(len(labels_index), activation='sigmoid')(x)
model = Model(sequence_input, preds)
model.compile(loss='binary_crossentropy',
optimizer='adam',
metrics=['accuracy'])
数据输入是一个填充序列,因为输入和输出是与输入相关的标签的二进制列表(使用 MultiLabelBinarizer 制作)。