中移集成首届OneCity编程大赛Baseline分享

共 2901字,需浏览 6分钟

 ·

2020-11-18 23:18

机缘巧合在DC竞赛上看到了这个比赛,这个编程比赛正是数据类算法比赛,主要是自然语言处理相关的文本多分类任务,老肥我从来没有学习过这NLP领域相关的知识,正好借这个比赛学习充电,在此分享一个简单的baseline方案,比赛地址文末阅读原文即可直达。


01

赛事介绍


本届OneCity编程大赛主题围绕智慧城市OneCity赋能智慧政务,实现政务数据管理更智慧化、智能化展开。政务数据智能算法包括分类与标签提取,根据政府表格文件标题与内容,按照一定的原则将杂乱无章的文件自动映射到具体的类目上,加速数据归档的智能化与高效化。本次比赛旨在通过抽取政务表格文件中的关键信息,来实现表格数据自动化分类的目标。
总的来说就是表格文件的文本分类的问题,赛事的评价指标为准确率,比赛奖励包含苹果电脑、华为手机等,目前共有500多人参赛。


02

比赛数据


次比赛的数据是从政府开放数据平台收集的真实数据,共有9万多个表格文件,包括xls、xlsx、csv三种格式,其中csv文件编码格式统一为utf-8。文件被分为三个部分,训练集、测试集1和测试集2。其中训练集(6万个文件,含标签)和测试集1(8000个文件,不含标签)于初赛阶段开放给选手下载,测试集2(不含标签)于复赛阶段开放给选手下载。
主办方给了许多温馨的提示,比如有些文件的内容为空,可能仅有标题,还有一些文件扩展名与文件格式不匹配,例如csv文件打开却是html的内容,基于以上两个注意点,在本次分享的方案内,我仅使用文件的标题作为训练数据而非表格内容。


03

Baseline方案


先将训练集和测试集做读取和简单的预处理以及合并操作。
train_df = pd.read_csv('answer_train.csv')
lb = LabelEncoder()
train_df['label'] = lb.fit_transform(train_df['label'])
test_df = pd.read_csv('submit_example_test1.csv')
test_df.drop('label', axis=1, inplace=True)
df = pd.concat([train_df, test_df], axis=0)
df['file'] = df['filename'].apply(lambda x: x.split('.')[0][6:].replace('_', ''))

接着用jieba分词,并将每个词进行编号处理,得到vocab词典。

cw = lambda x: list(jieba.cut(x))
df['words'] = df['file'].apply(cw)
tokenizer=Tokenizer()
tokenizer.fit_on_texts(df['words'])
vocab=tokenizer.word_index

把句子转换成词索引序列,并对部分序列进行补长,构造一个简单的多层卷积神经网络,使用embedding层将每个词编码转换成词向量,采取常规的交叉熵损失、adam优化器进行五折交叉验证,取五折的平均值作为最后测试集的预测概率以保证模型的稳定性。

oof = np.zeros(len(X_train))
predictions = np.zeros((len(X_test), 20))
KF = StratifiedKFold(n_splits=5, shuffle=True, random_state=2020)
for fold_, (trn_idx, val_idx) in enumerate(KF.split(X_train.values, y_train.values)):
print("fold n°{}".format(fold_))
print('trn_idx:',trn_idx)
print('val_idx:',val_idx)
X_tr = X_train.iloc[trn_idx]
X_val = X_train.iloc[val_idx]
X_train_word_ids = tokenizer.texts_to_sequences(X_tr)
X_valid_word_ids = tokenizer.texts_to_sequences(X_val)
X_test_word_ids = tokenizer.texts_to_sequences(X_test)
X_train_padded_seqs=pad_sequences(X_train_word_ids,maxlen=30)
X_valid_padded_seqs=pad_sequences(X_valid_word_ids,maxlen=30)
X_test_padded_seqs=pad_sequences(X_test_word_ids, maxlen=30)
y_tr = y_train.iloc[trn_idx]
y_tr = keras.utils.to_categorical(y_tr, num_classes=20)
y_val = y_train.iloc[val_idx]
y_val = keras.utils.to_categorical(y_val, num_classes=20)
model = NN()
model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])
model.fit(X_train_padded_seqs, y_tr, epochs=50, batch_size=1024, validation_data=(X_valid_padded_seqs, y_val), callbacks=[ES])
oof[val_idx] = model.predict_classes(X_valid_padded_seqs)
temp = model.predict_proba(X_test_padded_seqs)
predictions[:] += temp

最终该baseline方案可以获得超过0.96的线上分数。显然,改进的方案有很多,我们可以采用出色的文本分类模型来改进准确率,也可以通过使用表格文件的文本内容来增强模型的学习能力与泛化能力以提升准确率。

完整的代码我已经上传,在后台回复「baseline」即可。


——END——



扫码二维码

获取更多精彩

老肥码码码

浏览 36
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报