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.mzph.cn/news/825634.shtml

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

相关文章

【MySQL探索之旅】多表查询

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更…

【数学】推荐一种用尺规绘制正五边形,简单而又精确的作法

【说明】 正五边形的尺规作图方法很多&#xff0c;但大多比较繁琐&#xff0c;下面介绍一种作法&#xff0c;这种方法步骤少&#xff0c;简便易行。 【具体步骤】 1.作相互垂直的两条直线&#xff0c;交点为O&#xff1b; 2.以O为圆心作圆&#xff0c;交横线与AB两点&#…

风速Weibull分布和光伏Beta分布的参数拟合方法(含matlab算例)

在风光场景生成、随机优化调度等研究中&#xff0c;常常假设风速服从Weibull分布&#xff0c;太阳辐照度服从Beta分布。那我们如何得到两个分布的参数呢&#xff1f;文本首先介绍了风速Weibull分布和辐照度Beta分布的基本概率模型及其性性质&#xff0c;之后以MATLAB代码为例阐…

读所罗门的密码笔记21_读后总结与感想兼导读

1. 基本信息 所罗门的密码&#xff1a;AI时代的价值、权力与信任 Solomons Code 奥拉夫格罗思 马克尼兹伯格 著 中信出版社,2022年5月出版 1.1. 读薄率 书籍总字数257千字&#xff0c;笔记总字数37780字。 读薄率37780257000≈14.7% 1.2. 读厚方向 千脑智能 脑机穿越 …

基于SpringBoot的“校园新闻网站”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“校园新闻网站”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 系统功能界面图 用户登录 校园新…

揭秘!回归测试覆盖率究竟是什么?

回归测试覆盖率是软件测试中的一个重要概念&#xff0c;它衡量的是回归测试过程中&#xff0c;能够覆盖到旧代码的比例。在软件开发的生命周期中&#xff0c;每当有新的代码提交或是修改后&#xff0c;都需要进行回归测试以确保新代码不会对原有的功能产生负面影响。 1.什么是…

从入门到实践,详解 Web 爬虫技术(IP池免费送)

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

NLP vs. LLMs: 理解它们之间的区别

作者&#xff1a;Elastic Platform Team 随着人工智能持续发展并在无数行业解决问题&#xff0c;技术的一个关键部分是能够无缝地桥接人类语言和机器理解之间的差距。这就是自然语言处理&#xff08;NLP&#xff09;和大型语言模型&#xff08;LLMs&#xff09;的用武之地。它们…

source map 开发优化工具

什么是 Source map 简单来说 Source map 就是一个存储信息的文件&#xff0c;里面储存着位置信息。 Source map 英文释义&#xff1a;源程序映射。 位置信息&#xff1a;转换后的代码 对应的 转换前的代码 位置映射关系。 有了 Source map&#xff0c;就算线上运行的是转换…

电脑技巧:如何把Edge浏览器扩展程序打包安装到其他浏览器

目录 1、进入浏览器扩展界面 2、找到Edge浏览器扩展插件的路径 3、找到需要扩展的插件ID 4、打开浏览器扩展插件目录 5、进入打包扩展界面 6、 安装到其他浏览器 大家日常使用浏览器的时候通常会安装很多浏览器插件&#xff0c;从而大大提升我们的办公效率&#xff0c;有…

带小数点的String类型数据,如何只取整数?

一、场景引入 如果前端页面存在列表展示用户数据&#xff0c;但是用户数据存在非常多的小数位&#xff0c;从页面来看&#xff0c;数据太多就会不太美观&#xff0c;因此&#xff0c;出于场景美化考虑&#xff0c;在不影响业务功能的情况下&#xff0c;可以只展示整数内容&…

代码编辑器特效爆炸html5

源码介绍 代码编辑器特效爆炸html5&#xff0c;代码高亮显示&#xff0c;输入代码爆炸动态效果显示。非常的帅气&#xff0c;爱不释手~ 效果截图 源码下载 代码编辑器特效爆炸html5

Flask 解决指定端口无法生效问题

问题重现 手动指定的IP端口是app.run(host0.0.0.0, port9304)&#xff0c;但是启动的地址显示的却是http://127.0.0.1:5000。 if __name__ __main__:app.run(host0.0.0.0, port9304)启动地址如下&#xff1a; 解决方案 PyCharm会自动识别出来flask项目&#xff08;即使你…

Py深度学习基础|Numpy基础总结

注&#xff1a;本文来自菜鸟教程学习总结 一、数组属性 NumPy 的数组中比较重要 ndarray 对象属性有&#xff1a; 注意&#xff1a;使用reshape后&#xff0c;数组的结构&#xff08;即元素的排列顺序和内在连接&#xff09;没有改变&#xff0c;但因为返回的是一个视图&#…

机器学习笔记 - 使用 OpenCV 的结构化森林进行边缘检测

一、简述 边缘检测是计算机视觉领域中一项非常重要的任务。这是许多纯计算机视觉任务(例如轮廓检测)的第一步。即使涉及深度学习,较深层也首先学习识别边缘,然后再学习图像的复杂特征。所以,我们可以说边缘检测在计算机视觉领域非常重要。拥有良好且高效的图像边缘检测算法…

Flink KafkaSink分区配置的不同版本对比

Flink KafkaSink分区配置的不同版本对比 在不同版本的Flink中&#xff0c;KafkaSink 分区默认配置方式可能会有一些变化。以下是摘自Flink官方文档不同版本的原文&#xff1a; 1. Flink版本&#xff1a;1.12~1.19 Sink 分区 # 配置项 sink.partitioner 指定了从 Flink 分区到 …

Yoshua Bengio独家专访:我不想把大模型未来押注在Scaling Law上,AGI路上要“注意安全”...

导读 漫长的30年间&#xff0c;数度从主流方向的超然出走&#xff0c;是Bengio的制胜秘诀。这种不盲从主流的风格体现在他研究生涯的方方面面。 90年代末期&#xff0c;神经网络被打入冷宫&#xff0c;Bengio的论文多次遭拒&#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进行…

python将xml格式文件转成png或者pdf格式

本文主要介绍运行NCCL代码时输出的xml文件该如何转成更加容易观看的图格式 如下是举例&#xff0c;服务器上的PCIE相关的topo xml 文件 <system version"1"><cpu numaid"1" affinity"ffffff00,0000ffff,ff000000" arch"x86_64&q…

Next.js多页布局getLayout使用方法

目录 官网解释 直接上代码使用方法展示 1.page页面​编辑 2._app.js页面,也放在pages中​编辑 效果展示 有getLayout展示getLayout返回的页面布局 无getLayout展示默认布局 官网解释 如果需要多个布局&#xff0c;可以添加一个属性getLayout添加到您的页面&#xff0c;允…