AI研习社最近举办了一个比赛——微博立场检测,实际上就是一个NLP文本分类的比赛

Baseline—FastText

我的Baseline方法用的是pkuseg分词+FastText,最好成绩是60,下面是我几次提交的得分截图

Load Data & Preprocess

先import之后要用到的库

import pkuseg
import random
import pandas as pd
import fasttext
df = pd.read_csv('train.csv', delimiter='\t')

官方给的数据,虽然是csv文件,但是字段之间用的是\t隔开的,所以读取的时候注意一下就行了。数据样式如下



stance字段有三类,分别是FAVORAGAINSTNONE,这也是你需要最终预测的值。但是通过仔细分析数据可以发现,stance字段除了上面三个值以外还有别的值,所以要先把其它的数据剔除掉

drop_list = []
for i in range(len(df)):
if df.stance[i] != 'FAVOR' and df.stance[i] != 'AGAINST' and df.stance[i] != 'NONE':
drop_list.append(i)
df.drop(drop_list, inplace=True)

FastText读取的数据应该满足__lable__xx text,例如

__label__A 我 喜欢 打 篮球
__label__B 我 喜欢 鲲鲲
__label__A 我 喜欢 踢 足球

也就是说,每一行表示一个样本,并且标签在前,文本在后,两者之间用空格隔开。标签必须以__label__开头。所以我们要先把原始数据的标签进行一个转换,即FAVOR变成__label__AAGAINST变成__label__BNONE变成__label__C

mapping = {'FAVOR':'__label__A', 'AGAINST':'__label__B', 'NONE':'__label__C'}
df['stance'] = df['stance'].map(mapping)

这些都做完以后最好shuffle一下数据

df = df.sample(frac=1)

sample(frac=p)其中\(p\in[0,1]\),意思是随机sample出原始数据的百分之多少,如果\(p=1\),则表示随机sample出原始数据的全部,并且由于是随机sample的,所以原始数据的顺序就被打乱了

Split Train & Validation Data

这里我以7:3的比例将数据集拆分成Train Data和Valid Data

train_len = int(len(df) * 0.7)
df_train = df.loc[:train_len]
df_val = df.loc[train_len:]

Word Segmentation

从FastText读取数据的样式可以看出,我们需要对一句话进行分词。这里我用的是pkuseg,因为我看它官方API介绍的时候,里面提到它有一个web语料库

在分词前,我先从网上找了一些常见的中英文停用词

stopwords = []
for line in open('stopwords.txt', encoding='utf-8'):
stopwords.append(line) stopwords.append('\n')
stopwords = set(stopwords)

停用词表我就不提供了,网上有很多,自己下载即可

然后是一行一行读取数据并分词,分完词再过滤。这些都做完以后,按照FastText要求的格式,拼接字符串,保存到文件中

def dump_file(df, filename, mode='train'):
seg = pkuseg.pkuseg(model_name='web')
with open(filename, 'w',encoding='utf-8') as f:
for i in df.index.values:
segs = seg.cut(df.text[i])
segs = filter(lambda x:x not in stopwords, segs) #去掉停用词
# segs = filter(lambda x:len(x)>1,segs)
segs = filter(lambda x:x.startswith('http')==False, segs)
segs = filter(lambda x:x.startswith('.')==False, segs)
segs = filter(lambda x:x.startswith('-')==False, segs)
segs = filter(lambda x:x.startswith(',')==False, segs)
segs = filter(lambda x:x.startswith('。')==False, segs)
segs = filter(lambda x:x.startswith('…')==False, segs)
segs = filter(lambda x:x.startswith('/')==False, segs)
segs = filter(lambda x:x.startswith('—')==False, segs)
segs = filter(lambda x:x.startswith('、')==False, segs)
segs = filter(lambda x:x.startswith(':')==False, segs)
segs = filter(lambda x:x.startswith('~')==False, segs)
segs = filter(lambda x:x.startswith('[')==False, segs)
segs = filter(lambda x:x.startswith(']')==False, segs)
segs = filter(lambda x:(x.isalpha() and len(x) == 7) == False, segs)
string = ''
for j in segs:
string = string + ' ' + j
if mode == 'test':
string = string.lstrip()
else:
string = df.stance[i] + ' ' + string
string = string.lstrip()
f.write(string + '\n')
dump_file(df_train, 'train.txt', 'train')
dump_file(df_val, 'val.txt', 'train')

FastText

首先从它官方的github仓库中clone dev版本(直接使用pip install fasttext是稳定版)

$ git clone https://github.com/facebookresearch/fastText.git
$ cd fastText
$ pip install .

因为最新的dev版本中有一个参数autotuneValidationFile可以在训练过程中自动搜索使得acc最大的参数。fastText使用也很简单

clf = fasttext.train_supervised(input='train.txt', autotuneValidationFile='val.txt')

指定训练集以及用于帮助寻找最优参数的测试集的路径即可。如果要保存模型就用

clf.save_model('fasttext_model')

Predict & Submit

基本上如果你按照我的方法一路做下来,到现在为止在验证集上的最大分数也就60左右

然后就是对test集进行预测,预测完了提交就行了

test = pd.read_csv('test.csv', delimiter='\t')
dump_file(test, 'test.txt', 'test') labels = []
for line in open('test.txt', encoding='utf-8'):
if line != '':
line = line.strip('\n')
labels.append(clf.predict(line)[0][0]) test['idx'] = range(len(test))
test['stance'] = labels
mapping = {'__label__A':'FAVOR','__label__B':'AGAINST','__label__C':'NONE'}
test['stance'] = test['stance'].map(mapping)
test = test.drop(['target', 'text'], axis=1) test.to_csv('test_pred.csv',index=False,header=False)

