srilm语言模型中的平滑算法——Good-Turing平滑算法

最近使用使用python自己写的语言模型和srilm得到的语言模型做对比,srilm里还是有很多trick的,尤其是平滑算法,集成了很多数据平滑算法,研究的时候,记录一下。

在srilm中有回退和差值两类平滑算法,简单来说,回退就是将出现过的ngram的概率打个折扣,将那部分折扣下来的概率均摊为未出现的ngram作为他们的概率,而插值呢,一样是对出现过的ngram打折扣,但是折扣下来的概率值均摊到所有的ngram上。对于那些出现的ngram来说,他们使用最大似然得到的真正概率(频率)A大于使用插值得到的概率B大于使用回退得到的概率C,即

A>B>C

 

主要使用的平滑算法

Good-Turing平滑算法

Good-Turing算法的思想是,对于出现次数大于某一阈值的ngram使最大似然用频率计算是比较准确的,但是如果小于这个阈值,最大似然估计就不准了。这时候,算法的处理就是利用出现次数较多的N阶元组去调整出现比他少的N阶元组的估计量。算法的

对于中产(那些发生次数小于阈值的元组)发生了r次,假设它发生了r*次:

                                                                              \boldsymbol{r}*=\boldsymbol{(r+1)}\frac{N_{r+1}}{N_{r}}

\boldsymbol{N_{r}}是所有发生次数为r的元组个数,同样\boldsymbol{N_{r+1}}是所有发生次数为r+1的元组个数,一般来说,发生次数为r的元组个数多余发生次数为r+1的元组个数,这里不要弄混发生次数和元组个数,如果做个比喻的话,那元组就是字典的key,元组个数是字典的value,元组个数是key的个数,不太严谨,但是好理解。

这样的话,对于发生个数为0的元组的计数就不为0了,每个中产的概率都比以前要小了,小的那部分,分给了穷人。这里的发生个数为0指的是在训练集中发生次数为0,即在训练集中没有出现,在测试集中第一次出现,然后用的是在训练集中出现1次的元组来估计,这样那些第一次出现的次数为不为0,实现了平滑。

证明所有元组概率之和为1的推到如下:

nr是所有发生次数为r的元组个数,同样nr+1是所有发生次数为r+1的元组个数,一般来说,发生次数为r的元组个数多余发生次数为r+1的元组个数,这里不要弄混发生次数和元组个数,如果做个比喻的话,那元组就是字典的key,元组个数是字典的value,元组个数是key的个数,不太严谨,但是好理解。

这样的话,对于发生个数为0的元组的计数就不为0了,每个中产的概率都比以前要小了,小的那部分,分给了穷人。这里的发生个数为0指的是在训练集中发生次数为0,即在训练集中没有出现,在测试集中第一次出现,然后用的是在训练集中出现1次的元组来估计,这样那些第一次出现的次数为不为0,实现了平滑。

证明所有元组概率之和为1的推到如下:

nr是所有发生次数为r的元组个数,同样nr+1是所有发生次数为r+1的元组个数,一般来说,发生次数为r的元组个数多余发生次数为r+1的元组个数,这里不要弄混发生次数和元组个数,如果做个比喻的话,那元组就是字典的key,元组个数是字典的value,元组个数是key的个数,不太严谨,但是好理解。

这样的话,对于发生个数为0的元组的计数就不为0了,每个中产的概率都比以前要小了,小的那部分,分给了穷人。这里的发生个数为0指的是在训练集中发生次数为0,即在训练集中没有出现,在测试集中第一次出现,然后用的是在训练集中出现1次的元组来估计,这样那些第一次出现的次数为不为0,实现了平滑。

证明所有元组概率之和为1的推到如下:

                                                   

nr是所有发生次数为r的元组个数,同样nr+1是所有发生次数为r+1的元组个数,一般来说,发生次数为r的元组个数多余发生次数为r+1的元组个数,这里不要弄混发生次数和元组个数,如果做个比喻的话,那元组就是字典的key,元组个数是字典的value,元组个数是key的个数,不太严谨,但是好理解。

这样的话,对于发生个数为0的元组的计数就不为0了,每个中产的概率都比以前要小了,小的那部分,分给了穷人。这里的发生个数为0指的是在训练集中发生次数为0,即在训练集中没有出现,在测试集中第一次出现,然后用的是在训练集中出现1次的元组来估计,这样那些第一次出现的次数为不为0,实现了平滑。

证明所有元组概率之和为1的推到如下:

                                              

         

上式是对于次数为r概率重新估计的元组,概率为θ

保证概率的总和为1,出现同样次数的元组具有相同的概率,所以总的概率就是出现在不同次数的概率与这个次数的元组总数的乘积之和,即θ(r)N的总和:

                                       

  其中

                                              \sum (r+1) N_{r+1}=\sum rN_{r}

因此最后保证了概率之和为1:

                                         

参考:

https://blog.youkuaiyun.com/hx14301009/article/details/80341095

https://blog.youkuaiyun.com/u010189459/article/details/38236657

http://www.52nlp.cn/mit-nlp-third-lesson-probabilistic-language-modeling-fifth-part#more-729

例子: http://blog.sina.com.cn/s/blog_8267db980102wqgc.html

推导: http://www.cs.cornell.edu/courses/cs6740/2010sp/guides/lec11.pdf

https://blog.youkuaiyun.com/xmdxcsj/article/details/50373554

### Ant Design Vue Table 组件实现多选功能 在Ant Design Vue的`<a-table>`组件中,可以通过配置`rowSelection`属性来启用多选功能。此属性允许指定哪些行被默认选中以及监听选择变化事件。 #### 配置 `row-selection` 为了使表格支持多选,需设置`:row-selection="selection"`,并定义相应的选对象`selection`: ```javascript const selection = { selectedRowKeys: [], // 控制哪几选中的键数组 onChange: (selectedRowKeys, selectedRows) => { /* 当用户改变选择时触发 */ }, }; ``` 对于HTML模板部分,则如下所示[^2]: ```html <a-table bordered :columns="columns" :data-source="dataSource" :row-selection="{ selectedRowKeys: selectedRowKeys, onChange: onSelectChange }"> </a-table> <div>已勾选数量: {{ selectedRowKeys.length }}</div> ``` 这里的关键在于维护一个状态变量`selectedRowKeys`用于存储当前已被选中的行对应的唯一标识符(通常是记录ID),并通过`onChange`方法更新这个列表。 #### JavaScript逻辑处理 接下来是在JavaScript代码里完成的选择变更处理器`onSelectChange`函数的具体实现方式: ```javascript import { ref } from 'vue'; export default { setup() { const selectedRowKeys = ref([]); // 定义响应式的选中key集合 function onSelectChange(selectedKeys) { console.log('Selected Row Keys:', selectedKeys); selectedRowKeys.value = selectedKeys; } return { columns, dataSource, selectedRowKeys, onSelectChange, }; } } ``` 上述代码片段展示了如何利用Vue Composition API创建了一个可变的状态`selectedRowKeys`,每当有新的行被选中或取消选定时都会调用`onSelectChange()`来进行同步更新。 需要注意的是,在实际应用当中如果涉及到分页的情况下,要特别小心管理同页面之间的选择状态一致性问题[^3]。因为当切换到其他页后再返回原页时,默认情况下之前做的任何选择都将失效;因此可能还需要额外考虑持久化这些选择信息或者采取措施防止意外丢失重要数据。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值