比赛地址:https://god.yanxishe.com/44
之间参与的比赛都是数据类型的比赛,从来没接触过文本类型的任务。对文本的处理还不了解,现在稍微熟悉了一点。比赛给出的数据是weibo的一段评论数据,标注了每段评论数据的情感倾向,有正负未知三种类别。比赛目标就是对文本进行分类,评价标准是准确度。
文本分类的基本步骤
和一般的分类任务相同,文本比赛的处理流程也是文本向量化(如TF-IDF,词频统计),然后进行特征提取,放入分类模型,参数调优,提升准确率。
数据导入
1 | import pandas as pd |
1 | df_train = pd.read_csv('./train.csv',sep='\t') # 数据读取 |
导入数据后,简单查看数据,剔除或补全异常值,同时我们对label进行编码,导入中文停用词表。中文停用词指的是频繁出现在语句中的助词,对于词向量的转换没有意义,因此在分词之后需要剔除。
1 | df_train.stance = df_train.stance.fillna('NONE') |
分词
中文分词和英文分词不同,后者的划分很大程度上是单词的划分,中文的分词需要依靠分词工具,这里选用的jieba分词,同时对训练集标签进行映射。
1 | df_train['label'] = df_train['stance'].apply(lambda x : label_dict.get(x)) |
值得注意的是,分词是任何中文文本分类的起点,分词的质量会直接影响到后面的模型效果。在这里,作为演示有点偷懒,其实你还可以:
- 设置可靠的自定义词典,以便分词更精准;
- 采用分词效果更好的分词器,如pyltp、THULAC、Hanlp等;
- 编写预处理类,就像下面要谈到的数字特征归一化,去掉文本中的#@¥%……&等等。
TF-IDF
TF-IDF(Term Frequency-InversDocument Frequency)是一种常用于信息处理和数据挖掘的加权技术。该技术采用一种统计方法,根据字词的在文本中出现的次数和在整个语料中出现的文档频率来计算一个字词在整个语料中的重要程度。它的优点是能过滤掉一些常见的却无关紧要本的词语,同时保留影响整个文本的重要字词。
简单来说,就是利用词频和文本频率来计算这个词在整个语料库的重要性,将词语转换为数字,进而判断整个句子的类别。
Scikit-Learn中TF-IDF权重计算方法主要用到两个类:CountVectorizer和TfidfTransformer。
1 | vectorizer = TfidfVectorizer(ngram_range=(1, 2),max_df=0.5,stop_words=stopWordList) |
模型
朴素贝叶斯
1 | skf = StratifiedKFold(n_splits=5,random_state=42,shuffle=True) |
SVM
1 | skf = StratifiedKFold(n_splits=5,random_state=42,shuffle=True) |
LGB
1 | param |
数据处理
使用奇异值分解(SVD)来减少TF-IDF的特征数量,同时将数据标准化。
1 | svd = decomposition.TruncatedSVD(n_components=150) |
词嵌入Word2Vec
将高维稀疏的词向量转移到低维空间,相比较于TF-IDF,效果可能更好。
1 | train_text = list(df_train['cut_text'].values) |
这一步之后,继续使用模型进行分类。
1 | #LGB |
深度学习
BERT
参考链接
https://zhuanlan.zhihu.com/p/64602471
https://zhuanlan.zhihu.com/p/66506214
https://github.com/cy576013581/text-classification/blob/master/Fasttext/fasttext.py
https://github.com/real-brilliant/bert_chinese_pytorch/blob/master/bert.py