N元语言模型

第1关:预测句子概率

任务描述

本关任务:利用二元语言模型计算句子的概率

相关知识

为了完成本关任务,你需要掌握:1.条件概率计算方式。 2.二元语言模型相关知识。

条件概率计算公式

条件概率是指事件A在事件B发生的条件下发生的概率。条件概率表示为:P(A|B)。若只有两个事件A,B,则有如下公式:

,

二元语言模型

二元语言模型也称为一节马尔科夫链,通俗的讲,我们可以认为这是一个词的概率实际上只是跟前边的词有关,那么就可以有以下的方程:

,

同时为了保证条件概率在 i=1 时有意义,同时为了保证句子内所有字符串的概率和为 1,可以在句子首尾两端增加两个标志: <BOS \W1W2…Wn\ EOS> 为了估计P(WI|WI-1)的条件概率,我们计算出wi-1,wi的词汇出此案的频率然后进行归一化,公式如下:

,

计算出每个词汇的概率后,便可根据公式求得句子的概率。

编程要求

根据提示,在右侧编辑器补充代码,计算并输出测试语句的概率

测试说明

平台会对你编写的代码进行测试: 语料库:

 
  1. 研究生物很有意思。他大学时代是研究生物的。生物专业是他的首选目标。他是研究生。

测试输入:

  1. 研究生物专业是他的首选目标

预期输出:

  1. 0.004629629629629629
import jiebajieba.setLogLevel(jieba.logging.INFO)# 将句子变为"BOSxxxxxEOS"这种形式
def reform(sentence):if sentence.endswith("。"):sentence = sentence[:-1]sentence = sentence.replace("。", "EOSBOS")sentence = "BOS" + sentence + "EOS"return sentence# 分词并统计词频
def segmentation(sentence, dic):jieba.suggest_freq("BOS", True)jieba.suggest_freq("EOS", True)  # 让jieba库知道"BOS"和"EOS"这两个词的存在,并记录它们的出现频率lists = jieba.lcut(sentence, HMM=False) # 当输入的文本比较短时,隐马尔科夫模型的效果可能会下降,导致分词结果不准确if dic is not None:for word in lists:if word not in dic:dic[word] = 1else:dic[word] += 1return lists# 比较两个数列,二元语法
def compareList(ori_list, tes_list):count_list = [0] * len(tes_list)for t in range(len(tes_list)-1):for n in range(len(ori_list)-1):if tes_list[t] == ori_list[n]:if tes_list[t+1] == ori_list[n+1]:count_list[t] += 1return count_list # 计算概率       
def probability(tes_list, ori_dic, count_list):flag = 0p = 1del tes_list[-1]for key in tes_list:p *= float(count_list[flag]) / float(ori_dic[key])flag += 1return pif __name__ == "__main__":# 语料句子sentence_ori = "研究生物很有意思。他大学时代是研究生物的。生物专业是他的首选目标。他是研究生。"ori_dict = {}# 测试句子sentence_test = input()ori_dict2 = {}sentence_ori_temp = reform(sentence_ori)ori_list = segmentation(sentence_ori_temp, ori_dict)sentence_tes_temp = reform(sentence_test)tes_list = segmentation(sentence_tes_temp, None)count_list = compareList(ori_list, tes_list)p = probability(tes_list, ori_dict, count_list)print(p)

第2关:数据平滑

任务描述

本关任务:实现二元语言模型的数据平滑,并利用平滑后的数据计算句子概率。

相关知识

为了完成本关任务,你需要掌握:1.模型平滑化。2.good-turning平滑。

模型平滑

在使用语言模型直接计算某个句子出现的概率时,可能会由于某个单词或单词对出现的概率为0而导致整个句子出现的概率为0。 例如下面这个场景:

例子

在上面的场景中,由于部分单词对出现的概率为0,导致最终两句话出现的概率均为0。但实际上,s1=“今天没有训练营”比s2=“今天训练营没有”更符合语法习惯,我们也更希望计算出来的P(s1)大于P(s2)。 一般来说,语言模型的平滑处理可分为以下三类:

  • Discounting(折扣):通过给概率不为0的项打折扣,来提高概率为0的项的概率;
  • Interpolation(插值):在使用N-gram模型计算某一项的概率时,同时结合低阶的模型所计算出的概率;
  • Back‐off:approximate counts of unobserved N‐gram based on the proportion of back‐off events (e.g., N‐1 gram)。

