学习笔记(3)——二元语法

语言模型

语言模型 指的是对语言现象的数学抽象。即给定一个句子 w,语言模型就是计算句子的出现概率 p(w) 的模型,而统计的对象就是人工标注而成的语料库。

数据稀疏 :p(w) 的计算非常难,句子数量无穷无尽。即便是大型语料库,也只能“枚举”有限的数百万个句子。实际遇到的句子大部分都在语料库之外,意味着它们的概率都被当作0。

句子一般不重复,但单词是在重复使用,所以把句子表示成单词列表: w 1 w 2 ⋯ w k w_{1} w_{2} \cdots w_{k} w1w2wk,每个 w t , t ∈ [ 1 , k ] w_{t}, t \in[1, k] wt,t[1,k]都是一个单词,定义语言模型:

p ( w ) = p ( w 1 w 2 ⋯ w k ) = p ( w 1 ∣ w 0 ) × p ( w 2 ∣ w 0 w 1 ) × ⋯ × p ( w k + 1 ∣ w 0 w 1 w 2 … w k ) = ∏ t = 1 k + 1 p ( w t ∣ w 0 w 1 ⋯ w t − 1 ) \begin{aligned} p(\boldsymbol{w}) &=p\left(w_{1} w_{2} \cdots w_{k}\right) \\ &=p\left(w_{1} \mid w_{0}\right) \times p\left(w_{2} \mid w_{0} w_{1}\right) \times \cdots \times p\left(w_{k+1} \mid w_{0} w_{1} w_{2} \ldots w_{k}\right) \\ &=\prod_{t=1}^{k+1} p\left(w_{t} \mid w_{0} w_{1} \cdots w_{t-1}\right) \end{aligned} p(w)=p(w1w2wk)=p(w1w0)×p(w2w0w1)××p(wk+1w0w1w2wk)=t=1k+1p(wtw0w1wt1)

其中, w 0 = B O S w_{0}=B O S w0=BOS (Begin Of Sentence, 有时用 s),
w k + 1 = E O S ( w_{k+1}=E O S( wk+1=EOS( EndOfSentence , , , 有时也用 < / s > ) </ s>) </s>)

随句子长度增大,语言模型会遇到如下两个问题:

  • 数据稀疏 指的是长度越大的句子越难出现,可能统计不到频次,即 p ( w k ∣ w 1 w 2 … w k − 1 ) = 0 p\left(w_{k} \mid w_{1} w_{2} \ldots w_{k-1}\right)=0 p(wkw1w2wk1)=0
  • 计算代价大 k 越大,需存储的 p 就越多,即便用字典树索引,依然代价不菲。

马尔可夫链与二元语法

为解决以上两个问题,需要使用马尔可夫假设来简化语言模型。
马尔可夫链 :给定时间线上有一串事件顺序发生,假设每个事件的发生概率只取决于前一个事件,那么这串事件构成的因果链被称作马尔可夫链。

在语言模型中,第 t 个事件指的是 Wt 作为第 t 个单词出现。即每个单词出现的概率只取决于前一个单词:

p ( w t ∣ w 0 w 1 … w t − 1 ) = p ( w t ∣ w t − 1 ) p\left(w_{t} \mid w_{0} w_{1} \ldots w_{t-1}\right)=p\left(w_{t} \mid\right.w_{t-1}) p(wtw0w1wt1)=p(wtwt1)

此时的语言模型称为二元语法模型

p ( w ) = p ( w 1 w 2 ⋯ w k ) = p ( w 1 ∣ w 0 ) × p ( w 2 ∣ w 1 ) × ⋯ × p ( w k + 1 ∣ w k ) = ∏ t = 1 k + 1 p ( w t ∣ w t − 1 ) \begin{aligned} p(\boldsymbol{w}) &=p\left(w_{1} w_{2} \cdots w_{k}\right) \\ &=p\left(w_{1} \mid w_{0}\right) \times p\left(w_{2} \mid w_{1}\right) \times \cdots \times p\left(w_{k+1} \mid w_{k}\right) \\ &=\prod_{t=1}^{k+1} p\left(w_{t} \mid w_{t-1}\right) \end{aligned} p(w)=p(w1w2wk)=p(w1w0)×p(w2w1)××p(wk+1wk)=t=1k+1p(wtwt1)

