当前位置: 首页 > news >正文

三、N元语法(N-gram)

为了弥补 One-Hot 独热编码的维度灾难语义鸿沟以及 BOW 词袋模型丢失词序信息稀疏性这些缺陷,将词表示成一个低维的实数向量,且相似的词的向量表示是相近的,可以用向量之间的距离来衡量相似度。

N-gram 统计语言模型是用来计算句子概率的概率模型,即某一个词的出现由其前面每一个词出现的概率决定。假设一个长度为N的句子,句子 S=(X1,...,XN),那么这个句子的概率(也就是这 N 个词共同出现的概率)如下:

P(S=(X1,..., XN))=P(X1)P(X2|X1)...P(XN)|X1...X(N-1))

N的取值名称含义
1Unigram当前词出现的概率仅仅与自身相关
2Bigram当前词出现的概率仅仅与前面的1个词相关
3Trigram当前词出现的概率仅仅与前面的2个词相关
.........
NN-gram当前词出现的概率仅仅与前面的(N-1)个词相关

例如,长度为4的序列X1, X2, X3, X4 在Ungram、Bigram和Trigram中的概率分别为:

P(X1, X2, X3, X4) = P(X1)P(X2)P(X3)P(X4)

P(X1, X2, X3, X4) = P(X1)P(X2|X1)P(X3|X2)P(X4|X3)

P(X1, X2, X3, X4) = P(X1)P(X2|X1)P(X3|X1, X2)P(X4|X2, X3)

随着 N 的取值越大,N-gram 模型在理论上越精确,但是也越复杂,需要的计算量和训练语料数据量也就越大,并且精度提升的不够明显,所以在实际的任务中很少使用 n>3 的语言模型。

例如,使用一个含有三句话的微型语料库,而且需要在这三句话的前后分别加上开始符<BOS>和结束符 <EOS>(目的是为了让以某一词为条件的所有概率加起来是 1,从而保证这确实是一个合法的概率分布)接下来我们来看语料:

<BOS>我爱你<EOS>
<BOS>我爱她<EOS>
<BOS>她爱你<EOS>

BOS:Begining Of Sequence,代表序列开始。 EOS:End Of Sequence,代表序列结束。

利用 Bi-gram 计算各个词出现的概率:

  • 单词 "<BOS>" 出现的次数:3次
  • 单词 "我" 出现的次数:2次
  • 单词 "爱" 出现的次数:3次
  • 单词 "你" 出现的次数:2次
  • 单词 "她" 出现的次数:2次
  • 单词 "<EOS>" 出现的次数:3次
  • 二元组 "我爱" 出现的次数:2次
  • 二元组 "爱你" 出现的次数:2次
  • 二元组 "她爱" 出现的次数:1次
  • 二元组 "爱她" 出现的次数:1次
  • 二元组 "<BOS>我" 出现的次数:2次
  • 二元组 "<BOS>她" 出现的次数:1次
  • 二元组 "你<EOS>" 出现的次数:2次
  • 二元组 "她<EOS>" 出现的次数:1次

利用 Bi-gram 计算相邻两个词先后出现的概率: 

  • P(我|<BOS>) = Count(<BOS>我) / Count(<BOS>) = 2/3;
  • P(她|<BOS>) = Count(<BOS>她) / Count(<BOS>) = 1/3;
  • P(爱|) = Count(我爱) / Count(我) = 1;
  • P(<EOS>|你) = Count(你<EOS>) / Count(你) = 1;
  • P(你|) = Count(爱你) / Count(爱) = 2/3;
  • P(她|爱) = Count(爱她) / Count(爱) = 1/3;
  • P(爱|) = Count(她爱) / Count(她) = 1/2;
  • P(<EOS>|她) = Count(她<EOS>) / Count(她) = 1/2.

这样我们就完成了 Bi-gram 各个概率值的计算,整个句子的概率就是挑选出对应的概率相乘即可。

  • P(<BOS>我爱你<EOS>) = P(我|<BOS>) × P(爱|) × P(你|) × P(<EOS>|你) = 2/3 × 1 × 2/3 ×1 = 4/9
  • P(<BOS>我爱她<EOS>) = P(我|<BOS>) × P(爱|) × P(她|) × P(<EOS>|你) = 2/3 × 1 × 1/3 ×1 = 2/9
  • P(<BOS>她爱你<EOS>) = P(她|<BOS>) × P(爱|) × P(你|) × P(<EOS>|你) = 1/3 × 1 × 1 × 2/3 = 2/9

N-gram 语言模型使用统计频次来近似概率值,可能会出现数据稀疏问题:

  • 如果分子为0,估计的概率值为0,由于连乘的方式会导致最终计算出句子的概率值为0;
  • 如果分母为0,分母为0,计算的公式将没有任何意义

相关文章:

  • Foreign Exchange(UVA 10763)
  • D2力扣滑动窗口系列
  • C++ inline关键字总结
  • C++读写Excel(xlnt库的使用)
  • 用一个 Python 脚本实现依次运行其他多个带 argparse 命令行参数的 .py 文件
  • CTP-API开发系列之三:柜台系统简介
  • RAG综述 《Retrieval-Augmented Generation for Large Language Models: A Survey》笔记
  • jupyter notebook 调整深色背景与单元格宽度与自动换行
  • 权限管理系统-0.2.0
  • 前端vite+vue3——可视化页面性能耗时指标(fmp、fp)
  • 蓝桥杯(3.10)
  • WPF 窗口添加投影效果Effect
  • 数据结构之八大排序
  • 数学建模-动态规划(美赛运用)
  • docker本地搭建spark yarn hive环境
  • 分享的文章《人生如棋》
  • $translatePartialLoader加载失败及解决方式
  • angular组件开发
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • Javascripit类型转换比较那点事儿,双等号(==)
  • learning koa2.x
  • Lsb图片隐写
  • Python socket服务器端、客户端传送信息
  • Redis在Web项目中的应用与实践
  • 分布式任务队列Celery
  • 规范化安全开发 KOA 手脚架
  • 基于 Babel 的 npm 包最小化设置
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 携程小程序初体验
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​【已解决】npm install​卡主不动的情况
  • ​TypeScript都不会用,也敢说会前端?
  • ​人工智能书单(数学基础篇)
  • # C++之functional库用法整理
  • (poj1.2.1)1970(筛选法模拟)
  • (超详细)语音信号处理之特征提取
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (二十四)Flask之flask-session组件
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (一)Linux+Windows下安装ffmpeg
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • ***原理与防范
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查