Improve

  1. 我的做法只用了textstance这两列,target我觉得可以用也可以不用
  2. 仔细观察数据集会发现,其实样本分布及其不均匀,stance列中FAVORAGAINST两个值特别多,NONE特别少,这就涉及到不均衡样本的训练问题,可以通过sample,将它们的比例设置的比较均衡了再训练
  3. 过滤词设置的更详细一点。如果你仔细查看了分词后的数据集,你应该能发现里面其实还有很多垃圾词,比方说网址、7位验证码、表情之类的
  4. 直接上BERT

微博立场检测 60分Baseline的更多相关文章

  1. 读“40 分,60 分,90 分”

    原文链接: http://mp.weixin.qq.com/s?__biz=MzA5MjYyNzY1OQ==&mid=2650901947&idx=1&sn=89af64d3b ...

  2. 湖人VS爵士!!科比4月14日最后一战,本赛季最高得分!狂得60分!!完美大逆转!!!

    莫愁前路无知己,天下谁人不识君.科比,愿你如迈克尔·乔丹,仍然活跃在篮球界.退役不是结束,而是另一段人生的开始. 北京时间2016年4月14日,湖人101-96击败爵士,科比-布莱恩特告别战,20年职 ...

  3. 洛谷 P1038 神经网络 Label:拓扑排序 && 坑 60分待查

    题目背景 人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷款风险评估等诸多领域有广泛的应用.对神经网络的研究一直是当今 ...

  4. P1967 货车运输 -60分

    打了一个最大生成树+dfs,60分成功tle #include <bits/stdc++.h> using namespace std; const int maxn = 10005; c ...

  5. 利用条件运算符的嵌套来完成此题:学习成绩> =90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。

    利用条件运算符的嵌套来完成此题:学习成绩> =90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示. import java.util.Scanner; public clas ...

  6. 获取数值型数组中大于60的元素个数,给数值型数组中不足60分的加20分。(数组,for循环,if条件判断语句)

    package com.Summer_0420.cn; /** * @author Summer * 获取数值型数组中大于60的元素个数 * 给数值型数组中不足60分的加20分 */ public c ...

  7. 根据考试成绩输出对应的礼物,90分以上爸爸给买电脑,80分以上爸爸给买手机, 60分以上爸爸请吃一顿大餐,60分以下爸爸给买学习资料。 要求:该题使用多重if完成

    package com.Summer_0417.cn; import java.util.Scanner; /** * @author Summer * 根据考试成绩输出对应的礼物, * 90分以上爸 ...

  8. NOIP2012国王游戏(60分题解)

    题目描述 恰逢 H国国庆,国王邀请n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排,国王站在队伍的最前面 ...

  9. 学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用利用条件运算符的嵌套来完成此题:C表示。

    # -*- coding: utf8 -*- # Author:wxq #python 2.7 #题目:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用利用条件运算符 ...

随机推荐

  1. 转载-Apache和Nginx运行原理解析

    本文只作为了解Apache和Nginx知识的一个梳理,想详细了解的请阅读文末参考链接中的博文. Web服务器 Web服务器也称为WWW(WORLD WIDE WEB)服务器,主要功能是提供网上信息浏览 ...

  2. 羽翼sqlmap视频笔记

    access 注入 ./sqlmap.py -u "url"          注入判断./sqlmap.py -u "url" --tables  跑表./s ...

  3. Raspberrypi 装配笔记

    1 镜像烧制 2 基础配置 2.1 SSH 连接 2.2 修改管理员密码 2.3 Samba 3 功能配置 3.1 Homebridge 1 镜像烧制 从树莓派官网下载最新的 Raspbian 系统镜 ...

  4. hashMap插入初始值

    加了this. 就很容易看出来是使用了内部类和{}代码块 当然也可以把this去掉, 更简洁, 只是不能一眼看出来怎么初始化的 类似的可以做ArrayList ....的初始化

  5. 德国、日本的制造业为什么不能完全执行SOP?

    在过去几十年,德国.日本的制造企业简直就是"以质取胜"的代名词,一些制造业的CEO非常自豪,甚至在公开场合调侃:大家好,我就是"保质保量"本人,也正因如此,德国 ...

  6. 吴裕雄--天生自然KITTEN编程:移动与旋转

  7. 台式机安装CentOS7.6 Minimal ISO系统并增加图形化桌面

    需求:公司测试环境因业务原因,需要在台式电脑上安装带桌面的CentOS系统,因同事有一个7.6版本Minimal ISO镜像的安装U盘,为了图方便没有去下载everything ISO镜像,而是待同事 ...

  8. python __import__动态模块

    1.只限解释器内部自己使用. 条件:test.lianx_2.py中的代码: class a(object): def __init__(self,name): self.name=name def ...

  9. js里的null 与undefined

    null 表示一个值被定义了,定义为'空值': undefined 表示没有定义. 转换为数字时 Number(undefined) === NaN Number(null) === 0 在es6使用 ...

  10. 日志框架之2 slf4j+logback实现日志架构 · 远观钱途

    如何从缤纷复杂的日志系统世界筛选出适合自己的日志框架以及slf4j+logback的组合美妙之处?此文可能有帮助 logback介绍 Logback是由log4j创始人设计的另一个开源日志组件,官方网 ...