zoukankan      html  css  js  c++  java
  • NLP——天池新闻文本分类 TASK3

    NLP——新闻文本处理:TASK3 TF-IDF+机器学习分类器

    在Task1中已经对最终得分表示F1-score有了部分介绍,这里给出TF-IDF的介绍以及机器学习分类器相关代码:

    1.TF-IDF

    一个词语在一篇文章中出现次数越多, 同时在所有文档中出现次数越少, 越能够代表该文章.这就是TF-IDF的含义.
    应用实例:
    http://www.ruanyifeng.com/blog/2013/03/tf-idf.html

    2.文本表示方法

    在机器学习算法的训练过程中,假设给定 N个样本,每个样本有 M个特征,这样组成了 N×M的样本矩阵,然后完成算法的训练和预测。同样的在计算机视觉中可以将图片的像素看作特征,每张图片看作hight×width×3的特征图,一个三维的矩阵来进入计算机进行计算。
    但是在自然语言领域,上述方法却不可行:文本是不定长度的。文本表示成计算机能够运算的数字或向量的方法一般称为词嵌入(Word Embedding)方法。词嵌入将不定长的文本转换到定长的空间内,是文本分类的第一步。

    One-hot

    这里的One-hot与数据挖掘任务中的操作是一致的,即将每一个单词使用一个离散的向量表示。具体将每个字/词编码一个索引,然后根据索引进行赋值。

    One-hot表示方法的例子如下:

    句子1:我 爱 北 京 天 安 门
    句子2:我 喜 欢 上 海
    首先对所有句子的字进行索引,即将每个字确定一个编号:

    {
    '我': 1, '爱': 2, '北': 3, '京': 4, '天': 5,
    '安': 6, '门': 7, '喜': 8, '欢': 9, '上': 10, '海': 11
    }
    在这里共包括11个字,因此每个字可以转换为一个11维度稀疏向量:

    我:[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    爱:[0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    ...
    海:[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]

    Bag of Words

    Bag of Words(词袋表示),也称为Count Vectors,每个文档的字/词可以使用其出现次数来进行表示。

    句子1:我 爱 北 京 天 安 门
    句子2:我 喜 欢 上 海
    直接统计每个字出现的次数,并进行赋值:

    句子1:我 爱 北 京 天 安 门
    转换为 [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0]

    句子2:我 喜 欢 上 海
    转换为 [1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1]
    在sklearn中可以直接CountVectorizer来实现这一步骤:

    from sklearn.feature_extraction.text import CountVectorizer
    corpus = [
        'This is the first document.',
        'This document is the second document.',
        'And this is the third one.',
        'Is this the first document?',
    ]
    vectorizer = CountVectorizer()
    vectorizer.fit_transform(corpus).toarray()
    

    N-gram

    N-gram与Count Vectors类似,不过加入了相邻单词组合成为新的单词,并进行计数。

    如果N取值为2,则句子1和句子2就变为:

    句子1:我爱 爱北 北京 京天 天安 安门
    句子2:我喜 喜欢 欢上 上海

    TF-IDF

    TF-IDF 分数由两部分组成:第一部分是词语频率(Term Frequency),第二部分是逆文档频率(Inverse Document Frequency)。其中计算语料库中文档总数除以含有该词语的文档数量,然后再取对数就是逆文档频率。

    TF(t)= 该词语在当前文档出现的次数 / 当前文档中词语的总数
    IDF(t)= log_e(文档总数 / 出现该词语的文档总数)

    3.sklearn程序实现

    TF-IDF+岭分类

    import pandas as pd
    
    from sklearn.feature_extraction.text import TfidfVectorizer
    from sklearn.linear_model import RidgeClassifier
    from sklearn.linear_model.logistic import LogisticRegression
    from sklearn.svm import SVC
    from sklearn.metrics import f1_score
    #TF-IDF+岭回归
    train_df = pd.read_csv('train_set.csv', sep='	', nrows=15000)
    
    tfidf = TfidfVectorizer(ngram_range=(1,3), max_features=3000)
    train_test = tfidf.fit_transform(train_df['text'])
    
    clf = RidgeClassifier()
    #clf=LogisticRegression()
    #clf=SVC()
    clf.fit(train_test[:10000], train_df['label'].values[:10000])
    #用10000之前的作为训练,10000之后的做预测
    val_pred = clf.predict(train_test[10000:])
    print(f1_score(train_df['label'].values[10000:], val_pred, average='macro'))
    

    程序为选取前15000个样本进行训练,最终得到结果为:0.8721
    sklearn中封装好的各种算法使用前都要 fit
    在TF-IDF中:
    fit :根据训练集生成词典和逆文档词频,由fit 方法计算每个特征的权重储存在modelidf_属性中。
    transform :使用fit 学习的词汇和文档频率,将文档转换为文档——词矩阵。

    TF-IDF+LogisticRegression

    import pandas as pd
    
    from sklearn.feature_extraction.text import TfidfVectorizer
    from sklearn.linear_model import RidgeClassifier
    from sklearn.linear_model.logistic import LogisticRegression
    from sklearn.svm import SVC
    from sklearn.metrics import f1_score
    #TF-IDF+岭回归
    train_df = pd.read_csv('train_set.csv', sep='	', nrows=15000)
    
    tfidf = TfidfVectorizer(ngram_range=(1,3), max_features=3000)
    train_test = tfidf.fit_transform(train_df['text'])
    
    #clf = RidgeClassifier()
    clf=LogisticRegression()
    #clf=SVC()
    clf.fit(train_test[:10000], train_df['label'].values[:10000])
    #用10000之前的作为训练,10000之后的做预测
    val_pred = clf.predict(train_test[10000:])
    print(f1_score(train_df['label'].values[10000:], val_pred, average='macro'))
    

    得到结果:0.84988

    TF-IDF+SVM

    import pandas as pd
    
    from sklearn.feature_extraction.text import TfidfVectorizer
    from sklearn.linear_model import RidgeClassifier
    from sklearn.linear_model.logistic import LogisticRegression
    from sklearn.svm import SVC
    from sklearn.metrics import f1_score
    #TF-IDF+岭回归
    train_df = pd.read_csv('train_set.csv', sep='	', nrows=15000)
    
    tfidf = TfidfVectorizer(ngram_range=(1,3), max_features=3000)
    train_test = tfidf.fit_transform(train_df['text'])
    
    #clf = RidgeClassifier()
    #clf=LogisticRegression()
    clf=SVC()
    clf.fit(train_test[:10000], train_df['label'].values[:10000])
    #用10000之前的作为训练,10000之后的做预测
    val_pred = clf.predict(train_test[10000:])
    print(f1_score(train_df['label'].values[10000:], val_pred, average='macro'))
    

    得到结果:
    0.87618

    TF-IDF+Xgboost

    import pandas as pd
    from xgboost import XGBClassifier
    from sklearn.feature_extraction.text import TfidfVectorizer
    from sklearn.linear_model import RidgeClassifier
    from sklearn.linear_model.logistic import LogisticRegression
    from sklearn.svm import SVC
    from sklearn.metrics import f1_score
    #TF-IDF+岭回归
    train_df = pd.read_csv('train_set.csv', sep='	', nrows=15000)
    
    tfidf = TfidfVectorizer(ngram_range=(1,3), max_features=3000)
    train_test = tfidf.fit_transform(train_df['text'])
    
    #clf = RidgeClassifier()
    #clf=LogisticRegression()
    #clf=SVC()
    xgbc = XGBClassifier()
    xgbc.fit(train_test[:10000], train_df['label'].values[:10000])
    #用10000之前的作为训练,10000之后的做预测
    val_pred = xgbc.predict(train_test[10000:])
    print(f1_score(train_df['label'].values[10000:], val_pred, average='macro'))
    

    得到结果:0.8818

  • 相关阅读:
    【BZOJ2734】【HNOI2012】集合选数(状态压缩,动态规划)
    【Luogu1879】玉米田(状态压缩,动态规划)
    【BZOJ1911】【APIO2010】特别行动队(斜率优化,动态规划)
    蒟蒻关于斜率优化DP简单的总结
    【BZOJ1010】【HNOI2008】玩具装箱(斜率优化,动态规划)
    【BZOJ4196】【NOI2015】软件包管理器(树链剖分,线段树)
    【BZOJ1483】【HNOI2009】梦幻布丁(启发式合并,平衡树)
    【BZOJ1058】【ZJOI2007】报表统计(链表,堆,Splay)
    【BZOJ1012】【JSOI2008】最大数(线段树)
    【SHOI2012】魔法树(树链剖分,线段树)
  • 原文地址:https://www.cnblogs.com/dingdingdongs/p/13378618.html
Copyright © 2011-2022 走看看