自然语言处理: 第一章N-Gram

news2024/11/24 10:35:04

一. 理论基础

定义: 语言模型在wiki的定义是统计式的语言模型是一个几率分布,给定一个长度为 m 的字词所组成的字串 W1 , W2 ,··· ,Wn ,派几率的字符串P(S) = P(W1 , W2 ,··· ,Wn , )而其中由条件概率公式我们可以得到下图2的公式,然后我们再利用马尔可夫假设(每个词的出现的概率只与前面那个词有关) 得到下面的公式3

在这里插入图片描述





而N-gram的意思,就是每个词出现的概率只取决于前面n - 1个单词的,其中单词的概念可以是词组也可以是字,比如下图中的孙悟空这种单独拆开词无意义的可以看作一个单词。举个例子比如说是2-gram, 我们看到孙悟空这个词需要去预测下一个单词是三,我们看到三需要预测下一个单词是打。所以这种模型的输出完全取决于语料库的概念
在这里插入图片描述

优缺点:

  • 优点
    • 计算简单
  • 缺点
    • 无法捕捉长距离的词汇关系
    • 完全取决于语料库的丰富程度
    • 没有考虑词之间的相似度



代码实现

  1. 构建自己的语料库,下面定义了一个函数从txt的文件里读取语料并且去掉换行符

    def read_corpus_file(file):
        with open(file, 'r' , encoding= 'utf-8') as f:
            corpus = f.readlines()
        return [line.strip() for line in corpus]
    
  2. 定义分词函数

  3. 计算ngram词频 , 根据输入的n 在语料库中计算词频,其中前 n - 1长度的单词是输入, 第n个单词是输出, 语料库中每出现一个则计数器+1

    # 定义计算N-Gram词频的函数
    def count_ngrams(corpus, n):
        ngrams_count = defaultdict(Counter)  # 创建一个字典存储N-Gram计数
        for text in corpus:  # 遍历语料库中的每个文本
            tokens = tokenize(text)  # 对文本进行分词
            for i in range(len(tokens) - n + 1):  # 遍历分词结果生成N-Gram
                ngram = tuple(tokens[i:i+n])  # 创建一个N-Gram元组
                prefix = ngram[:-1]  # 获取N-Gram的前缀
                token = ngram[-1]  # 获取N-Gram的目标单字
                ngrams_count[prefix][token] += 1  # 更新N-Gram计数
    
        # 输出信息
        print(f"{n}gram词频:") # 打印Bigram词频
        for prefix, counts in ngrams_count.items():
            print("{}: {}".format("".join(prefix), dict(counts)))
        print('-'*100)
        return ngrams_count
    
  4. 根据词频计算概率, 根据上面的词频去计算每个prefix 生成中心词的概率

    # 定义计算Bigram概率的函数
    def ngram_probabilities(ngram_counts):
        ngram_probs = defaultdict(Counter)  # 创建一个字典存储Bigram概率
        for prefix, tokens_count in ngram_counts.items():  # 遍历Bigram计数
            total_count = sum(tokens_count.values())  # 计算当前前缀的总计数
            for token, count in tokens_count.items():  # 遍历每个Bigram计数
                ngram_probs[prefix][token] = \
                    count / total_count  # 计算每个Bigram概率
    
        print("gram概率:") # 打印Bigram概率
        for prefix, probs in ngram_probs.items():
            print("{}: {}".format("".join(prefix), dict(probs)))
        print('-'*100)
        return ngram_probs
    
  5. 定义生成下一个词的函数,如果前缀不在语料库中则返回None,如果在的话取几率最大的作为输出

    # 定义生成下一个词的函数
    def generate_next_token(prefix, bigram_probs):
        if not prefix in bigram_probs:  # 如果前缀不在Bigram概率中,返回None
            return None
        next_token_probs = bigram_probs[prefix]  # 获取当前前缀对应的下一个词的概率
        next_token = max(next_token_probs, 
                         key=next_token_probs.get)  # 选择概率最大的词作为下一个词
    
        return next_token
    
  6. 生成连续文本, 这里需要根据n 和随机输入一个prefix 从而得到不间断的生成新的文本,由于可能生成的长度很长,这里通过设置length进行截断

    def generate_text(prefix, tigram_probs, length=8 , n = 2): 
        '''n : gram'''
        tokens = list(prefix)  # 将前缀转换为字符列表
        for _ in range(length - len(prefix)):  # 根据指定长度生成文本 
            # 获取当前前缀对应的下一个词
            next_token = generate_next_token(tuple(tokens[-1 * (n - 1) : ]), tigram_probs) 
            if not next_token: # 如果下一个词为None,跳出循环
                break
            tokens.append(next_token) # 将下一个词添加到生成的文本中
        return "".join(tokens) # 将字符列表连接成字符串
    



