专栏首页mathorfastText细节及实践

fastText细节及实践

fastText模型是类似CBOW的三层结构,关于这个结构的介绍,很多博客都讲了,这里我不多赘述,我主要叙述一下其中的部分细节

N-gram

输入层是文档中所有词的词向量和文档中各个单词的n-gram向量。隐藏层是这些向量的叠加平均

从输入开始,fastText和CBOW就不一样,主要在于fastText的输入还包括每个单词的n-gram。举个例子,假设某个文档中只有三个词I like apple,N-gram的N取3,那么隐藏层可表示为

这样做有什么好处?我们知道,"apple"和"apples"在通常情况下几乎是同一个意思,但是如果仅使用传统的方法,以词为单位作为输入,输入的是每个词的one-hot编码,而"apple"和"apples"的one-hot可能并没有任何关系。但如果考虑n-gram,它俩在字符级别是非常相似的,这样最终训练出来的词向量相比传统方法会更好

Hash

由于n-gram的量远比word大的多,完全存下所有的n-gram不太现实。fastText采用的是Hash桶的方式,把所有的n-gram映射到buckets个桶中,而映射到相同桶的n-gram共享同一个embedding vector,如下图所示

图中Win代表整个Embedding矩阵,其中前V行是word Embedding,后Buckets行是n-gram Embedding,每个n-gram通过hash函数之后映射到0~Bucket-1位置,得到对应的embedding向量。用哈希的方式既能保证查找时O(1)的效率,又可能把内存消耗控制在O(buckets * dim)范围内。不过这种方法潜在的问题是存在哈希冲突,不同的n-gram可能会共享同一个embedding。如果桶大小取的足够大,这种影响会很小

实践

实验的平台为google colab

首先安装fastText,可能您看到这篇文章的时候,fastText已经更新了最新版本,在这里查看最新的版本号

!wget https://github.com/facebookresearch/fastText/archive/v0.9.2.zip
!unzip v0.9.2.zip
%cd fastText-0.9.2
!make

自定义一个简单的数据集,做文本分类任务,其中__label__是每个类别的默认前缀

# 0 is positive, 1 is negative
with open('train.txt', 'w') as f:
  f.write('__label__0 i love you\n')
  f.write('__label__0 he loves me\n')
  f.write('__label__0 she likes baseball\n')
  f.write('__label__1 i hate you\n')
  f.write('__label__1 sorry for that\n')
  f.write('__label__1 this is awful')

with open('test.txt', 'w') as f:
  f.write('i like you\n')
  f.write('sorry hate you\n')

然后开始训练

!./fasttext supervised -input train.txt -output model -dim 2 -wordNgrams 2 -lr 0.7 -epoch 50 -loss ns -neg 2

最后对测试集进行预测

!cat test.txt
!./fasttext predict model.bin test.txt

参考文献

N-gram特征,浅谈FastText文本分类利器解读(2)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 枚举+优化(7)——前缀和1

    mathor
  • 斐波那契博弈(fibonacci Game)

    mathor
  • 配置404、Error页面以及其他常用技巧

     假设你jsp项目里java代码片出现某些问题,产生异常等等之类的,网页总是显示一堆英文提示,那你就等着电话被客户打爆吧......开玩笑的,举个简单的例子,你...

    mathor
  • 一次极限项目管理,设计,开发,联调与测试

         什么是All In? 是你不知道全力做这件事情会得到什么。但你只想把它做好的感觉。

    用户3003813
  • Python告诉你想开一家美食店该怎么做

    大家好,又到了Python爬虫+数据分析可视化的专题,今天案例是对美团网杭州市美食团购的数据进行分析,如果已经或者最近有打算开一家美食团购店铺的读者,希望本文能...

    刘早起
  • 图像处理代码的一些思考

    {m_DC.FillSolidRect(0,0,m_Width,m_Height,clr);}

    流川疯
  • 这是不是 PowerBI 原生作图的最高境界 - 案例:对比积累分析图

    如果让分析师去做一些高信息含量的图表,那该图一定位列其中,因为企业几乎都是是目标(结果)导向的,对此,KPI的达成就是关键的信息了。

    BI佐罗
  • 关于红包的几种玩法

    贪婪是人类最原始的欲望,天主教把它作为教义中的七宗罪之一。抢红包激发了这种欲望,是一种天性的释放。所以抢红包变得非常火。另外我们也很容易发现红包行为主要发生在社...

    Shawn.W
  • java面试知识要点汇总(基础和集合)

    反射机制是Java语言中一个非常重要的特性,它允许程序在运行时进行自我检查,同时也允许对其内部成员进行操作。反射机制提供的功能主要有:得到一个对象所属的类;获取...

    用户1637228
  • 把 Docker镜像装到仓库需要几步?

    使用docker tag 命令为镜像打上标记,比如为网易蜂巢(已改名网易云)镜像仓库推送镜像,首先需要为镜像做好标记;

    用户1560186

扫码关注云+社区

领取腾讯云代金券