关于nlp:零基础入门NLP-基于深度学习的文本分类1

40次阅读

共计 3870 个字符,预计需要花费 10 分钟才能阅读完成。

学习指标

  • 学习 FastText 的应用和根底调参
  • 应用穿插验证进步精度

文本示意办法 Part2

传统文本示意办法的缺点

在上一节种, 介绍了几种文本示意办法

  • One-hot
  • Bag of words(BoW)
  • N-gram
  • TF-IDF

以上的办法在肯定水平上能够很好的示意文本, 但它们只能挖掘出文本种很无限的信息, 它们更关注文档种单词的统计特色, 而漠视了单词间互相的关系, 并且或多或少存在维度过高的问题.

另外, 通过以上的形式训练的模型, 简直无奈迁徙到其余工作, 因为不同的工作具备不同的字典, 而咱们简直无奈批改训练好的模型中的字典.

这节中, 我会介绍基于深度学习中的其中一种形式FastText, 它更高效, 表达能力也更强.

FastText 介绍

FastText 是一个用于高效的词示意和句子分类的库, fasttext 提供了 2 种模型来计算词示意, 别离是 cbowskip-gram. 上面对这两种模型进行简要介绍

在介绍之前, 还须要理解一个概念, Word Embedding. 因为 cbow 和 skip-gram 都是 word embedding 的具体实现形式.

word embedding 其实更上一节当中的词示意办法很像, 它其实就是词的向量化表现形式, 就好比咱们用 RGB3 个值来示意一个像素一样.

那么为什么须要 embedding 呢, 比方在人类语言中, 词 catdog都是动物, 两者比拟靠近, 那么如何示意两个词比拟类似呢. 再比方 intelligentclever都能够示意聪慧的, 具备雷同的含意; 还有很多这种单词之间的语义关系.

而 word embedding 能够将这种语义关系进行量化, 从而解决这个问题, 在 word embedding 中, 咱们期待同一个类别的词向量在嵌入空间中应该靠的比拟近, 即相互之间的间隔比拟小; 没有关系的词应该相距很远等等.

那么如何在思考单词之间的语义信息下对单词进行量化呢, 这就是接下来介绍的内容了

CBOW(continuous bag of words)

CBOW 也叫间断词袋模型, 它是由一个 3 层的全连贯神经网络形成, 如下图所示

它将每个单词的上下文作为输出, 来预测与上下文绝对应的单词. 比方上面的这个例子: Have a great day

咱们将 great 作为网络输出, 尝试应用单个上下文输出 great 来预测指标单词 day. 具体来说, 应用输出单词的 one-hot 向量输出, 而后评估指标单词(day) 的 one-hot 向量与网络输入的损失. 在预测指标单词的 one-hot 向量的过程中, 网络学习指标单词的向量示意(隐层的输入).

回到上图, 上下文输出是大小为 $V$ 的 one-hot 向量, 隐层蕴含 $N$ 个神经元, 网络的输入是大小为 $V$ 的 softmax 激活函数输入.

整个网络只有最初一个激活函数(softmax), 输出层和隐层之间没有激活函数.

上边的网络只用了一个上下文单词来训练网络, 上面的网络应用了 $C$ 个上下文单词, $W_{V\times N}$ 用来计算隐层的输出

顺次将句子中的每个单词作为 target, 其余单词作为上下文输出, 训练网络, 最终能够失去所有词向量.

Skip-gram

假如当初在一个句子上有一个固定尺寸的滑动窗口, 处于窗口最两头的单词作为 target, 窗口内其余单词(target 右边和 target 左边的单词) 作为上下文单词.

skip-gram 模型训练用来预测在给定的 target 下的上下文单词的概率分布(softmax 的输入). skip-gram 模型的构造如下图所示:

比方上面这句话, 咱们应用 skip-gram 模型来失去每个词的向量示意

“The man who passes the sentence should swing the sword.”– Ned Stark

