最近在做对话机器人,使用了调研之后使用了fasttext,主要考虑对话机器人主要是短文本,而且与基于神经网络的文本分类算法相比它主要由两个优点
(1)首先FastText在保持高精度的同时极大地加快了训练速度和测试速度。
(2)再有就是不需要使用预先训练好的词向量,因为FastText会自己训练词向量
1.fasttext 安装:
pip install fasttext
2.fasttext 使用过程:
(1)中文对话不同于英文,英文的单词之间有空格,天然的分词。但是中文就不同,需要首先分词(这里不展开分词,后面写个专题吧)
# 使用的hanlp分词,去掉停用词(具体参考pyhanlp的用法)
NotionalTokenizer = JClass("com.hankcs.hanlp.tokenizer.NotionalTokenizer")
words = NotionalTokenizer.segment(text)
(2)fasttext 数据标注,fasttext 分类属于有监督学习(word2vec属于无监督学习),有监督学习首先需要进行文本标注
# 前面是__label__ + 标签,然后后面跟tab, 后面是分词之后的文本
__label__1 内容1
__label__2 内容2
__label__3 内容3
__label__4 内容4
(3)有了分类文本之后,开始训练模型,训练过程非常快
# 数据训练好之后,开始预测模型
classifier = fasttext.supervised("fastText_train.txt", 'models/fasttext_train.model',
label_prefix='__label__',
loss='hs',
epoch=30,
word_ngrams=2,
bucket=2000000)
# fasttext 分类可以调参的参数如下
./fasttext supervised
Empty input or output path.
The following arguments are mandatory:
-input training file path
-output output file path
The following arguments are optional:
-lr learning rate [0.05]
-lrUpdateRate change the rate of updates for the learning rate [100]
-dim size of word vectors [100]
-ws size of the context window [5]
-epoch number of epochs [5]
-minCount minimal number of word occurences [1]
-neg number of negatives sampled [5]
-wordNgrams max length of word ngram [1]
-loss loss function {ns, hs, softmax} [ns]
-bucket number of buckets [2000000]
-minn min length of char ngram [3]
-maxn max length of char ngram [6]
-thread number of threads [12]
-t sampling threshold [0.0001]
-label labels prefix [__label__]
-pretrainedVectors pretrained word vectors for supervised learning []
#针对上述参数:
#训练模式下涉及到的主要参数有学习率(-lr),隐层的维数(-dim),最小词频(-minCount),负采样个数(-neg)和n-grams的长度(-wordNgrams)等。
# word_ngrams 大于1时,模型的精度会提交很多,但是模型的大小也是很大不少,不建议设置太大,因为训练的复杂度和模型的大小会指数级增长,我们在训练的时候使用的是2,需要注意的是修改了 word_ngrams,需要相应的调整bucket,bucket设置的小一点,否则预留会预留太多bucket使模型太大
#-lr 设置过大不容易收敛,太小容易过拟合,训练速度也会变慢,我们使用的是默认
# loss 损失函数选用hs(hierarchical softmax)要比ns(negative sampling) 训练速度要快很多倍,并且准确率也更高
# pretrainedVectors 可以使用已经训练好的word2vec模型,训练现有的数据,好久就是训练样本中没有的词,在预测的时候会大概率避免不能转化为向量,不好的地方就是,模型会更大,下载地址https://fasttext.cc/docs/en/crawl-vectors.html
(4)有了模型之后,可以使用模型进行预测
model = fasttext.load_model('chatbot/classify/models/fasttext_train.model.bin', label_prefix='__label__')
labels = model.predict_proba(["重庆 永川 消防 提示 夏季 酷暑 来临 警惕 火灾 隐患 "])
print(labels)
#[[('新闻', 0.560547)]]

本文介绍了如何在对话机器人项目中应用FastText。由于FastText在保持高精度的同时提高了训练和测试速度,并且能自训练词向量,因此被选中。文章涉及FastText的安装、中文分词、数据标注、模型训练和预测过程。
1213

被折叠的 条评论
为什么被折叠?



