前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >中移集成首届OneCity编程大赛Baseline分享

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

作者头像
老肥码码码
发布2020-11-19 10:59:50
4960
发布2020-11-19 10:59:50
举报

机缘巧合在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方案

首先将训练集和测试集做读取和简单的预处理以及合并操作。

代码语言:javascript
复制
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词典。

代码语言:javascript
复制
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优化器进行五折交叉验证,取五折的平均值作为最后测试集的预测概率以保证模型的稳定性。

代码语言:javascript
复制
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」即可。

代码语言:javascript
复制
——END——

扫码二维码获取更多精彩老肥码码码
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-11-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法与数据之美 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档