您的位置:首页 > 其它

Datawhale零基础入门NLP-Task01-day 1

2020-07-21 22:06 78 查看

Datawhale零基础入门NLP-Task01-day 1

  • 二、评测标准
  • 一、赛题数据

    摘要:本章将会对新闻文本分类进行赛题讲解,对赛题数据进行说明,并给出解题思路。
    本文结构和框架大部分参考自:https://tianchi.aliyun.com/competition/entrance/531810/information
    https://tianchi.aliyun.com/notebook-ai/detail?spm=5176.12586969.1002.6.6406111aIKCSLV&postId=118252
    Markdown转换公众号 https://mdnice.com/

    赛题理解

    • 赛题名称:零基础入门NLP之新闻文本分类
    • 赛题目标:通过这道赛题可以引导大家走入自然语言处理的世界,带大家接触NLP的预处理、模型构建和模型训练等知识点。
    • 赛题任务:赛题以自然语言处理为背景,要求选手对新闻文本进行分类,这是一个典型的字符识别问题。

    赛题数据

    赛题以匿名处理后的新闻数据为赛题数据。赛题数据为新闻文本,并按照字符级别进行匿名处理。整合划分出14个候选分类类别:财经、彩票、房产、股票、家居、教育、科技、社会、时尚、时政、体育、星座、游戏、娱乐的文本数据。

    赛题数据由以下几个部分构成:训练集20w条样本,测试集A包括5w条样本,测试集B包括5w条样本。为了预防选手人工标注测试集的情况,我们将比赛数据的文本按照字符级别进行了匿名处理。

    label text
    6 57 44 66 56 2 3 3 37 5 41 9 57 44 47 45 33 13 63 58 31 17 47 0 1 1 69 26 60 62 15 21 12 49 18 38 20 50 23 57 44 45 33 25 28 47 22 52 35 30 14 24 69 54 7 48 19 11 51 16 43 26 34 53 27 64 8 4 42 36 46 65 69 29 39 15 37 57 44 45 33 69 54 7 25 40 35 30 66 56 47 55 69 61 10 60 42 36 46 65 37 5 41 32 67 6 59 47 0 1 1 68

    在数据集中标签的对应的关系如下:

    {‘科技’: 0, ‘股票’: 1, ‘体育’: 2, ‘娱乐’: 3, ‘时政’: 4, ‘社会’: 5, ‘教育’: 6, ‘财经’: 7, ‘家居’: 8, ‘游戏’: 9, ‘房产’: 10, ‘时尚’: 11, ‘彩票’: 12, ‘星座’: 13}

    数据列使用\t进行分割,Pandas读取数据的代码如下:

    train_df = pd.read_csv('../input/train_set.csv', sep='\t')

    二、评测标准

    评价标准为类别f1_score的均值,选手提交结果与实际测试集的类别进行对比,结果越大越好。
    LaTeX 数学公式:对应列表
    计算公式:F1=2∗(precision∗recall)(precision+recall) 计算公式:F1 = 2 * \frac{(precision*recall)}{(precision+recall)} 计算公式:F1=2∗(precision+recall)(precision∗recall)​
    这里使用了机器学习里面常用的一个评价分类模型的方法F1-score。这里面precision表示准确率,recall表示召回率:

    precision=TPFP+TP precision = \frac{TP}{FP+TP} precision=FP+TPTP​

    recall=TPTP+FN recall = \frac{TP}{TP+FN} recall=TP+FNTP​
    在上述两式子里,TP即true positive, 就是模型将样本分类为正样本且分类正确的样本数,FP即false positive, 就是模型将样本分类为负样本但分类错误的样本数。同理, TN,FN分别为为true negative和false negative。(注意:这里FP,TP, FN, TN样本的positive和negative,这个都是模型预测的结果,而不是实际上样本为正为负)

    所以这里的precision其实就是在模型判定为正的样本里正样本(实际为正的样本)的比例,而recall就是模型判定正确的正样本数占原始数据集(就是被预测的数据集)中所有正样本的比例。precision和recall都可以用来评价分类模型。但在实际应用过程中,这两者都有所缺陷,这里我举两个二分类的例子:垃圾邮件检测和零件故障检测。在垃圾邮件检测中,我们的目的是检测出来的垃圾邮件尽量多的是准确的,不能把非垃圾邮件检测为垃圾邮件。所以这里我们需要使用precision,而不是recall。而在零件的故障检测中,我们目的是要尽可能的把所有故障零件都找出来,这里就要用到recall,而不是precision。recall 体现了模型对正样本的识别能力,recall 越高,说明模型对正样本的识别能力越强,precision 体现了模型对负样本的区分能力,precision越高,说明模型对负样本的区分能力越强。

    而从上面F1-score的表达式可以看出,它是上述两者的调和平均。F1-score 越高,说明模型越稳健。

    可以通过sklearn完成f1_score计算:

    from sklearn.metrics import f1_score
    y_true = [0, 1, 2, 0, 1, 2]
    y_pred = [0, 2, 1, 0, 0, 1]
    f1_score(y_true, y_pred, average='macro')

    解题思路

    赛题思路分析:赛题本质是一个文本分类问题,需要根据每句的字符进行分类。但赛题给出的数据是匿名化的,不能直接使用中文分词等操作,这个是赛题的难点。

    因此本次赛题的难点是需要对匿名字符进行建模,进而完成文本分类的过程。由于文本数据是一种典型的非结构化数据,因此可能涉及到

    特征提取
    分类模型
    两个部分。为了减低参赛难度,我们提供了一些解题思路供大家参考:

    思路1:TF-IDF + 机器学习分类器
    直接使用TF-IDF对文本提取特征,并使用分类器进行分类。在分类器的选择上,可以使用SVM、LR、或者XGBoost。

    这里TF-IDF方法是文本挖掘中常用的一种提取特征的技术,旨在从无结构的文本提取出有结构的数据,从而来进行模型的训练。其中TF就是Term Frequency,就是一个单词在一个document中出现的次数

    然后IDF是Inverse document frequency,具体看下面计算公式
    tf(w,d)=#of occurrences of word w in document d tf(w,d) = \#of\ occurrences\ of\ word\ w\ in\ document\ d tf(w,d)=#of occurrences of word w in document d
    然后IDF是Inverse document frequency,具体看下面计算公式
    idf(w)=log2(N#of documents that contain w at least once) idf(w) = log_2(\frac{N}{\#of\ documents\ that\ contain\ w\ at\ least\ once}) idf(w)=log2​(#of documents that contain w at least onceN​)

    这里N表示语料库的总文档数。

    tf其实就是衡量一个单词w与文档d相关性程度,而idf是评判一个单词w在整个语料库中的关系。如果我们只是用tf来提取特征的话也就是CountVectorizer就会有这样的不足,当某些词在每个文档中都出现多次,那么这个词其实是不具备对文档进行分类的能力的。所以这时候就体现idf的作用了,因为这样出现在很多文档的词idf值是很小的。
    tfidf(w,d)=tf(w,d)∗idf(w) tfidf(w,d) = tf(w,d)*idf(w) tfidf(w,d)=tf(w,d)∗idf(w)
    而tfidf中和了两者的优点,将其相乘,这样来提取特征就会避免只使用词频的不足。

    tfidf:

    from sklearn.feature_extraction.text import TfidfVectorizer
    
    vect=TfidfVectorizer(encoding='utf-8')
    vect.fit(train_data)
    trans_traindata=vect.transform(train_data)
    trans_testdata=vect.transform(test_data)

    SVM:

    lsvc=LinearSVC()
    lsvc.fit(trans_traindata.toarray(),train_label)
    
    prediction["LSVC"]=lsvc.predict(trans_testdata.toarray())
    print(classification_report(test_label,prediction["LSVC"]))
    accuracy_score(test_label,prediction["LSVC"])

    XGBoost:

    import xgboost as xgb
    
    cls_xgboost = xgb.XGBClassifier()
    cls_xgboost.fit(trans_traindata,train_label)
    
    cls_xgboost.score(trans_testdata,test_label)
    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: