N-grams模型

自然语言处理过程中,一个值得我们主义的是,如果我们仅仅是将文本字符串分割成单独的文本,此时我们只是简单的去分析文本中每个字符所代表的潜在意义与我们需要分析的结果的关系性,然而我们忽略一个非常重要的信息,文本的顺序是含有非常重要的信息的。

举一个简单的例子,“钓鱼”两个词,如果我们单独去分析这两个词,而不是看作一个整体的话,那么我们得到的语意意思就是“钓”是一个动作词,“鱼”是一个名词,而当两个字放在一起的时候,我们知道其实我们想表述的“钓鱼”是我们要做的一个活动(event)。
又比如英文“hot dog”,我们都知道这个词组想表达的是我们吃的食物“热狗香肠包”,所以我们不希望单独去看hot和dog两个意思,如果是这样子我们可以看出意思相差非常的远,由此我们可以看出文本顺序的重要性。

而实际操作中,我们将这种把文本顺序保留下来的行为称为建立N-grams模型,也就是我们将一个字符串分割成含有多个词的标识符(tokens)。他们都属于文本字符串Tokenization的一个过程。

import re
from nltk.util import ngramssentence = "I love deep learning as it can help me resolve some complicated problems in 2018."# tokenize the sentence into tokens
pattern = re.compile(r"([-\s.,;!?])+")
tokens = pattern.split(sentence)
tokens = [x for x in tokens if x and x not in '- \t\n.,;!?']bigrams = list(ngrams(tokens, 2))
print([" ".join(x) for x in bigrams])

输出结果为:
['I love', 'love deep', 'deep learning', 'learning as', 'as it', 'it can', 'can help', 'help me', 'me resolve', 'resolve some', 'some complicated', 'complicated problems', 'problems in', 'in 2018']

上述代码的执行是首先将文本字符串分割成单独(unique)标识符,并且引入了正则表达式来更精准的分割字符串。除此之外,我们运用了NLTK的库来分割出一个含有两个词(Bi-Gram)的标识符。所以从上面我们可以看出,如“deep learning"和”complicated problems“这样子的组合更切合我们想要表达的意思,但是独个字符看的话我们就未必看得出了。

虽然N-grams模型可以让我们更好的去分割出具有更好语义的标识符,进而让我们做进一步文本分析,但是缺点也是同样明显,那就是运用N-grams模型可能让我们的词汇量成指数级的增长,并且并不是所有的Bigram都含有有用信息,而这个情况在甚至乎在Trigram或者Quad gram等含有更多单独字符在内的N-grams模型会更严重。这样子做产生的问题就是我们最终拿到的特征向量(the dimension of the feature)的维度将会超过我们本身的文件样本数(length of the documents),而最终当我们将这些提取出来的特征放入到机器学习算法的话,就会导致过拟合(over fitting)的情况。如此训练出来的模型将没有什么太好的performance和预测能力。

fastText中的N-gram特征

fastText有个比较突出的问题——就是丢失了词顺序的信息,因为隐层是通过简单的求和取平均得到的。为了弥补这个不足,fastText增加了N-gram的特征。

为了处理词顺序丢失的问题,fastText增加了N-gram的特征。具体做法是把N-gram当成一个词,也用embeddding向量来表示,在计算隐层时,把N-gram的embedding向量也加进去求和取平均。举个例子来说,假设某篇文章只有3个词,W1,W2和W3,N-gram的N取2,w1、w2、w3以及w12、w23分别表示词W1、W2、W3和bigram W1-W2,W2-W3的embedding向量,那么文章的隐层可表示为:

通过back-propagation算法,就可以同时学到词的Embeding和n-gram的Embedding了。具体实现上,由于n-gram的量远比word大的多,完全存下所有的n-gram也不现实。FastText采用了Hash桶的方式,把所有的n-gram都哈希到buckets个桶中,哈希到同一个桶的所有n-gram共享一个embedding vector。如下图所示:

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

Reference

https://www.cnblogs.com/jielongAI/p/10189907.html
https://blog.csdn.net/qq_43019117/article/details/82770124

