【自然语言处理】二元文法模型

news2025/1/21 18:50:14

实验名称

二元文法模型

  • 实验目的

1.掌握N-gram文法的公式;

2.理解语言模型的实现过程;

3.掌握简单的平滑方法;

4.用代码编程实现2元语言模型,即一阶马尔可夫链。

  • 实验内容:

使用免费的中文分词语料库,如人民日报语料库PKU,使用语料库中的常见词编写一个句子,使用二元语法(即每个词只与和它相邻的前一个词有关)在语料库中对句子中的词进行词频统计,输出句子的出现概率。

  • 实验过程:
  1. 训练语料库

统计语料库中每个词出现的次数并且得到相邻两个词语同时出现的的次数,便于概率的求解。因为是对数据进行分析,所以用python来写比较便捷。先定义两个字典,一个存储词出现的次数,另一个存储相连两个词出现的次数。读取文件中的语料集,为了保证条件概率在i=1时有意义,同时为了保证句子内所有字符串的概率为1,所以通过for循环将每一句话前加上标记‘BOS’,后加上标记‘EOS’。

   

读取语料进行每个词出现次数的查找,同时得到两个词语相连出现的次数,存储名称样式为{}-{},{}表示一个词语。将每个词及其出现次数存储到字典tmp_dic_single中,两个词的存到字典tmp_dic中,为了检测正确性且方便查看,将这两个字典存储到两个文件中。

   

  1. 给定一个句子,在语料库查找,运用刚才得到的两个字典来计算概率,利用公式:

  

每一个概率表达式中的分子表示一个词语和另一个词语相连出现在语料库的数,分母为该词在整个语料库单独出现的次数,这就存在概率为0的情况,所以要使用平滑方法,这里用到了拉普拉斯平滑方法:

          

  总结来说就是对词的计数加1,由于词典大小为 V ,每个词的次数都增加了1,因此还需要为分母加 V。

  • 结果展示:

用句子“实现中华民族伟大复兴的中国梦”来进行检测:

得到的词分别为'BOS 实现 中华 民族 伟大 复兴 的 中国梦 EOS'。

运行结果如下(sum表示语料库中词数):

     

生成的词语出现的词数的文件部分内容如下:

     

  • 心得体会:

参与本次二元文法语言模型实验,显著加深了对N-gram模型,特别是二元文法模型的理解。通过编程实践,掌握了对语料库进行数据分析并实现2-gram模型的技能。 实验中,深刻体会到数据平滑技术的重要性,该技术是确保概率计算不出现零值的关键,且有多种实施方法。分析生成的字典和文件,认识到2-gram模型样本空间为N^2,效果显著优于一元模型。这激发了对N-gram模型中N值与训练效果关系的进一步思考,将继续深入学习,巩固自然语言处理知识基础。 完成概率计算。同时,认识到在语言处理中实施数据平滑的必要性,有效解决了数据稀疏和零概率问题。计划通过持续学习,不断优化程序,提升其效率和完整性。

参考代码:
 


tmp_dic = {}
tmp_dic_single = {}

with open(r'/Users/songziang/Documents/pythonProject/pku_training.txt',encoding='GB18030') as f:
    count = 0
    current = 'BOS'
    for line in f:
        tmp = line.split()
        if count == 0:
            tmp.insert(0, 'BOS')
        for index in range(len(tmp)-1, -1, -1):
            if tmp[index] in set(['、', '——', ':', '。', '!', '“', '”', '?', '《', '》', '(', ')', '’', ':', ',']):
                tmp[index] = 'EOS'
                tmp.insert(index+1, 'BOS')

        for index in range(len(tmp)):
            word = tmp[index]
            if word == 'BOS':
                current = 'BOS'
            elif word == 'EOS':
                current = 'EOS'
            if index < len(tmp) - 1:
                word_next = tmp[index+1]
                name = '{}-{}'.format(word, word_next)
                if current == 'BOS':
                    if name not in tmp_dic:
                        tmp_dic[name] = 1
                    else:
                        tmp_dic[name] += 1
                    if word not in tmp_dic_single:
                        tmp_dic_single[word] = 1
                    else:
                        tmp_dic_single[word] += 1

        count += 1

    print('sum:', sum(tmp_dic.values()))
    with open(r'/Users/songziang/Documents/pythonProject/training_double.txt', 'w',encoding='GB18030') as f:
        f.write(str(tmp_dic))
    with open(r'/Users/songziang/Documents/pythonProject/training_single.txt', 'w',encoding='GB18030') as f:
        f.write(str(tmp_dic_single))
    sentence = 'BOS 实现 中华 民族 伟大 复兴 的 中国梦 EOS'
    sentence = sentence.split()
    probability = 1
    for index in range(1, len(sentence)):
        name = '{}-{}'.format(sentence[index-1], sentence[index])
        try:
            print(name, tmp_dic[name] / tmp_dic_single[sentence[index-1]])
            probability = probability * (tmp_dic[name] / tmp_dic_single[sentence[index-1]])
        except KeyError:
            print(name, 1 / sum(tmp_dic.values()))
            probability = probability * (1 / sum(tmp_dic.values()))
    print("句子概率:", probability)

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

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

