与传统机器学习不同,深度学习既提供特征提取功能,也可以完成分类的功能。从本章开始我们将学习如何使用深度学习来完成文本表示。
1.学习FastText的使用和基础原理
2.学会使用验证集进行调参
现有的文本表示方法包括:
1.One-hot
2.Bag of Words
3.N-gram
4.TF-IDF
现有的文本表示所存在的缺陷:转换得到的向量维度很高,需要较长时间的训练;没有考虑单词与单词之间的关系,只是进行了统计。
与这些文本表示方法不同,深度学习也可以用来进行文本表示,还可以将其映射到一个低维空间。其中比较典型的方法有:FastText、Word2Vect、Bert。本章介绍FastText方法。
FastText是一种典型的深度学习词向量的表示方法,它非常简单的通过Embedding层将单词映射到稠密空间,然后将句子中所有单词在Embedding空间中进行平均,进而完成分类操作。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
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')
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')