最后生成的结果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ndd9jZne-1686236125354)(image/ngram/1686236001438.png)]

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

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

相关文章

风景类Midjourney prompt提示词

稳定输出优美风景壁纸的Midjourney prompt提示词。 1\在夏夜,有淡蓝色的星空,海边,流星,烟花,海滩上全是蓝色的玫瑰和绿色的植物,由Ivan Aivazovsky和Dan Mumford,趋势在cgsociety,…

CAN转串口设备在使用时可能遇到的问题和解决方案

上位机软件通过232串口发送数据经过CAN转232设备转换成CAN数据发送到仪表中,仪表接收到指定的数据后,返回特定的CAN数据。 使用过程中可能遇到的问题 1、串口按照规则发送数据后,设备端没有数据返回 遇到这种情况,先检查发送的数…

STM32 Proteu直流电机正反转控制系统限位开关-0035

STM32 Proteu直流电机正反转控制系统限位开关-0035 Proteus仿真小实验: STM32 Proteu直流电机正反转控制系统限位开关-0035 功能: 硬件组成:STM32F103C6单片机 L298N电机控制电路直流电机3个按键(正转、反转、停止)L…

AM62X+FPGA+AD+vxworks实时操作系统数据采集处理解决方案

Specification Description 处理器 AM6231 at up to 1.2GHz 操作系统 VXWORKS 存储 DDR4,8GB EMMC 接口 •PrPMC接口 •1个USB2.0 •3路RMII •1路RS485 •1路IRIGB •1路RS232 调试接口 JTAG / COP debug port 工业环境监测设备: Specification Desc…

常见优化器详解

优化器 目前有两种主流优化器:随机梯度下降系(Stochastic Gradient Descent, SGD)和Adam系。 应该认识到的是,优化器并不是某类数学上的优化算法,而是梯度下降(一阶迭代法)的工程实现方案和包…

VALSE2023-内容总结(正在更新)

博文为精选内容,完整ppt请留言索取 一周内更新完毕,敬请期待 2023年度视觉与学习青年学者研讨会 (Vision And Learning SEminar, VALSE)于6月10日至12日在无锡太湖国际博览中心召开,由中国人工智能学会、中国图象图形学学会主办,…

Transformer与注意力机制

Transformer与注意力机制 1. RNN基础 循环神经网络(RNN)是专门用来处理自然语言、金融信息等时序数据的一种神经网络。它的结构和运作方式如下图所示,基于马尔可夫决策模型。 图1 循环神经网络的结构和运作方式 应该注意到以下几个性质&a…

周四见 | 物流人的一周资讯

菜鸟618推出“小件3元发全国”服务 6月12日消息,针对美妆商家618期间轻小件的发货需求,菜鸟推出“极致小件3元发全国”服务,利用全国6大基地,100%自营的仓配供应链能力,支持订单高爆发,并提供破损包赔、时…

开源、跨平台安卓摸鱼(投屏)软件 Scrcpy 中文使用指南

废话不说,先上链接:GitHub上的Scrcpy 介绍: Scrcpy 可以将手机画面投射到电脑上,让你可以在电脑上对手机进行操控。Scrcpy 通过 USB 或 Wi-Fi 与安卓手机相连,不需要在手机上安装任何 app,也不需要取得 R…