相关文章

软考:数据流图案例

阅读下列说明和图&#xff0c;回答问题1至问题4。 一、说明 某医院欲开发病人监控系统。该系统通过各种设备监控病人的生命体征&#xff0c;并在生命体征异常时向医生和护理人员报警。该系统的主要功能如下&#xff1a; &#xff08;1&#xff09;本地监控&#xff1a;定期获…

Ubuntu20.4部署Cuda12.4

准备Ubuntu20.4 VM 安装Cuda12.4 1.进入如下界面安装安装Cuda12.4版本&#xff1a; CUDA Toolkit 12.4 Update 1 Downloads | NVIDIA Developerhttps://developer.nvidia.com/cuda-downloads?target_osLinux&target_archx86_64&DistributionUbuntu&target_vers…

Swift知识点(三)

11. init、deinit、可选链、协议、元类型 构造和析构 构造方法 构造方法是一种特殊的方法 一个对象创建完毕后&#xff0c;都需要调用构造方法进行初始化&#xff08;比如属性的初始化&#xff09; 验证&#xff1a;init方法是在对象创建完毕的时候调用 回到存储属性 在对…

【资源汇总】GIS/RS相关软件包+数据分享(直接获取附链接)

01软件类 ArcGIS 10.2 链接&#xff1a;https://pan.baidu.com/s/1euHa3eTiaTjiOu-zxsi9eA?pwdnjov ArcGIS Pro 2.8.6 链接&#xff1a;https://pan.baidu.com/s/1Y3AQshCGL7tA1zdUc7s9PQ?pwdlkic ENVI 5.3 链接&#xff1a;https://pan.baidu.com/s/14k4IVlYIheNOr2to…

visual studio 2017重命名解决方案或项目名称

1.解决方案->右键->重命名->新的名字 2.项目->右键->重命名->新的名字 3.修改程序集和命名空间名称 项目->右键->属性->修改程序集名称和命名空间名称 4.搜索换名 Ctrl-F->输入旧名称->搜索->将所有旧名称改为新名称&#xff08;注意是整…

【吊打面试官系列】Java高并发篇 - 创建线程的有哪些方式?

大家好&#xff0c;我是锋哥。今天分享关于 【创建线程的有哪些方式&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 创建线程的有哪些方式&#xff1f; 1、继承 Thread 类创建线程类 2、通过 Runnable 接口创建线程类 3、通过 Callable 和 Future 创建线程 …

Nginx性能优化系列 | Nginx的location规则配置详解

Nginx性能优化系列 | Nginx的location规则配置详解 1. Nginx设置过滤条件 1. Nginx设置过滤条件 如果请求一个不存在网站接口路径&#xff0c;为避免被听云检测到过多错误次数触发告警&#xff0c;可以在Nginx层面设置对错误的请求路径直接返回200正确码 # vim /usr/local/ngi…

FestDfs快速安装和数据迁移同步。Ubuntu环境

一&#xff1a;防火墙 ufw status 二&#xff1a;下载 分别是&#xff08;环境依赖&#xff0c;网络模块依赖&#xff0c;安装包&#xff09; git clone https://github.com/happyfish100/libfastcommon.git git clone https://github.com/happyfish100/libserverframe.git …

[牛客网]——C语言刷题day3

答案&#xff1a;A 解析&#xff1a; A.表示将数组a的首地址赋值给指针变量p B.将一个int型变量直接赋值给一个int型的指针是不行的 C.道理同B D.j2是一个右值&#xff0c;右值是不能进行取地址操作的 #include <iostream> using namespace std;#define N 7 int fun…