这里我们主要介绍与使用Discounting中的good-turning平滑方法。

good-turning平滑

Good-Turing技术是在1953年由古德(I.J.Good)引用图灵(Turing)的方法而提出来的,其基本思想是:用观察计数较高的N元语法数重新估计概率量的大小,并把它指派给那些具有零计数或者较低计数的N元语法。涉及的符号含义为:
c:某个N元语法出现的频数。
Nc:出现次数为c的 N-gram 词组的个数,是频数的频数

,

c*:Good-Turing平滑计数

,

设N为测试元组集合中元组的数目,则有如下公式:

,

通过新频数可计算出经过good-turing平滑后的元组概率,公式如下:

,

编程要求

根据提示,在右侧编辑器补充代码,编写平滑函数,计算句子的概率

测试说明

平台会对你编写的代码进行测试:

语料库:

  1. 研究生物很有意思。他大学时代是研究生物的。生物专业是他的首选目标。他是研究生。

测试输入:

  1. 他是研究物理的

预期输出:

  1. 5.6888888888888895e-05

import jieba
#语料句子
sentence_ori="研究生物很有意思。他大学时代是研究生物的。生物专业是他的首选目标。他是研究生。"
#测试句子
sentence_test=input()
#任务:编写平滑函数完成数据平滑,利用平滑数据完成对2-gram模型的建立,计算测试句子概率并输出结果
# ********** Begin *********#
def gt(N, c):if c+1 not in N:cx = c+1else:cx = (c+1) * N[c+1]/N[c]return cx
jieba.setLogLevel(jieba.logging.INFO)
sentence_ori = sentence_ori[:-1]
words = jieba.lcut(sentence_ori)
words.insert(0, "BOS")
words.append("EOS")
i = 0
lengh = len(words)
while i < lengh:if words[i] == "。":words[i] = "BOS"words.insert(i, "EOS")i += 1lengh += 1i += 1
phrases = []
for i in range(len(words)-1):phrases.append(words[i]+words[i+1])
phrasedict = {}
for phrase in phrases:if phrase not in phrasedict:phrasedict[phrase] = 1else:phrasedict[phrase] += 1
words_test = jieba.lcut(sentence_test)
words_test.insert(0, "BOS")
words_test.append("EOS")
phrases_test = []
for i in range(len(words_test)-1):phrases_test.append(words_test[i]+words_test[i+1])
pdict = {}
for phrase in phrases_test:if phrase not in phrasedict:pdict[phrase] = 0else:pdict[phrase] = phrasedict[phrase]
N = {}
for i in pdict:if pdict[i] not in N:N[pdict[i]] = 1else:N[pdict[i]] += 1
N[0] += 1
Nnum = 0
for i in N:Nnum += i*N[i]
p = 1
for phrase in phrases_test:c = pdict[phrase]cx = gt(N, c)p *= cx/Nnum
print(p)

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/630721.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++题解】1607. 两位数运算

问题&#xff1a;1607. 两位数运算 类型&#xff1a;基本运算、拆位求解 题目描述&#xff1a; 小丽在编程课上学会了拆位运算&#xff0c;她已经可以拆出一个两位整数的十位和个位了&#xff0c;她想知道这个整数的十位 / 个位的结果是多少&#xff0c;请编程帮她实现&#…

【ESP32 手机配网教程】

【ESP32 手机配网教程】 1. 前言2. 先决条件2.1 环境配置2.2 所需零件3.3 硬件连接步骤 3. Web热点手动配网3.1. 准备工作3.2. 编译上传程序3.3. 进行手动配网 4. BLE无线配网4.1. 准备工作**4.2. 编译上传程序4.3. 使用手机APP进行无线配网 5. 总结 1. 前言 欢迎使用ESP32进行…

