零基础入门NLP- 新闻文本分类 TASK4基于深度学习的文本分类1

4.1 基于深度学习的文本分类

与传统机器学习不同,深度学习既提供特征提取功能,也可以完成分类的功能。从本章开始我们将学习如何使用深度学习来完成文本表示。

4.1.1 学习目标

1.学习FastText的使用和基础原理
2.学会使用验证集进行调参

4.1.2 文本表示方法

现有的文本表示方法的缺陷

现有的文本表示方法包括:
1.One-hot
2.Bag of Words
3.N-gram
4.TF-IDF
现有的文本表示所存在的缺陷:转换得到的向量维度很高,需要较长时间的训练;没有考虑单词与单词之间的关系,只是进行了统计。
与这些文本表示方法不同,深度学习也可以用来进行文本表示,还可以将其映射到一个低维空间。其中比较典型的方法有:FastText、Word2Vect、Bert。本章介绍FastText方法。

FastText

FastText是一种典型的深度学习词向量的表示方法,它非常简单的通过Embedding层将单词映射到稠密空间,然后将句子中所有单词在Embedding空间中进行平均,进而完成分类操作。FastText是一个三层的神经网络,包括输入层、隐藏层和输出层。
零基础入门NLP- 新闻文本分类 TASK4基于深度学习的文本分类1_第1张图片

API介绍:
  • 导入FastText
from fastText import train_supervised, load_model
  • 分类问题
def train_supervised(input, lr=0.1, dim=100, 
                   ws=5, epoch=5, minCount=1, 
                   minCountLabel=0, minn=0, 
                   maxn=0, neg=5, wordNgrams=1, 
                   loss="softmax", bucket=2000000, 
                   thread=12, lrUpdateRate=100,
                   t=1e-4, label="__label__", 
                   verbose=2, pretrainedVectors=""):
  """
  训练一个监督模型, 返回一个模型对象

  @param input: 训练数据文件路径
  @param lr:              学习率
  @param dim:             向量维度
  @param ws:              cbow模型时使用
  @param epoch:           次数
  @param minCount:        词频阈值, 小于该值在初始化时会过滤掉
  @param minCountLabel:   类别阈值,类别小于该值初始化时会过滤掉
  @param minn:            构造subword时最小char个数
  @param maxn:            构造subword时最大char个数
  @param neg:             负采样
  @param wordNgrams:      n-gram个数
  @param loss:            损失函数类型, softmax, ns: 负采样, hs: 分层softmax
  @param bucket:          词扩充大小, [A, B]: A语料中包含的词向量, B不在语料中的词向量
  @param thread:          线程个数, 每个线程处理输入数据的一段, 0号线程负责loss输出
  @param lrUpdateRate:    学习率更新
  @param t:               负采样阈值
  @param label:           类别前缀
  @param verbose:         ??
  @param pretrainedVectors: 预训练的词向量文件路径, 如果word出现在文件夹中初始化不再随机
  @return model object

  """
  pass
  • 词向量训练
def train_unsupervised(input, model="skipgram", lr=0.05, dim=100, 
                   ws=5, epoch=5, minCount=5, 
                   minCountLabel=0, minn=3, 
                   maxn=6, neg=5, wordNgrams=1, 
                   loss="ns", bucket=2000000, 
                   thread=12, lrUpdateRate=100,
                   t=1e-4, label="__label__", 
                   verbose=2, pretrainedVectors=""):
  """
  训练词向量,返回模型对象
  输入数据不要包含任何标签和使用标签前缀

  @param model: 模型类型, cbow/skipgram两种
  其他参数参考train_supervised()方法
  @return model
  """
  pass

基于FastText的文本分类

import pandas as pd
from sklearn.metrics import f1_score
import fasttext

train_df = pd.read_csv('train_set.csv',sep='\t',nrows=15000)
train_df['label_ft'] = '__label__' + train_df['label'].astype(str)
train_df[['text','label_ft']].iloc[:-5000]
train_df[['text','label_ft']].iloc[:-5000].to_csv('train.csv',sep='\t')

model = fasttext.train_supervised('train.csv',lr=1.0,wordNgrams=2,verbose=2,minCount=1,epoch=25,loss='hs')
val_pred = [model.predict(x)[0][0].split('__')[-1] for x in train_df.iloc[-5000:]['text']]
f1_score(train_df['label'].values[-5000:].astype(str),val_pred,average='macro')

预测准确率:
在这里插入图片描述

4.1.4 如何使用验证集调参

model = fasttext.train_supervised('train.csv',lr=j,wordNgrams=i,verbose=2,minCount=1,epoch=25,loss='hs')
        val_pred = [model.predict(x)[0][0].split('__')[-1] for x in train_df.iloc[10000:]['text']]
        f1_score(train_df['label'].values[10000:].astype(str),val_pred,average='macro')

零基础入门NLP- 新闻文本分类 TASK4基于深度学习的文本分类1_第2张图片

你可能感兴趣的:(零基础入门NLP- 新闻文本分类 TASK4基于深度学习的文本分类1)