浅谈fastText中的N-gram特征相关推荐

  1. 浅谈Java中的Set、List、Map的区别

    就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...

  2. 浅谈数据分析中的“暗物质”

    浅谈数据分析中的"暗物质" 我们分析数据,更重要的是看到数据中所隐藏的暗物质,即数据图中你看不见的数据\逻辑\知识. 开门见山,以下是某新闻媒体WAP\APP\PC三端的分周中和周 ...

  3. swift 引用其他类_浅谈swift中闭包修饰符 weak?unowned? 或什么都不用

    浅谈swift中闭包修饰符 weak?unowned? 或什么都不用 平常的开发中,clourse是我们iOSr绕不过去的坎儿. 苹果本身也很重视闭包,像之前的一些老的target-action类型的 ...

  4. matlab泊松分布随机数和图像_浅谈可靠性理论中的常用概率分布

    浅谈可靠性理论中的常用概率分布 1. 泊松分布 基本原理 泊松分布是最常见的离散概率分布,适合描述单位时间内随机事件发生的概率. (1) 泊松分布概率密度(不可靠度)计算公式 MATLAB概率密度函数 ...

  5. 浅谈Android中的MVP与动态代理的结合

    浅谈Android中的MVP与动态代理的结合 本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 在Android开发平台上接触MVP足足算起来大概已经有一个年头左右.从最开始到现在经 ...

  6. java 中的单元测试_浅谈Java 中的单元测试

    单元测试编写 Junit 单元测试框架 对于Java语言而言,其单元测试框架,有Junit和TestNG这两种, 下面是一个典型的JUnit测试类的结构 package com.example.dem ...

  7. mybatis与php,浅谈mybatis中的#和$的区别

    浅谈mybatis中的#和$的区别 发布于 2016-07-30 11:14:47 | 236 次阅读 | 评论: 0 | 来源: 网友投递 MyBatis 基于Java的持久层框架MyBatis 本 ...

  8. 浅谈CSS3中display属性的Flex布局,关于登陆页面属性框的设置

    声明:本文转发自三里屯柯南的浅谈CSS3中display属性的Flex布局http://www.cnblogs.com/xuyuntao/articles/6391728.html 基本概念 采用Fl ...

  9. python sys模块作用_浅谈Python中的模块

    模块 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在Python中,一个.py文件就称之为一个模块(Mod ...

最新文章

  1. 查看回调几个选项含义_C 盘总是莫名变大?更改这个文件位置至少腾出几个 G !...
  2. VMWARE错误-“VirtualInfrastructure.Utils.ClientsXml“的类型初始值设定项引发异常
  3. ts包、表、子表、section的关系
  4. maven spring profile 协同
  5. 源码免杀-过启发式的思路
  6. [转]设计模式六大原则[1]:单一职责原则
  7. java长按底栏_java - 如何在导航抽屉物品中添加长按功能? - SO中文参考 - www.soinside.com...
  8. 基于JavaScript+css的购物网站项目
  9. 2021雪花飘新年倒计时源码
  10. vue 实现高德地图搜索地址获取经纬度
  11. mysql 免费报表工具_10款最出色的免费数据库管理工具
  12. python3调用cpp的方法——python调用so
  13. Python第五天的学习分享
  14. 期望收益率、方差、协方差、相关系数的计算公式
  15. 基于Boostrap+jsp+spring+mysql的音乐推荐系统
  16. VUE制作谷歌浏览器多类型截屏、抓取信息的插件
  17. python输入输入:input、map
  18. 为什么建议大家使用 Linux 开发?有那么爽吗?
  19. 学习成长之路 (初章 三个月建成微信 小程序商城、ArcEngine C# GIS开发入门)
  20. 解决 cnpm : 无法加载文件 C:\Users\hp\AppData\Roaming\npm\cnpm.ps1,因为在此系统上禁止运行脚本。

热门文章

  1. 记账本——UML建模
  2. 每天学一个 Linux 命令(14):cat
  3. 蚂蚁金服前端第一次电面(校招)笔记整理
  4. mysql修改重复数据You can‘t specify target table ‘‘ for update in FROM clause
  5. 【Ajax】简单入门 - 不深究
  6. Rust crates镜像源管理 crm
  7. 又一家安防公司即将登录创业板-睿联Reolink
  8. 项目实训----Unity多人游戏开发----第十篇
  9. 输入5整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。
  10. 【Python爬虫】403 Forbidden