由于语料库中二元连续的重复程度要高于整个句子的重要程度,缓解了数据稀疏的问题,另外二元连续的总数量远远小于句子的数量,存储和查询也得到了解决。

n元语法

n元语法 的定义:每个单词的概率仅取决于该单词之前的 n 个单词:

p ( w ) = ∏ t = 1 k + n − 1 p ( w t ∣ w t − n + 1 ⋯ w t − 1 ) p(w)=\prod_{t=1}^{k+n-1} p\left(w_{t} \mid w_{t-n+1} \cdots w_{t-1}\right) p(w)=t=1k+n1p(wtwtn+1wt1)

当 n=1 时的 n 元语法称为一元语法 ( unigram) ;当 n=3 时的 n 元语法称为三元语法(trigram); n≥4时数据稀疏和计算代价又变得显著起来,实际工程中几乎不使用。

数据稀疏与平滑策略

对于 n 元语法模型,n 越大,数据稀疏问题越严峻。一个解决方案是利用低阶 n 元语法平滑高阶 n 元语法。所谓平滑 ,就是字面上的意思:使 n 元语法频次的折线平滑为曲线。最简单的一种是线性插值法

p ( w t ∣ w t − 1 ) = λ p M L ( w t ∣ w t − 1 ) + ( 1 − λ ) p ( ω t ) p\left(w_{t} \mid w_{t-1}\right)=\lambda p_{\mathrm{ML}}\left(w_{t} \mid w_{t-1}\right)+\left(1-\lambda )p\left(\omega_{t}\right)\right. p(wtwt1)=λpML(wtwt1)+(1λ)p(ωt)

其中,λ∈(0,1)常数平滑因子。通俗理解:线性插值就是劫富济贫的税赋制度,其中的 λ 就是个人所得税的税率。

一元语法也可以通过线性插值来平滑:

p ( w t ) = λ p M L ( w t ) + ( 1 − λ ) 1 N p\left(w_{t}\right)=\lambda p_{\mathrm{ML}}\left(w_{t}\right)+(1-\lambda) \frac{1}{N} p(wt)=λpML(wt)+(1λ)N1

其中,N 是语料库总词频。

二元语法与词典分词比较

二元语法和词典分词的评测比较:
在这里插入图片描述
相较于词典分词,二元语法在精确度、召回率及IV召回率上全面胜出,最终F1值提高了 2.5%,成绩的提高主要受惠于消歧能力的提高。然而 OOV 召回依然是 n 元语法模型的硬伤,需要更强大的统计模型。

参考文献
《自然语言处理入门》详细笔记——3. 二元语法与中文分词

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你好!感谢提问。下面是有关 K210 学习笔记五中串口通信的一些内容: 在 K210 开发板上,串口是一种常见的通信接口,用于将数据从一个设备传输到另一个设备。串口通信通常使用 UART (Universal Asynchronous Receiver/Transmitter) 协议。 要在 K210 上进行串口通信,首先需要使用两个引脚:一个用于接收数据(RX),一个用于发送数据(TX)。这些引脚可以通过 GPIO 端口与外部设备连接。 在 K210 的开发环境中,可以使用 MaixPy 或者 Kendryte Standalone SDK 进行串口编程。 在 MaixPy 中,可以使用 `uart` 模块来进行串口通信。例如,要初始化一个串口对象并设置波特率为 115200,可以使用以下代码: ```python from machine import UART uart = UART(UART.UART1, 115200) ``` 然后,可以使用 `uart.write()` 函数发送数据,使用 `uart.read()` 函数接收数据。例如: ```python uart.write("Hello, world!\n") data = uart.read(10) ``` 在 Kendryte Standalone SDK 中,可以使用 `uart.h` 头文件中的函数来进行串口通信。例如,要初始化一个串口对象并设置波特率为 115200,可以使用以下代码: ```c #include "uart.h" uart_init(UART_DEVICE_1, 115200); ``` 然后,可以使用 `uart_send_data()` 函数发送数据,使用 `uart_receive_data()` 函数接收数据。例如: ```c uart_send_data(UART_DEVICE_1, "Hello, world!\n", 14); char buffer[10]; uart_receive_data(UART_DEVICE_1, buffer, 10); ``` 以上是关于 K210 学习笔记五中串口通信的简要介绍。如果你有更具体的问题,请随时提问!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值