微博立场检测 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分以下的用利用条件运算符 ...
 
随机推荐
- python练习题——猜数字游戏
			
增加了按照对半找数的方法来计算最短几次就可以猜到随机数,决定到游戏结束共猜数的次数: from random import * import numpy as np from numpy import ...
 - c socket 开发测试
			
c语言异常 参照他人代码写一个tcp的 socket 开发测试 异常A,在mac osx系统下编译失败,缺库转到debian下. 异常B,include引用文件顺序不对,编译大遍异常 异常C,/usr ...
 - Java IO: PipedInputStream
			
原文链接 作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) PipedInputStream可以从管道中读取字节流数据,代码如下: 01 InputSt ...
 - maven工程项目依赖爆红,手动导入依然缺少依赖
			
1.新建一个工程 2.把依赖添加到新建工程的pom文件 神奇的事情发生了,依赖自动补全!!! 3.点击install 安装一下可能有些依赖会有其他依赖 建议:不要在自己原来的工程上浪费时间,新建工程. ...
 - Drools 7.15.0 docker容器方式部署
			
关于drools的相关介绍就不再赘述了,关于drools网上的资料都很少,或者都有些老了,最近折腾了一下,记录下安装部署的过程,希望能节省下大家的时间. 一.快速部署 1.拉取基础镜像,命令如下: d ...
 - 机器学习入门-逻辑(Logistic)回归(1)
			
原文地址:http://www.bugingcode.com/machine_learning/ex3.html 关于机器学习的教程确实是太多了,处于这种变革的时代,出去不说点机器学习的东西,都觉得自 ...
 - nginx: [emerg] unknown directive “ ” in /usr/local/nginx/conf/vhost/XXX.conf:53报错处理
			
开发同事发给我一小段nginx配置,加到服务器上之后,执行nginx -s reload时,出现报错: nginx: [emerg] unknown directive “ ” in /usr/loc ...
 - 以后的IT路还很长(1)
			
以后的IT路还很长(1) 最近有两位兄弟同事离职了,蛮可惜了,在一个战壕一起一.两年了,人各有志嘛!希望他们发展更好些! 目前的公司是个创业型的公司,公司从08年的50来个人,扩张到今年11年400多 ...
 - Shopee招聘-测试开发leader(30k-60k/月)
			
内推邮箱:tim.zhao@shopee.com 地点:深圳 1.测试Leader (30k-60k/月) 岗位职责 负责根据项目计划制订测试计划和规划,保证项目质量和进度: 负责与产品经理和开发人员 ...
 - CSS 技巧汇总
			
CSS 选择符优先级 !important 声明>内联样式(style)>id 选择符(#id)>类选择符(.class)=伪类选择符(:hover )=属性选择符([attr] ) ...