设定窗口大小为 5, 则窗口每次挪动对应的 targetcontext为如下表所示

Sliding window (size = 5) Target word Context
[The man who] the man, who
[The man who passes] man the, who, passes
[The man who passes the] who the, man, passes, the
[man who passes the sentence] passes man, who, the, sentence
[sentence should swing the sword] swing sentence, should, the, sword
[should swing the sword] the should, swing, sword
[swing the sword] sword swing, the

能够看到, skip-gram 模型构造就像是 cbow 模型程度翻转过去一样, 跟 cbow 模型的构造刚好相同.

FastText 装置以及应用

FastText 举荐在 linux 或者 MacOs 零碎上装置, 须要具备 C ++11 的反对, 如下的装置步骤在 linux 零碎下进行.

# 下载 FastText 安装包
!wget  https://github.com/facebookresearch/fastText/archive/v0.9.2.zip

# 解压
!unzip v0.9.2.zip

# 
%cd fastText-0.9.2

# 对于命令行应用
!make

# 绑定 python, 装置
!pip install .
%cd ..

测试是否装置胜利

# 命令行测试
!./fastText-0.9.2/fasttext

# python 环境测试
import fasttext  
help(fasttext.FastText)

如果能够输入失常的相干命令信息, 则阐明曾经装置胜利

所有准备就绪, 就能够开始应用 FastText 来对文本分类了

# 导入库
import pandas as pd
import os
from collections import Counter
import matplotlib.pyplot as plt
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.metrics import  f1_score
from sklearn.model_selection import train_test_split
from sklearn.linear_model import RidgeClassifier

%matplotlib inline

import fasttext
# help(fasttext.FastText)

# 读取数据
root_dir = '/content/drive/My Drive/competitions/NLPNews'
df = pd.read_csv(root_dir+'/train.csv', sep='\t', nrows=30000)


# 在训练之前须要把标签转换为 fasttext 所须要的格局, label 须要以 `__label__` 结尾
df['label'] = df['label'].apply(lambda x: '__label__' + str(x))
train_df = df.loc[:27000, ['text', 'label']]
train_df.to_csv('train.csv', header=False, index=False, sep='\t')


# loss = 'hs' 示意的是 hierarchical softmax, 它是 softmax 的近似, 但计算更快
"""
epoch: 举荐范畴[5, 50]
lr: 举荐范畴[0.0, 1.0]
wordNgrams: 举荐范畴[1, 5]
"""model = fasttext.train_supervised('train.csv', lr=0.1, wordNgrams=2, verbose=2, minCount=1, epoch=25, loss="hs")

val_pred = [model.predict(x)[0][0].split('__')[-1] for x in df.iloc[-3000:]['text']]

# val_df = train_df.iloc[-3000:]

print('F1_score', f1_score(df.iloc[-3000:]['label'].apply(lambda x: x.split('__')[-1]), val_pred, average='macro'))

F1_score: 0.8008228595916222

穿插验证调参

这里应用 10 折穿插验证, 将数据依照训练集: 验证集 = 9:1 来划分, 因为这里数据量较大, 所以这个比例是没有问题的. 须要留神的是训练集和验证集须要保障是同散布的.

咱们能够事后设定参数搜寻范畴, 比方 wordNgrams: [2, 3, 4], 对搜寻范畴内的每个值都进行穿插验证, 最初取最高的 f1-score 对应的参数取值

总结

这里, 次要学习了两种基于深度学习的文本示意办法 CBOW 和 Skip-gram, 同时应用了 FastText 库对文本进行了分类. 因为硬件限度, 临时没有进行模型的穿插验证, 只是简要阐明.

Reference

[1] FastText install tutorial

[2] Text classification

[3] Introduction to Word Embedding and Word2Vec

[4] Learning Word Embedding

[5] NLP 101: Word2Vec — Skip-gram and CBOW

[6] Datawhale 零根底入门 NLP 赛事 – Task4 基于深度学习的文本分类 1 -fastText

正文完
 0