文本多标签分类工具 Magpie v2.0 简单使用

原文转载自 「Neo Fung's Blog」 (https://www.neofung.org/2018/01/04/文本多标签分类工具-Magpie-v2-0-简单使用/)

预计阅读时间 0 分钟(共 0 个字, 0 张图片, 0 个链接)

简述

magpie 是一个由CERN(欧洲核子研究中心)用keras实现的文本多标签分类工具。
主要是用于对高能物理的论文摘要标定主题和抽取keyword。
项目简洁而不失可阅读性,推荐各个研究keras的同学可以学习一下。

项目地址

magpie

依赖

因为需要用到tensorflow,所以推荐自己编译tensorflow,针对自己的cpu和gpu编译能够提升性能。
自己用的tensorflow是r1.5版,r1.4有些问题。

简单的使用

1
2
3
4
5
6
>>> magpie = Magpie()
>>> magpie.init_word_vectors('/path/to/corpus', vec_dim=100)
>>> magpie.train('/path/to/corpus', ['label1', 'label2', 'label3'], epochs=3)
Training...
>>> magpie.predict_from_text('Well, that was quick!')
[('label1', 0.96), ('label3', 0.65), ('label2', 0.21)]

这里有人觉得 train函数很蠢,还要自己输入labels。
其实,看 magpie/nn/input_data.py 中的 get_data_for_model 和 build_x_and_y 函数,这是用于构建label的矩阵。

一些设置

有些设置,是在 magpie/config.py 中修改的,主要是word2vec的设置,和 SAMPLE_LENGTH 。
这里特别说一下 SAMPLE_LENGTH, 这个设置指的是每篇文章,抽取前面 SAMPLE_LENGTH 个tokens,所以大家按需修改,再重新安装magpie吧。

模型

查看源代码,在 magpie/nn/models.py 中是所用到的模型,现在模型只有cnn和rnn。
cnn和rnn的模型都挺容易看懂的。
如果有需要,自己也可以添加自己的模型。

这里有个提醒,因为是多分类问题,所以两个模型的最后一层,activation都是 sigmoid, 而loss 都是binary_crossentropy 。
这和单分类问题不一样。
How does Keras handle multilabel classification?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
def cnn(embedding_size, output_length):
""" Create and return a keras model of a CNN """

NB_FILTER = 256
NGRAM_LENGTHS = [1, 2, 3, 4, 5]

conv_layers, inputs = [], []

for ngram_length in NGRAM_LENGTHS:
current_input = Input(shape=(SAMPLE_LENGTH, embedding_size))
inputs.append(current_input)

convolution = Conv1D(
NB_FILTER,
ngram_length,
kernel_initializer='lecun_uniform',
activation='tanh',
)(current_input)

pool_size = SAMPLE_LENGTH - ngram_length + 1
pooling = MaxPooling1D(pool_size=pool_size)(convolution)
conv_layers.append(pooling)

merged = Concatenate()(conv_layers)
dropout = Dropout(0.5)(merged)
flattened = Flatten()(dropout)
outputs = Dense(output_length, activation='sigmoid')(flattened)

model = Model(inputs=inputs, outputs=outputs)

model.compile(
loss='binary_crossentropy',
optimizer='adam',
metrics=['top_k_categorical_accuracy'],
)

return model


def rnn(embedding_size, output_length):
""" Create and return a keras model of a RNN """
HIDDEN_LAYER_SIZE = 256

inputs = Input(shape=(SAMPLE_LENGTH, embedding_size))

gru = GRU(
HIDDEN_LAYER_SIZE,
input_shape=(SAMPLE_LENGTH, embedding_size),
kernel_initializer="glorot_uniform",
recurrent_initializer='normal',
activation='relu',
)(inputs)

batch_normalization = BatchNormalization()(gru)
dropout = Dropout(0.1)(batch_normalization)
outputs = Dense(output_length, activation='sigmoid')(dropout)

model = Model(inputs=inputs, outputs=outputs)

model.compile(
loss='binary_crossentropy',
optimizer='adam',
metrics=['top_k_categorical_accuracy'],
)

return model
more_vert