目前,为了增强我们学生的动手能力,老师组织我们参加了一场百度点石的练习赛,这是一场有着NLP背景的多分类问题, 搜集一些资料后,笔者拼来拼去,终于初步完成,目前f1得分为0.9066(未做优化),现在特来分享一下,由于笔者还是初学者,有些解释不好的地方请多多包涵。
训练集测试集下载链接:https://pan.baidu.com/s/1u2YLIW4XYPQjw2qcG63WUg
密码:1mgf
先导入我们需要用到的库,如果安装库过程有问题可以参考关于jupyter安装第三方库的问题(Linux)
from gensim.models.word2vec import Word2Vec
from sklearn.model_selection import train_test_split
import pandas as pd
import numpy as np
import jieba
from sklearn.externals import joblib
from sklearn.svm import SVC
接着读取我们的文件
columns = ['id', 'type', 'comment', 'lable']
df = pd.read_csv('data_train.csv',sep='\t', names=columns, encoding='utf-8')
df_test = pd.read_csv('data_test.csv',sep='\t', names=columns, encoding='utf-8')
接着我们开始对评论进行分词(注意:df[‘comment’].astype(str)后面的astype(str)不知道为啥不能省略,不然会报错)
cw = lambda x:list(jieba.cut(x))
df["comment_split"] = df['comment'].astype(str).apply(cw)
df_test["comment_split"] = df['comment'].astype(str).apply(cw)
ac_x = df_test["comment_split"].values
划分训练集测试集
train_x, test_x, train_y, test_y = train_test_split(df['comment_split'].values, df['lable'].values, test_size=0.2)
定义构造词向量函数
def build_sentence_vector(text, size,imdb_w2v):
vec = np.zeros(size).reshape((1, size))
count = 0.
for word in text:
try:
vec += imdb_w2v[word].reshape((1, size))
count += 1.
except KeyError:
continue
if count != 0:
vec /= count
return vec
开始构造词向量
n_dim = 300
imdb_w2v = Word2Vec(size=n_dim, min_count=10)
imdb_w2v.build_vocab(train_x)
imdb_w2v.train(sentences=train_x,total_examples=imdb_w2v.corpus_count, epochs=20)
train_vecs = np.concatenate([build_sentence_vector(z, n_dim,imdb_w2v) for z in train_x])
imdb_w2v.train(sentences=test_x,total_examples=imdb_w2v.corpus_count, epochs=20)
test_vecs = np.concatenate([build_sentence_vector(z, n_dim,imdb_w2v) for z in test_x])
开始用svm训练
clf=SVC(kernel='rbf',verbose=True)
clf.fit(train_vecs,train_y)
看一下这个模型的评分咋样
clf.score(test_vecs,test_y)
如果满意的话,接下来就可以对我们的data_test进行预测了
imdb_w2v.train(sentences=ac_x,total_examples=imdb_w2v.corpus_count, epochs=20)
ac_vecs = np.concatenate([build_sentence_vector(z, n_dim,imdb_w2v) for z in ac_x])
ac_y = clf.predict(ac_vecs)
df_ac = pd.DataFrame(np.hstack((df_test['id'].values.reshape(-1,1), ac_y.reshape(-1,1))), columns=['id', 'label'])
df_ac.to_csv("ac0.1.csv")
这样就大功告成。