fastText 的 Python接口:https://github.com/salestock/fastText.py
(1) fasttext 简介:
FastText是Facebook开发的一款快速文本分类器,提供简单而高效的文本分类和表征学习的方法,性能比肩深度学习而且速度更快。
fastText 方法包含三部分:模型架构、层次 Softmax 和 N-gram 特征。
模型架构:fastText 模型输入一个词的序列(一段文本或者一句话),输出这个词序列属于不同类别的概率。序列中的词和词组组成特征向量,特征向量通过线性变换映射到中间层,中间层再映射到标签。fastText 在预测标签时使用了非线性激活函数,但在中间层不使用非线性激活函数。
层次softmax:在某些文本分类任务中类别很多,计算线性分类器的复杂度高。为了改善运行时间,fastText 模型使用了层次 Softmax 技巧。层次 Softmax 技巧建立在哈夫曼编码的基础上,对标签进行编码,能够极大地缩小模型预测目标的数量。
N-gram 特征:fastText 可以用于文本分类和句子分类。不管是文本分类还是句子分类,我们常用的特征是词袋模型。但词袋模型不能考虑词之间的顺序,因此 fastText 还加入了 N-gram 特征。
(2)分类过程
fasttext在进行文本分类时,huffmax树叶子节点处是每一个类别标签的词向量。在训练过程中,训练语料的每一个词也会得到响应的词向量。输入为一个window 内的词对应的词向量,隐藏层为这几个词的线性相加。相加的结果作为该文档的向量。再通过softmax层得到预测标签。结合文档真实标签计算 loss,梯度与迭代更新词向量(优化词向量的表达)。
参数方面的建议:
1. loss function 选用 hs(hierarchical softmax)要比 ns(negative sampling)训练速度更快,准确率也更高
2. wordNgram 默认为1,建议设置为 2 或以上更好
3. 如果词数不是很多,可以把 bucket 设置小一些,否则会预留太多的 bucket 使模型太大
(3) 初步使用示例
1.我们先获得一批训练语料,格式是 已经分词的文档 + /t + __label__标签,比如 fasttex_train.txt 文件中,部分数据如下
驻 阿 北约 部队 打死 两名 阿富汗 平民 中新网 6 月 12 日电 据 美国 媒体报道 , 驻 阿 北约 部队 11 日 在 阿富汗 东部 使用 迫击炮 打击 武装 分子 时 , 打死 两名 平民 。 北约 部队 当天 发表声明 称 , 北约 部队 在 Kunar 省 受到 了 武装 分子 袭击 , 随后 北约 部队 使用 迫击炮 进行 反击 , 但 打死 两名 平民 , 打伤 五人 。 此外 , 同样 在 Kunar 省 , 当天 阿富汗 一辆 卡车 同 北约 部队 车辆 相撞 , 导致 四名 阿富汗 平民 丧生 。 声明 并未 提及 两车 相撞 的 原因 。 <span> </span>__label__affairs
俄罗斯 发射 飞船 为 国际 空间站 送货 新华网 快讯 : 北京 时间 15 日 9 时 15 分 , 俄罗斯 在 哈萨克斯坦 境内 的 拜科努尔 发射场 发射 了 一艘 货运 飞船 , 它 将 为 国际 空间站 送去 总重 约 2.5 吨 的 货物 。 <span> </span>__label__affairs
2.训练模型 ,由于代码插入出现混乱,故改用文本格式
import fasttext
# 第一个参数是前面得到的 fasttex_train.txt ,第二个参数是将要保存模型的路径,默认会加上 .bin
# label_prefix 就是标签或类别的起始符号
classifier = fasttext.supervised("fasttext_train.txt","fasttext.model",label_prefix = "__label__")
3.测试模型和使用模型分类
import fasttext
# 加载模型
classifier = fasttext.load_model("fasttext.model.bin",label_prefix = "__label__")
# 测试模型 其中 fasttext_test.txt 就是测试数据,格式和 fasttext_train.txt 一样
result = classifier.test("fasttext_test.txt")
print "准确率:",result.precision
print "回归率:",result.recall
# 使用模型,以测试集中第一个文档为例
f = open("fasttext_test.txt")
line = f.readlines()[0]
f.close()
result = classifier.predict([line])
print result
输出结果如下:
---------------------
作者:ouprince
来源:CSDN
原文:https://blog.csdn.net/qq_32023541/article/details/80839800
版权声明:本文为博主原创文章,转载请附上博文链接!