项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步

前言

最近一直在处理文本相关的一些内容,涉及到文本分类等工作。正好趁此机会,针对于文本相关的问题记录一个系列的内容,争取将文本处理过程中用到的一些技术做下大致的归纳总结。

1.什么是语言模型

所谓的语言模型,简单来说,就是看一句话到底是不是人话。或者说,语言模型是用来计算一个句子概率的模型,也就是计算一句话是不是人话的概率。

那么如何计算这个句子的概率呢?给定一个句子,假设这个句子的序列为
S=w1,w2,⋯,wkS = w_1,w_2,\cdots, w_kS=w1​,w2​,⋯,wk​
那么这个概率给可以表示为:
P(S)=P(w1,w2,⋯,wk)=p(w1)p(w2∣w1)⋯p(wk∣w1w2,⋯,wk−1)P(S) = P(w_1, w_2, \cdots, w_k) = p(w_1)p(w_2|w_1)\cdots p(w_k|w_1w_2,\cdots, w_{k-1})P(S)=P(w1​,w2​,⋯,wk​)=p(w1​)p(w2​∣w1​)⋯p(wk​∣w1​w2​,⋯,wk−1​)

如果直接使用上面的方法,存在两个致命的问题:
1.参数空间过大:条件概率P(wn|w1,w2,…,wn-1)的可能性太多,无法估算,不可能有用,就是俗称的维度灾难(curse of dimensionality)。
2.数据稀疏严重:对于非常多词对的组合,在语料库中都没有出现,依据最大似然估计得到的概率将会是0。

2.马尔科夫链(Markov chain)