Vue-插件(plugin)

插件(plugin) 插件是vue中特别强大并且特别简单的一个东西,它可以帮助我们增强vue 插件本质来说就是一个对象,但是这个对象必须包含install(安装)方法,由vue帮助我们调用 只要插件写的足够的好,就可以帮助我们实现很多的功能&a…

一些常用linux命令

系列文章目录 文章目录 系列文章目录一、常用linux命令1. lsof介绍2.查看进程的几种命令3.查看inode号的几种命令4.查看Linux系统负载的命令一般常用的有4种:5.iostat 主要用于输出磁盘IO 和 CPU的统计信息。 总结 一、常用linux命令 1. lsof介绍 lsof可以查看你所打开的文件…

工具篇--5 WIndow/Linux--Mysql binLog日志监听Canal安装

前言:作为一个中间件canal,可以实时的监听到mysql 中表结构及数据的变化, 项目中只需要接入canal ,不需要我们在业务中进行aop 或者接口的编写就可以及时的收到数据的变化。 1 介绍: Canal是阿里巴巴开源的一款基于M…

想要用好ChatGPT,首先得学会用提示词!

用好ChatGPT,可以辅助学习~ 期末季,一年中体验过最多地区时差的一段时期,懂的都懂😲 放下essay刷个小红薯也都是“赶due病友”…几周内5-6个essay ddl的经历相信不少同学都深有体会。 而今年的一大不同就是有了“哆啦C梦”——…

PostgreSQL行转列

管理拓展 启用拓展 -- 启用拓展 create extension tablefunc; --tablefunc扩展模块包含一系列返回记录表的函数。 create extension "uuid-ossp";--uuid扩展函数拓展启动后,可以在public空间下查看到crosstab函数 卸载函数 drop extension tablefunc…

信创办公–基于WPS的PPT最佳实践系列 (使用母版进行有效设计)

信创办公–基于WPS的PPT最佳实践系列 (使用母版进行有效设计) 目录 应用背景相关知识操作步骤1、认识母版2、在每页幻灯片底部添加logo图片3、第一张幻灯片和最后一张幻灯片出现logo图片,其他页面不出现4、除了封面封底之外,其他页…

硬件速攻-ATK1218正点原子GPS模块

效果演示(注意室内是没有数据) 模块实物图与接线方法 SPP 可不接(这个连到了模块上的灯) RXD 接单片机TXD TXD 接单片机串口RXD GND 接单片机GND VCC接单片机5V IPEX一定要接送的天线 而且天线要放到室外 再次说明提醒 精简代码与说明 如果你只想获取经纬度而已 你可用屏…

原来C语言计算的数只要低过4个字节就要整型提升!

C的整型算术运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换被称为整型提升。 比如: char a 3; char b 127; char c a b; printf("%d&q…

Vue中如何进行地图轨迹展示与追踪?

Vue中如何进行地图轨迹展示与追踪? 随着移动互联网技术的快速发展,位置数据的应用越来越广泛。在许多应用程序中,地图轨迹展示和追踪功能已经成为了基本功能之一。在Vue中,我们可以使用许多不同的地图API和库来实现这些功能。本文…

ATTCK v13版本战术介绍——凭证访问(三)

一、引言 在前几期文章中我们介绍了ATT&CK中侦察、资源开发、初始访问、执行、持久化、提权、防御规避战术,本期我们为大家介绍ATT&CK 14项战术中凭证访问战术第13-17种子技术,后续会介绍凭证访问其他子技术,敬请关注。 二、ATT&…

智能图像处理竟然能做出这种神奇的事

前言 大家都知道,搞论文的时候很多的时候都需要数据来做支撑,对应的我就需要在很多期刊中获取对应的Figure,但是获取很麻烦,就算拍摄出来,放在论文里面效果也不是很好,而且歪七扭八的很碍眼。在这种事情上就…