武汉星起航深耕亚马逊跨境,助力合作伙伴实现全球业务增长

在数字化浪潮席卷全球的今天&#xff0c;跨境电商业务蓬勃发展&#xff0c;成为推动国际贸易增长的重要引擎。亚马逊&#xff0c;作为全球最大的电商平台之一&#xff0c;以其独特的平台特点和全球化布局&#xff0c;为卖家和买家提供了便捷、高效的交易环境&#xff0c;成为众…

后台菜单数据递归展示

后台菜单数据递归展示 效果示例图aslide.vueaslideItem.vuemenu 效果示例图 aslide.vue <script setup>import {ref} from vue;const props defineProps({isCollapse: {type: Boolean,default: false}});import AslideItem from "./aslideItem.vue"const def…

JETBRAINS IDES 分享一个2099通用试用码!DataGrip 2024 版 ,支持一键升级

文章目录 废话不多说上教程&#xff1a;&#xff08;动画教程 图文教程&#xff09;一、动画教程激活 与 升级&#xff08;至最新版本&#xff09; 二、图文教程 &#xff08;推荐&#xff09;Stage 1.下载安装 toolbox-app&#xff08;全家桶管理工具&#xff09;Stage 2 : 下…

CST电磁仿真软件什么是Schematic?三维模型和电路协同仿真【小白必学教程】

什么是Schematic? 使用CST Design Studio进行的各种分析&#xff01; Schematic 进行三维仿真时&#xff0c;有时需要将3D模型和电路图放在一起进行仿真分析。比如需要天线和匹配电路协同仿真&#xff0c;两者构成完整的电路图可以系统地分析In/0ut特性。按下3D工作界面下方…

了解RFID技术如何改善危化品仓储管理效率

随着科学的发展&#xff0c;我国化工行业也迎来飞速进步的黄金时期&#xff0c;而生产加工快速化的同时也导致一些危险化学品的使用量与存储量不断增加。由于危险化学品种类较多&#xff0c;使用和存储的方法都不一样&#xff0c;还具有易燃、易爆、腐蚀、毒害等特性&#xff0…

c语言中数字字符串和数字互转

#include <getopt.h> #include <stdio.h> #include <stdlib.h>#define MAX_PATH 256 char filename[MAX_PATH 5]; int main(int argc, char** argv) {//数字字符串转数字const char* kk "689";int zhi atoi(kk) 8;//数字字符串转doubledoub…

面对《消费者告知法》严查与技术BUG频发,亚马逊卖家如何巧妙应对挑战?

五一假期期间&#xff0c;亚马逊大量发送《美国消费者告知法案》验证邮件通知&#xff0c;在这个本该是卖家们忙碌而喜悦的时刻&#xff0c;亚马逊平台上的卖家们却遭遇了一场前所未有的“灾难”——《消费者告知法》验证问题的爆发&#xff0c;以及随之而来的一系列技术BUG&am…

Linux ps命令详细参数

一、简介 在Linux系统中&#xff0c;ps(Process Status的缩写)命令常常用来用来列出系统中当前运行的进程。ps命令列出的是当前那些进程的快照&#xff0c;就是执行ps命令的那个时刻的那些进程&#xff0c;如果想要动态的显示进程信息&#xff0c;就可以使用top命令。要对进程…

java基础之对线程的理解

目录 程序、进程、线程 什么是进程&#xff1f; 什么是线程 线程与进程的区别&#xff1f; 二、多线程 实现多线程方式一&#xff1a;继承Thread类 实现多线程方式二&#xff1a;实现Runnable接口 实现多线程方式三: 实现Callable接口 ​ 三种实现方式的对比 设置和获…

echers配置项:X轴,Y轴颜色修改

如上图绿框所示&#xff0c;修改x&#xff0c;y轴的颜色 let option {xAxis: {axisLine:{lineStyle:{color:red}},},yAxis: {type: value,axisLine:{lineStyle:{color:red}},}, }

胎压模块对贴片晶振的要求

在没有胎压监测的时代&#xff0c;有数据统计得出&#xff0c;在高速公路发生的事故中&#xff0c;由轮胎故障引发的占了46%&#xff0c;其中爆胎就占了70%以上&#xff0c;事故风险频有发生。且轮胎在爆炸中所产生的的冲击波&#xff0c;足以把人炸开至1米开外&#xff0c;在这…