自然语言处理比赛总结

#预选赛部分
比赛仍然在继续,但是过了一个阶段,应该稍微总结一下(毕竟是个菜鸡):
比赛的任务是一个数据量较少的文本情感二分类任务,总体来说十分简单,但是需要达到一定分数才能才能通过。
首先我们使用了简单的jieba分词+tfidf +lr的方式进行处理,使用10折交叉差不多能得到0.8左右的auc。但是在预测数据保存提交后,显示的分数很低。
后来我发现是这样的:
1.首先,特征工程没有做好:我们需要把文本中所有的字母变成小写的,写出tokenize函数后用map可以让data-review中的内容逐条应用tokenize函数。然后使用lambda表达式把data[‘tokens’] (内容是列表)变成data[‘cleaned_text’](内容是文本)

def tokenize(tweet):
    tweet = tweet.strip().lower()
    tokens = word_tokenize(tweet)  
    return tokens
data['tokens'] = data.review.map(tokenize)
data['cleaned_text'] = data['tokens'].map(lambda tokens: ' '.join(tokens))

2.特征不能直接使用tfdif,我们选用词级的 ngram 和字符级的 ngram 。词级别:analyzer=‘word’, ngram_range=(1, 2),字符级则是analyzer=‘char’, ngram_range=(1,4)。生成好所需要的向量之后我们用hstack把他们整合在一起成为一个更加强的向量进行训练。注意的是不要忘记把你要预测的数据也进行同样的训练。
3.最后训练分类器的时候由于使用k折训练,犯了错误,训练完直接使用分类器进行预测。正确的做法应该是把数据整合起来重新训练以获得新的分类器,用这个新分类器进行训练。
4.还有一个小tips应该注意,那就是在程序中我们应该多使用保存的代码

joblib.dump(lr_word_char, './data/kesci/models/lr_word_char_ngram.pkl')
final_pre_df.to_csv("./data/kesci/result_new_0509_1.csv",index = False)

像是这样。

#初赛部分
这tm的数据集大的感人。
总之一定要使用chunksize流式读取数据来做,百分之一的大小慢慢来读取更加能利用空间。在读取dataframe的时候注意:千万要设置names = 列名。否则没有表头的数据的第一行会被读进去导致格式不对,十分严重。
保存的有列名的数据则不用在读取的时候指定列名,但是需要加上indexcol参数否则前面会加上一层unname:0.

你可能感兴趣的:(算法)