• NLP——天池新闻文本分类 Task1


    NLP——新闻文本处理:TASK1 赛题理解与nlp初识

    1.数据读取

    在竞赛主页下载好数据集利用pandas打开:

    #coding=utf-8
    import pandas as pd
    #my_font = font_manager.FontProperties(fname="C:WindowsFontsmsyh.ttc")
    
    #设置显示范围
    pd.set_option('display.max_columns', 1000)
    pd.set_option('display.width', 1000)
    pd.set_option('display.max_colwidth', 1000)
    
    csvframe = pd.read_csv('data_list_0715.csv',encoding='gbk',header=0)
    print(csvframe)
    

    注:在数据集命名时尽量不要使用n为开头字母,会导致python语句识别错误.

    读取完成后可看到给出的三个数据集的链接:

    0         train_set.csv.zip    训练集数据(选手需要自行解压)  236.11MB         https://tianchi-competition.oss-cn-hangzhou.aliyuncs.com/531810/train_set.csv.zip
    1            test_a.csv.zip  测试集A榜数据(选手需要自行解压)   59.12MB            https://tianchi-competition.oss-cn-hangzhou.aliyuncs.com/531810/test_a.csv.zip
    2  test_a_sample_submit.csv          测试集A榜提交样例   97.66KB  https://tianchi-competition.oss-cn-hangzhou.aliyuncs.com/531810/test_a_sample_submit.csv
    

    下载后即可得到题目所给数据集,分别为训练集,测试集与样例。
    以下是部分数据集:

    0       2	2967 6758 339 2021 1854 3731 4109 3792 4149...
    1       11	4464 486 6352 5619 2465 4802 1452 3137 577...
    2       3	7346 4068 5074 3747 5681 6093 1777 2226 735...
    3       2	7159 948 4866 2109 5520 2490 211 3956 5520 ...
    4       3	3646 3055 3055 2490 4659 6065 3370 5814 246...
    

    2.评价标准:F1-score

    多分类问题的机器学习竞赛常常将F1-score作为最终的测评方法。

    公式表达

    [F_{1}=2 cdot frac{ ext {precision} cdot ext {recall}}{ ext {precision}+ ext {recall}} ]

    其中P(Precision)为精确率,R(recall)为召回率。F1-score认为精确率与召回率同等重要。另外还有其他类似的评价标准:

    [F_{eta}=left(1+eta^{2} ight) cdot frac{ ext { precision } cdot ext { recall }}{left(eta^{2} cdot ext { precision } ight)+ ext { recall }} ]


    ### 计算过程 下面介绍几个符号: TP:预测答案正确; FP:将其他类标签错误预测为本类别 FN:将本类别标签错误预测为其他类别 则P表示被分类器判定为正例中,正样本的比重: $$ ext {precision}_{k}=frac{T P}{T P+F P}$$ R表示被预测为正例的样本占总正例的比重: $$ ext { recall}_{k}=frac{T P}{T P+F N}$$ 再计算每一类别的f1值: $$f 1_{k}=frac{2 cdot ext { precision }_{k} cdot ext { recall }_{k}}{ ext { precision }_{k}+ ext { recall }_{k}}$$ 最终将结果进行加权就可得到f1-score: $$ ext {score}=left(frac{1}{n} sum f 1_{k} ight)^{2}$$ ### 代码实现 可利用sklearn包进行F1-score的计算,具体代码如下:
    #coding=utf-8
    from sklearn.metrics import f1_score
    #分类器预测得到的类别
    y_pred = [0, 1, 1, 1, 2, 2]
    #目标的真实类别
    y_true = [0, 1, 0, 2, 1, 1]
    
    print(f1_score(y_true, y_pred, average='macro'))#如果不考虑类别的不平衡性,计算宏平均,则使用‘macro’
    print(f1_score(y_true, y_pred, average='weighted'))#考虑类别的不平衡性,需要计算类别的加权平均 
    

    得到结果:

    0.3333333333333333
    0.38888888888888884
    

    3.解题思路

    TF-IDF+机器学习分类器

    特征提取包括特征选择与特征权重运算,其中,特征选择是,根据某个评价指标独立地对原始特征项(词项)进行评分排序,从中选择得分最高的一些特征项(词项)进行评分排序,从中选择得分最高的一些特征项,过滤掉其余特征项。
    TF-IDF主要用于特征权重计算,它表示一个词的重要度与在类别内的词频成正比,与所有类别出现的次数成反比。

    [t f_{i j}=frac{n_{i, j}}{sum_{k} n_{k, j}} ]

    [T F_{w}=frac{ ext { 在某一类中词条中 } w ext { 出现的次数 }}{ ext { 该类中所有的词条数目 }} ]

    [i d f_{i}=log frac{|D|}{left|left{j: t_{i} in d_{j} ight} ight|} ]

    [I D F=log left(frac{ ext { 语料库的文档总教 }}{ ext { 包含词条 } w ext { 的文档教 }+1} ight) ]

    代码实现:

    from sklearn.feature_extraction.text import CountVectorizer
    from sklearn.feature_extraction.text import TfidfTransformer
    
    x_train = ['TF-IDF 主要 思想 是', '算法 一个 重要 特点 可以 脱离 语料库 背景',
               '如果 一个 网页 被 很多 其他 网页 链接 说明 网页 重要']
    x_test = ['原始 文本 进行 标记', '主要 思想']
    
    # 该类会将文本中的词语转换为词频矩阵,矩阵元素a[i][j] 表示j词在i类文本下的词频
    vectorizer = CountVectorizer(max_features=10)
    # 该类会统计每个词语的tf-idf权值
    tf_idf_transformer = TfidfTransformer()
    # 将文本转为词频矩阵并计算tf-idf
    tf_idf = tf_idf_transformer.fit_transform(vectorizer.fit_transform(x_train))
    # 将tf-idf矩阵抽取出来,元素a[i][j]表示j词在i类文本中的tf-idf权重
    x_train_weight = tf_idf.toarray()
    
    # 对测试集进行tf-idf权重计算
    tf_idf = tf_idf_transformer.transform(vectorizer.transform(x_test))
    x_test_weight = tf_idf.toarray()  # 测试集TF-IDF权重矩阵
    
    print('输出x_train文本向量:')
    print(x_train_weight)
    print('输出x_test文本向量:')
    print(x_test_weight)
    

    可得到结果:

    [[0.70710678 0.         0.70710678 0.         0.         0.
      0.         0.         0.         0.        ]
     [0.         0.3349067  0.         0.44036207 0.         0.44036207
      0.44036207 0.44036207 0.         0.3349067 ]
     [0.         0.22769009 0.         0.         0.89815533 0.
      0.         0.         0.29938511 0.22769009]]
    输出x_test文本向量:
    [[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
     [0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]]
    

    FastText文本分类器

    FastText是Facebook AI Research在16年开源的一种文本分类器。 其特点就是fast。相对于其它文本分类模型,如SVM,Logistic Regression等模型,fastText能够在保持分类效果的同时,大大缩短了训练时间。

  • 相关阅读:
    菜鸟学freeswitch(二)webRTC拨软电话自动挂断
    热部署神器-JRebel的简单使用
    菜鸟学freeswitch(一)freeswitch安装
    Feign涨姿势的机会
    zuul 设置响应超时
    @Autowired和static的关系
    加固ECS安全性的一些策略
    当https遇上websocket
    Msql 问题(持续更新)
    5.elk
  • 原文地址:https://www.cnblogs.com/dingdingdongs/p/13357066.html
Copyright © 2020-2023  润新知