微博立场检测 60分Baseline
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字段有三类,分别是FAVOR、AGAINST、NONE,这也是你需要最终预测的值。但是通过仔细分析数据可以发现,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__A,AGAINST变成__label__B,NONE变成__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
- 我的做法只用了
text和stance这两列,target我觉得可以用也可以不用 - 仔细观察数据集会发现,其实样本分布及其不均匀,
stance列中FAVOR和AGAINST两个值特别多,NONE特别少,这就涉及到不均衡样本的训练问题,可以通过sample,将它们的比例设置的比较均衡了再训练 - 过滤词设置的更详细一点。如果你仔细查看了分词后的数据集,你应该能发现里面其实还有很多垃圾词,比方说网址、7位验证码、表情之类的
- 直接上BERT
微博立场检测 60分Baseline的更多相关文章
- 读“40 分,60 分,90 分”
原文链接: http://mp.weixin.qq.com/s?__biz=MzA5MjYyNzY1OQ==&mid=2650901947&idx=1&sn=89af64d3b ...
- 湖人VS爵士!!科比4月14日最后一战,本赛季最高得分!狂得60分!!完美大逆转!!!
莫愁前路无知己,天下谁人不识君.科比,愿你如迈克尔·乔丹,仍然活跃在篮球界.退役不是结束,而是另一段人生的开始. 北京时间2016年4月14日,湖人101-96击败爵士,科比-布莱恩特告别战,20年职 ...
- 洛谷 P1038 神经网络 Label:拓扑排序 && 坑 60分待查
题目背景 人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷款风险评估等诸多领域有广泛的应用.对神经网络的研究一直是当今 ...
- P1967 货车运输 -60分
打了一个最大生成树+dfs,60分成功tle #include <bits/stdc++.h> using namespace std; const int maxn = 10005; c ...
- 利用条件运算符的嵌套来完成此题:学习成绩> =90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
利用条件运算符的嵌套来完成此题:学习成绩> =90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示. import java.util.Scanner; public clas ...
- 获取数值型数组中大于60的元素个数,给数值型数组中不足60分的加20分。(数组,for循环,if条件判断语句)
package com.Summer_0420.cn; /** * @author Summer * 获取数值型数组中大于60的元素个数 * 给数值型数组中不足60分的加20分 */ public c ...
- 根据考试成绩输出对应的礼物,90分以上爸爸给买电脑,80分以上爸爸给买手机, 60分以上爸爸请吃一顿大餐,60分以下爸爸给买学习资料。 要求:该题使用多重if完成
package com.Summer_0417.cn; import java.util.Scanner; /** * @author Summer * 根据考试成绩输出对应的礼物, * 90分以上爸 ...
- NOIP2012国王游戏(60分题解)
题目描述 恰逢 H国国庆,国王邀请n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排,国王站在队伍的最前面 ...
- 学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用利用条件运算符的嵌套来完成此题:C表示。
# -*- coding: utf8 -*- # Author:wxq #python 2.7 #题目:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用利用条件运算符 ...
随机推荐
- [LC] 70. Climbing Stairs
You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...
- synchronized互斥锁实例解析
目录 synchronized互斥锁实例解析 1.互斥锁基础使用:防止多个线程同时访问对象的synchronized方法. 1.1.多个线程调用同一个方法 1.2.多个线程多个锁,升级为类锁 2.线程 ...
- PP图|QQ图|正态性检验|K-S检验|S-W检验|
应用统计学: 物理条件一致时,有理由认为方差是一致的.配对检验可排除物理影响,使方差变小,但是自由度降低了,即样本数变小.二项分布均值假设检验的模型要依据前面的假设条件: PP图统计图要看中间的贴近情 ...
- python3多进程爬虫(第一卷)
进程这个东西概念很多人很模糊,而多进程并发爬虫也算是爬虫几大难点,现在我先说下进程的基本使用: 开启一个python文件 函数sayhi就是一个进程而且是主进程 现在呢我想循环输出NAME,n 正常我 ...
- Archives: 2013/6
OpenStack环境搭建 这一步有两个选择: 一种就是正统的真实搭建,所有都按生产环境来部署,费时费力. 还有一种就是官方推荐的一键安装DevStack,直接安装最新的版本,体验最新的特性. 至于如 ...
- 关于angular跳转路由之后不能自动回到顶部的解决方法
Question: angular2 scroll top on router change 当我们在第一个路由滑动到底部当我们点击导航跳转到另一个路由时页面没有回到顶部而是保持上一个路由的滚动位置, ...
- JFreeChart插件使用
以java project为例,首先需要导入需要的jar包:jcommon-1.0.23.jar, jfreechart-1.0.19.jar. 画饼状图示例: package com.it.jfch ...
- 几个简单又实用的PHP函数
简单方便使用: /** * 将多维数组转为一维数组 * @param array $arr * @return array */ function ArrMd2Ud($arr) { #将数值第一元素作 ...
- a链接刷新页面与js刷新页面总结
1.a链接的使用操作: <a href="javascript:history.go(-1);">返回上一页</a> <a href="#t ...
- Leetcode 063 不同路径二
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为" ...