zoukankan      html  css  js  c++  java
  • 基于机器学习的文本分类NLP基本介绍

    一、学习目的:

    1 学会TF-IDF的原理和使用
    2 使用sklearn的机器学习模型完成文本分类

    二、处理文本方法:

    1 One-hot(独热编码)
    2 Bag of Words(词袋)
    3 N-gram
    4 TF-IDF 分数

    下面具体介绍每种方法

    2.1.one-hot

    即将每一个单词使用一个离散的向量表示。具体将每个字/词编码一个索引,然后根据索引进行赋值

    如:

    句子1:我 爱 北 京 天 安 门
    句子2:我 喜 欢 上 海
    
    首先对所有句子的字进行索引,即将每个字确定一个编号: {
    '': 1, '': 2, '': 3, '': 4, '': 5, '': 6, '': 7, '': 8, '': 9, '': 10, '': 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]

    2.2.Bag of Words(词袋表示),也称为Count Vectors

    每个文档的字/词可以使用其出现次数来进行表示

    #直接统计每个字出现的次数,并进行赋值:
    句子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()

    2.3.N-gram

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

    如果N取值为2,则句子1和句子2就变为:
    
    句子1:我爱 爱北 北京 京天 天安 安门
    句子2:我喜 喜欢 欢上 上海

    2.4.TF-IDF

    分数由两部分组成:

    第一部分是词语频率(Term Frequency),第二部分是逆文档频率(Inverse Document Frequency)。

    其中计算语料库中文档总数除以含有该词语的文档数量,然后再取对数就是逆文档频率

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

    三、代码实现

    # Count Vectors + RidgeClassifier
    
    import pandas as pd
    
    from sklearn.feature_extraction.text import CountVectorizer
    from sklearn.linear_model import RidgeClassifier
    from sklearn.metrics import f1_score
    
    train_df = pd.read_csv('../data/train_set.csv', sep='	', nrows=15000)
    
    vectorizer = CountVectorizer(max_features=3000)
    train_test = vectorizer.fit_transform(train_df['text'])
    
    clf = RidgeClassifier()
    clf.fit(train_test[:10000], train_df['label'].values[:10000])
    
    val_pred = clf.predict(train_test[10000:])
    print(f1_score(train_df['label'].values[10000:], val_pred, average='macro'))
    # 0.74
    # TF-IDF +  RidgeClassifier
    
    import pandas as pd
    
    from sklearn.feature_extraction.text import TfidfVectorizer
    from sklearn.linear_model import RidgeClassifier
    from sklearn.metrics import f1_score
    
    train_df = pd.read_csv('../data/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.fit(train_test[:10000], train_df['label'].values[:10000])
    
    val_pred = clf.predict(train_test[10000:])
    print(f1_score(train_df['label'].values[10000:], val_pred, average='macro'))
    # 0.87
  • 相关阅读:
    学习的原动力
    “六顶思考帽”给我的启示
    关于DataSet与Strongly typed DataSet几点思考(原创)
    设计模式之Singleton和Factory
    CentOS修改网络配置
    Proxmox VE(PVE)安装教程
    CentOS开启SELinux导致samba无法访问的解决办法
    nano编辑器使用教程
    CentOS 如何挂载硬盘
    PVE硬盘直通
  • 原文地址:https://www.cnblogs.com/cgmcoding/p/13435174.html
Copyright © 2011-2022 走看看