为了解决參数空间过大的问题。引入了马尔科夫假设:随意一个词出现的概率只与它前面出现的有限的一个或者几个词有关。这就是所谓的n-gram模型。
如果一个词的出现于周围的词独自,我们称之为unigram即一元语言模型:
P(S)=p(w1)∗p(w2)∗p(w3)⋯∗p(wn)P(S) = p(w_1)*p(w_2)*p(w_3)\cdots*p(w_n)P(S)=p(w1​)∗p(w2​)∗p(w3​)⋯∗p(wn​)
如果一个词的出现依赖于前面出现的一个词,那么我们就称之为bigram:
KaTeX parse error: No such environment: align* at position 7: \begin{̲a̲l̲i̲g̲n̲*̲}̲ P(S) &= P(w_1…

在实践中用的最多的就是bigram和trigram(三元模型)了,高于四元的用的非常少,由于训练它须要更庞大的语料,并且数据稀疏严重,时间复杂度高,精度却提高的不多。

3.如何计算概率

关于n-gram模型,基本思路可以总结如下:
1.句子可以看成是一系列词组成的。
2.每一种排列情况都能够通过条件概率公式计算得到一个表示这个句子合理性的概率。
3.通过马尔科夫链,减小了计算量。

一般来说,N元模型就是假设当前词的出现概率只与它前面的N-1个词有关。而这些概率参数都是可以通过大规模语料库来计算,比如三元概率有:
P(wi∣wi−1,wi−2)=count(wi−2wi−1wi)count(wi−2wi−1)P(w_i|w_{i-1}, w_{i-2}) = \frac {count(w_{i-2}w_{i-1}w_i)} {count(w_{i-2}w_{i-1})}P(wi​∣wi−1​,wi−2​)=count(wi−2​wi−1​)count(wi−2​wi−1​wi​)​

实际中n的取值大小,其实是模型精度与计算能力之间的一个平衡。理论上,n越大,模型越精确,越能反应句子的真实情况,但是需要的计算量也越大。当n超过4以后,模型准确度提升有限,但是计算量却大了很多。所以实际中一般使用bigram与trigram最多。

4.平滑

语言模型中需要知道的所有的条件概率,我们称之为模型的参数,从语料中获得这些概率的过程就是模型学习的过程。
从第三部分易知,模型训练的过程,其实就是语料库中词频的统计计算问题。往往会出现这样的情况:两个词同时出现的次数为0,那么根据公式应有P(wi∣wi−1)=0P(w_i|w_{i-1}) = 0P(wi​∣wi−1​)=0。或者反过来,两个词同时只出现一次,而且wi−1w_{i-1}wi−1​也只出现一次,那么P(wi∣wi−1)=1P(w_i|w_{i-1}) = 1P(wi​∣wi−1​)=1。显然这些都是不合理的。
如果某个P(wi∣wi−1)=0P(w_i|w_{i-1}) = 0P(wi​∣wi−1​)=0,因为概率的整体计算为连乘运算,将导致整体结果为0,这种情况我们是不希望看到的,此时需要进行相应的平滑操作。一般只要是有概率连乘出现的地方,我们都需要对其进行平滑。
比如最简单的一种平滑方式:
P(wi∣wi−1,wi−2)=count(wi−2wi−1wi)+λcount(wi−2wi−1)+λVP(w_i|w_{i-1}, w_{i-2}) = \frac {count(w_{i-2}w_{i-1}w_i) + \lambda} {count(w_{i-2}w_{i-1}) + \lambda V}P(wi​∣wi−1​,wi−2​)=count(wi−2​wi−1​)+λVcount(wi−2​wi−1​wi​)+λ​
其中,V表示词库的大小。

5.怎么使用n-gram进行分类

其实很简单了,只要根据每个类别的语料库训练各自的语言模型,也就是频率分布表,实质上就是每一个篇章单元的类别都有一个概率分布,当新来一个篇章单元的时候,只要根据各自的语言模型,计算出每个语言模型下这个篇章单元的发生概率,篇章单元在哪个模型的概率大,这篇文本就属于哪个类别了。

文本分类之一:语言模型相关推荐

  1. 【Transformers】第 5 章:微调文本分类的语言模型

  2. [预训练语言模型专题] 十分钟了解文本分类通用训练技巧

    欢迎大家来到预训练语言模型的专题系列分享,本篇推送是该专题系列的第三篇.在前两篇推送[萌芽时代],[风起云涌]中,我们分享了该领域的奠基文章以及声名鹊起却生不逢时的ELMo模型,本期我们带来的文章将会 ...

  3. [PLM专题] 十分钟了解文本分类通用训练技巧

    前言 欢迎大家来到预训练语言模型的专题系列分享,本篇推送是该专题系列的第三篇.在前两篇推送[萌芽时代],[风起云涌]中,我们分享了该领域的奠基文章以及声名鹊起却生不逢时的ELMo模型,本期我们带来的文 ...

  4. 用迁移学习创造的通用语言模型ULMFiT,达到了文本分类的最佳水平

    https://www.jqr.com/article/000225 这篇文章的目的是帮助新手和外行人更好地了解我们新论文,我们的论文展示了如何用更少的数据自动将文本分类,同时精确度还比原来的方法高. ...

  5. 【文本分类】基于预训练语言模型的BERT-CNN多层级专利分类研究

    ·阅读摘要:   本文利用BERT的预训练数据,结合CNN,应用于专利分类.由于专利的特性,本文还提出使用多层级方法来增强模型.(文章发表在<中文信息学报>,核心期刊) ·参考文献:    ...

  6. 一文综述经典的深度文本分类方法

    作者 |  何从庆 转载自AI算法之心(ID:AIHeartForYou) 笔者整理最近几年比较经典的深度文本分类方法,希望帮助小伙伴们了解深度学习在文本分类中的应用. Convolutional N ...

  7. 五年12篇顶会论文综述!一文读懂深度学习文本分类方法

    作者 | 何从庆 来源 | AI算法之心(ID:AIHeartForYou) 最近有很多小伙伴想了解深度学习在文本分类的发展,因此,笔者整理最近几年比较经典的深度文本分类方法,希望帮助小伙伴们了解深度 ...

  8. 第六课.NLP文本分类任务

    第六课目录 NLP文本分类简介 IMDB数据集准备 设置随机种子 下载IMDB并划分数据集 构建词汇表 使用torchtext生成batch WordAveraging 模型定义 加载由glove.6 ...

  9. 【文本分类】BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

    ·阅读摘要:   Bert是继Transformer之后的又一杰出的模型.Bert是一种预训练语言模型,是在GPT.Elmo.Transformer的基础上提出的.基于Bert的多个NLP领域任务都取 ...

  10. 《预训练周刊》第20期:EVA:包含28亿参数的中文预训练对话模型、基于知识融入提示词的文本分类...

    No.20 智源社区 预训练组 预 训 练 研究 观点 资源 活动 关于周刊 超大规模预训练模型是当前人工智能领域研究的热点,为了帮助研究与工程人员了解这一领域的进展和资讯,智源社区整理了第20期&l ...

最新文章

  1. 想知道数据表的用户或系统异动时间
  2. tomcat屏蔽ip
  3. 使用Java方法实现 Double和String相互转化
  4. android设置列表id,学习Android绑定列表的时候提示:You must supply a resource ID for a TextView,有完整示例代码...
  5. 【0ms优化】剑指 Offer 18. 删除链表的节点
  6. 如何在Debian上安装配置ownCloud
  7. MySql5.7.12设置log-bin
  8. 下一代 Node 强势来袭:Deno
  9. 22.分布式系统基础设施
  10. linux中查找grep与find命令的使用
  11. 全网首发:LINUX给进程内容窗口改名的第二种方法
  12. 微信 qq浏览器服务器,QQ浏览器与微信团队合作推出“微信电脑版”
  13. 【案例】凤凰新华物流:探索智能化图书发行物流体系建设,助力出版行业担当文化建设使命-WMS
  14. 消防给水及消火栓系统技术规范_消防给水——消火栓系统分区给水剖析
  15. QTableWidget获取一行数据
  16. MPEG PS流格式
  17. python假期培训班
  18. 【名企面试经验-新浪-校招提前批】【数据平台研发工程师】
  19. 深圳一AI公司人脸数据泄露,超256万用户敏感信息在“裸奔”!
  20. vue版本的仿京东放大镜代码还有原生js版本的。(组件封装)

热门文章

  1. 分享几个Python小技巧函数里的4个小花招 1
  2. [ NOI 2005 ] 聪聪与可可
  3. docker管理神器—kubernetes—直接路由篇
  4. 系统架构技能之设计模式-单件模式
  5. 腾讯正式对外开源高性能 RPC 开发框架与微服务平台Tars
  6. leetcode -- Maximum Subarray
  7. 设计模式实现一个简单的缓存
  8. bzoj2530 [POI2011]Party
  9. 反射机制——获取Class中的方法
  10. R实例:非典型的数据可视化(一)