AI Challenger 2018:细粒度用户评论情感分类冠军 - 程惠阁

关注了一些 ai 相关的。原文查看机器之心:https://www.jiqizhixin.com/articles/2019-01-28-16

2018年8月-12月,由美团点评、创新工场、搜狗、美图联合主办的“AI Challenger 2018全球AI挑战赛”历经三个多月的激烈角逐,冠军团队从来自全球81个国家、1000多所大学和公司的过万支参赛团队中脱颖而出。其中“后厂村静静”团队-由毕业于北京大学的程惠阁(现已入职美团点评)单人组队,勇夺“细粒度用户评论情感分类”赛道的冠军。本文系程惠阁对于本次参赛的思路总结和经验分享,希望对大家能够有所帮助和启发。

img

背景

在2018全球AI挑战赛中,美团点评主要负责了其中两个颇具挑战的主赛道赛题:细粒度用户评论情感分析和无人驾驶视觉感知。其中NLP中心负责的细粒度用户评论情感分析赛道,最受欢迎,参赛队伍报名数量最多,约占整个报名团队的五分之一。

细粒度用户评论情感分析赛道提供了6大类、20个细分类的中文情感评论数据,标注规模难度之大,在NLP语料特别是文本分类相关语料中都属于相当罕见,这份数据有着极其重要的科研学术以及工业应用价值(目前在大众点评App已经可以看到20个类别的情感标签了)。

1. 工具介绍

在本次比赛中,采用了自己开发的一个训练框架,来统一处理TensorFlow和PyTorch的模型。在模型代码应用方面,主要基于香港科技大学开源的RNetMnemonicReader做了相应修改。在比赛后期,还加入了一个基于BERT的模型,从而提升了一些集成的效果。

2. 整体思路

整体将该问题看作20个Aspect的情感多分类问题,采用了传统的文本分类方法,基于LSTM建模文本,End2End多Aspect统一训练。

文本分类是业界一个较为成熟的问题,在2018年2月份,我参加了Kaggle的“作弊文本分类”比赛,当时的冠军团队主要依靠基于翻译的数据增强方法获得了成功。2018年反作弊工作中的一些实践经验,让我意识到,数据是提升文本分类效果的第一关键。因此,我第一时间在网络上寻找到了较大规模的大众点评评论语料,在Kaggle比赛的时候,NLP的语言模型预训练还没有出现,而随着ELMo之类模型的成功,也很期待尝试一下预训练语言模型在这个数据集合上的整体效果。


kubernetes 的编译、打包和发布(v1.10)

这是一篇 kubernetes 编译的简单备忘,以1.10.11为例。

编译主要参考文档为官方文档:https://github.com/kubernetes/kubernetes/blob/master/build/README.md

下载源码

下载v1.10.11源码

git clone -b v1.10.11 https://github.com/kubernetes/kubernetes.git
cd kubernetes

# 或者自由切换到其它分支
git branch
git tag | grep v1.10
git checkout v1.10.11

源码有100多万文件、将近700M,下载比较慢,需要一些耐心。

1571366044132

修改源码

这一块就各显神通了。

运行编译环境

使用容器运行一个编译环境,将代码文件映射到目的文件夹

docker run -it --rm -v $(pwd):/usr/lib/go/src/k8s.io/kubernetes kelvinblood/go-kube-build:v1.11 sh

单模块编译

以kubeadm为例,进入cmd文件夹进行编译即可。

cd /usr/lib/go/src/k8s.io/kubernetes/cmd/kubeadm
go build 

参考资料


使用容器编译 golang 项目

一直推崇开发环境容器化,对于我这种多台电脑同时办公的开发者是十分必要的。最近换了一台工作机器,想起按照原来的方式再走一遍环境配置,不禁恼火。于是还是搞起了容器化编译。下面记录一下过程。

启动环境

编辑 boot.sh 脚本,运行 golang 容器。

#!/usr/bin/env bash

docker run -d -t --name=go --net=host -v /root/golang/go:/go -v /root/golang/code:/code --privileged docker.io/golang bash

其中我把go的依赖文件映射到本地 /root/golang/go,代码仓库映射到 /root/golang/code。至于为什么直接使用host的网络,还是为了编译测试的方便。

进入容器

编辑 exec.sh 脚本,方便进入容器里

docker exec -it go /bin/bash

拉取依赖

这里以gin为例:

go get -u github.com/gin-gonic/gin

编译

以下面这个helloworld为例:

# gohello.go

package main

import (
"github.com/gin-gonic/gin"
"net/http"
)

func main(){
   router := gin.Default()
   router.GET("/", func(c *gin.Context) {
      c.String(http.StatusOK, "Hello World")
   })
   router.Run(":8000")
}

运行命令:

go build gohello.go

生成 gohello 文件。

运行这个文件,在浏览器中访问:

http://{ip}:8000/

可以看到浏览器中显示 hello world 字样。

另外,很多go项目对go的版本是有要求的,所以需要注意下运行的golang的版本号。