Next.js 14 App Router引入 farmer-motion 初始化异常解决,顺带学点知识

前言 farmer-motion 是一个非常好用的动画库&#xff0c;当然用来做组件切换和路由切换过渡更不在话下。 记录一下&#xff0c;Next.js 14 App Router 下引入初始化异常的解决姿势&#xff0c;顺带扯一下 next.js 的知识点&#xff1b; 问题 过渡组件代码 我们拿 farmer-m…

C++ STL 容器 list

目录 1. list 对象2. list 迭代器2.1 实现2.2 迭代器失效 本文测试环境为 gcc 13.1 1. list 对象 std::list 底层是一个双向循环链表 list 对象本身包含一个头节点&#xff0c;通过指针指向元素节点&#xff0c;节点定义如下 头节点 header 和元素节点 node 都继承于基类 no…

如何使用 Node.js 发送电子邮件全解和相关工具推荐

大多数Web应用程序都需要发送电子邮件。它可能用于注册、密码重置、状态报告&#xff0c;甚至是完整的市场营销活动&#xff0c;如新闻和促销。本教程解释了如何在Node.js中发送电子邮件&#xff0c;但其概念和挑战适用于您正在使用的任何系统。 你会在 npm 上找到大量与电子邮…

2024-4-15-ARM作业

实现字符串数据收发函数的封装 源代码&#xff1a; main.c #include "gpio.h"#include "uart4.h"int main(){uart4_config();while (1){// char agetchar();// putchar(a1);char s[20];gets(s);puts(s);//putchar(\n);putchar(\r);}return 0;}uart4.c …

JVM虚拟机(十一)CPU飙高的排查方案与思路

目录 一、排查方案与思路二、总结 一、排查方案与思路 1.一般我们查看 CPU 的使用情况&#xff0c;可以使用 TOP 命令&#xff1a; top执行结果如下所示&#xff0c;这里就可以按照 CPU 使用率进行排序。 2.通过 top 命令查看后&#xff0c;可以查看是哪一个 Java 进程占用 C…

前端三剑客 HTML+CSS+JavaScript ② HTML相关概念

他们这样形容我 是暴雨浇不灭的火 —— 24.4.18 学习目标 理解 HTML的概念 HTML的分类 HTML的关系 HTML的语义化 应用 HTML骨架格式 sublime基本使用 一、HTML初识 HTML指的是超文本标记语言&#xff0c;是用来描述网页的一种语言 超文本&#xff1a;暂且理解为“超级的文本”&…

安装importlib_resources库的方法最终解答!_Python库

安装Python库importlib_resources 我的环境&#xff1a;Window10&#xff0c;Python3.7&#xff0c;Anaconda3&#xff0c;Pycharm2023.1.3 importlib_resources importlib_resources是一个用于访问Python包中非代码资源&#xff08;如文本、图片等&#xff09;的库&#xff…

界面组件Telerik UI for WPF 2024 Q1新版亮点 - 全新DateRangePicker组件

Telerik UI for WPF拥有超过100个控件来创建美观、高性能的桌面应用程序&#xff0c;同时还能快速构建企业级办公WPF应用程序。UI for WPF支持MVVM、触摸等&#xff0c;创建的应用程序可靠且结构良好&#xff0c;非常容易维护&#xff0c;其直观的API将无缝地集成Visual Studio…

深入剖析Tomcat(三) 实现一个简易连接器

Tomcat中的servlet容器叫做Catalina&#xff0c;Catalina有两个主要模块&#xff1a;连接器与容器。在本章&#xff0c;将会建立一个连接器来增强第二章中应用程序的功能&#xff0c;用一种更好的方式来创建request与response对象。 截止文章编写日期&#xff0c;servlet规范已…

智能设备订购如何使药品供应链受益

自从 Covid-19 大流行扰乱全球供应链以来&#xff0c;制药行业对增强弹性的需求变得比以往任何时候都更加重要。药品供应链已经开始数字化转型&#xff0c;采用新技术有助于确保药品和关键物资按时到达目的地并支持长期业务战略。其中一种解决方案是在移动设备上进行智能设备订…