NLP_语言模型的雏形 N-Gram 模型

文章目录

  • N-Gram 模型
    • 1.将给定的文本分割成连续的N个词的组合(N-Gram)
    • 2.统计每个N-Gram在文本中出现的次数,也就是词频
    • 3.为了得到一个词在给定上下文中出现的概率,我们可以利用条件概率公式计算。具体来讲,就是计算给定前N-1个词时,下一个词出现的概率。这个概率可以通过计算某个N-Gram出现的次数与前N-1个词(前缀)出现的次数之比得到
    • 4.可以使用这些概率来预测文本中下一个词出现的可能性。多次迭代这个过程,甚至可以生成整个句子,也可以算出每个句子在语料库中出现的概率
  • “词”是什么,如何“分词”
  • 创建一个Bigram字符预测模型
    • 1.构建实验语料库
    • 2.把句子分成N个Gram(分词)
    • 3.计算每个Bigram在语料库中的词频
    • 4.计算每个Bigram的出现概率
    • 5.根据Bigram出现的概率,定义生成下一个词的函数
    • 6.输入一个前缀,生成连续文本
  • N-Gram 模型小结


N-Gram 模型

N-Gram 模型的构建过程如下:

1.将给定的文本分割成连续的N个词的组合(N-Gram)

比如,在Bigram 模型(2-Gram 模型,即二元模型)中,我们将文本分割成多个由相邻的两个词构成的组合,称它们为“二元组”(2-Gram )。

在这里插入图片描述

2.统计每个N-Gram在文本中出现的次数,也就是词频

比如,二元组“我爱”在语料库中出现了3次(如下页图所示),即这个二元组的词频为3。
在这里插入图片描述

3.为了得到一个词在给定上下文中出现的概率,我们可以利用条件概率公式计算。具体来讲,就是计算给定前N-1个词时,下一个词出现的概率。这个概率可以通过计算某个N-Gram出现的次数与前N-1个词(前缀)出现的次数之比得到

比如,二元组“我爱”在语料库中出现了3次,而二元组的前缀“我”在语料库中出现了10次,则给定“我”,下一个词为“爱”的概率为30%(如下图所示)。

在这里插入图片描述

4.可以使用这些概率来预测文本中下一个词出现的可能性。多次迭代这个过程,甚至可以生成整个句子,也可以算出每个句子在语料库中出现的概率

在这里插入图片描述
比如,从一个字“我”,生成“爱”,再继续生吃
成“吃”,直到“我爱吃肉”这个句子。计算“我爱”“爱吃”“吃肉”出现的概率,然后乘以各自的条件概率,就可以得到这个句子在语料库中出现的概率了。如上图所示。

“词”是什么,如何“分词”

在N-Gram 模型中,它表示文本中的一个元素,“N-Gram”指长度为N的连续元素序列。

这里的“元素”在英文中可以指单词,也可以指字符,有时还可以指“子词”(Subword );而在中文中,可以指词或者短语,也可以指字。

一般的自然语言处理工具包都为我们提供好了分词的工具。比如,英文分词通常使用 NLTK、spaCy等自然语言处理库,中文分词通常使用jieba库(中文NLP工具包),而如果你将来会用到BERT这样的预训 I练模型,那么你就需要使用BERT 的专属分词器Tokenizer,它会把每个单词拆成子词一这是 BERT处理生词的方法。

创建一个Bigram字符预测模型

在这里插入图片描述

1.构建实验语料库

# 构建一个数据集
corpus = ["小张每天喜欢学习","小张周末喜欢徒步","小李工作日喜欢加班","小李周末喜欢爬山","小张周末喜欢爬山","小李不喜欢躺平"]

2.把句子分成N个Gram(分词)

# 定义一个分词函数,将文本转换为单个字符的列表
def tokenize(text):return [char for char in text] # 将文本拆分为字符列表
# 对每个文本进行分词,并打印出对应的单字列表
print("单字列表:") 
for text in corpus:tokens = tokenize(text)print(tokens)

在这里插入图片描述

3.计算每个Bigram在语料库中的词频

# 定义计算 N-Gram 词频的函数
from collections import defaultdict, Counter # 导入所需库
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-Gramngram = tuple(tokens[i:i+n])  # 创建一个 N-Gram 元组prefix = ngram[:-1]  # 获取 N-Gram 的前缀token = ngram[-1]  # 获取 N-Gram 的目标单字ngrams_count[prefix][token] += 1  # 更新 N-Gram 计数return ngrams_count
bigram_counts = count_ngrams(corpus, 2) # 计算 bigram 词频
print("bigram 词频:") # 打印 bigram 词频
for prefix, counts in bigram_counts.items():print("{}: {}".format("".join(prefix), dict(counts))) 

在这里插入图片描述

4.计算每个Bigram的出现概率

# 定义计算 N-Gram 出现概率的函数
def ngram_probabilities(ngram_counts):ngram_probs = defaultdict(Counter) # 创建一个字典,存储 N-Gram 出现的概率for prefix, tokens_count in ngram_counts.items(): # 遍历 N-Gram 前缀total_count = sum(tokens_count.values()) # 计算当前前缀的 N-Gram 计数for token, count in tokens_count.items(): # 遍历每个前缀的 N-Gramngram_probs[prefix][token] = count / total_count # 计算每个 N-Gram 出现的概率return ngram_probs
bigram_probs = ngram_probabilities(bigram_counts) # 计算 bigram 出现的概率
print("\nbigram 出现的概率 :") # 打印 bigram 概率
for prefix, probs in bigram_probs.items():print("{}: {}".format("".join(prefix), dict(probs)))

在这里插入图片描述

5.根据Bigram出现的概率,定义生成下一个词的函数

# 定义生成下一个词的函数
def generate_next_token(prefix, ngram_probs):if not prefix in ngram_probs: # 如果前缀不在 N-Gram 中,返回 Nonereturn Nonenext_token_probs = ngram_probs[prefix] # 获取当前前缀的下一个词的概率next_token = max(next_token_probs, key=next_token_probs.get) # 选择概率最大的词作为下一个词return next_token

6.输入一个前缀,生成连续文本

# 定义生成连续文本的函数
def generate_text(prefix, ngram_probs, n, length=8):tokens = list(prefix) # 将前缀转换为字符列表for _ in range(length - len(prefix)): # 根据指定长度生成文本 # 获取当前前缀的下一个词next_token = generate_next_token(tuple(tokens[-(n-1):]), ngram_probs) if not next_token: # 如果下一个词为 None,跳出循环breaktokens.append(next_token) # 将下一个词添加到生成的文本中return "".join(tokens) # 将字符列表连接成字符串
# 输入一个前缀,生成文本
generated_text = generate_text("小", bigram_probs, 2)
print("\n 生成的文本:", generated_text) # 打印生成的文本

在这里插入图片描述

N-Gram 模型小结

N-Gram 是一种用于语言建模的技术,它用来估计文本中词序列的概率分布。 N-Gram 模型将文本看作一个由词序列构成的随机过程,根据已有的文本数据,计算出词序列出现的概率。因此,N-Gram主要用于语言建模、文本生成、语音识别等自然语言处理任务中。

  • (1)N-Gram是一种基于连续词序列的文本表示方法。它将文本分割成由连续的 N个词组成的片段,从而捕捉局部语序信息。
  • (2)N-Gram 可以根据不同的N值捕捉不同程度的上下文信息。例如,1-Gram(Unigram)仅关注单个词,而2-Gram(Bigram)关注相邻的两个词的组合,以此类推。
  • (3)随着N的增加,模型可能会遇到数据稀疏性问题,导致模型性能下降。

学习的参考资料:
(1)书籍
利用Python进行数据分析
西瓜书
百面机器学习
机器学习实战
阿里云天池大赛赛题解析(机器学习篇)
白话机器学习中的数学
零基础学机器学习
图解机器学习算法

动手学深度学习(pytorch)

(2)机构
光环大数据
开课吧
极客时间
七月在线
深度之眼
贪心学院
拉勾教育
博学谷
慕课网
海贼宝藏

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

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

相关文章

ChatPromptTemplate和AI Message的用法

ChatPromptTemplate的用法 用法1: from langchain.chains import LLMChain from langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import ChatPromptTemplate from langchain_community.tools.tavily_search import TavilySear…

STM32 微控制器应用领域

STM32 微控制器在多个领域有广泛应用,具体如下: 工业自动化:STM32 在工厂自动化、机器人控制、传感器接口和数据采集等方面具有出色的性能和可靠性,有助于实现高效的工业自动化系统。消费电子:STM32 适用于智能手机、…

阿里 EasyExcel 表头国际化

实体类字段使用EasyExcel提供的注解ExcelProperty,value 值写成占位符形式 ,匹配 i18n 文件里面的编码。 如: /*** 仓库名称*/ ExcelProperty("{warehouse.record.warehouseName}") private String warehouseName;占位符解析器 A…

《电子芯片的夜晚》

《电子芯片的夜晚》 在这个寂静的城市中,有一位名叫小明的程序员。他不同寻常,因为他有一项神奇的技能——他能够让电子芯片们说出自己的故事。 一天,小明收到了一块别具灵性的电子芯片,传说这块芯片能够在夜晚让设备们复活&…

笔记---dp---数字三角形模型

所谓数字三角形模型,即是从数字三角形这一题衍生出来的 题目为经典题目,不再赘述,此笔记根据AcWing算法提高课来进行对数字三角形模型衍生例题的记录 题目关系如下(见AcWing里的AcSaber): AcWing.1015.摘…

哪些软件可以提供更好的协同办公体验?

协同办公软件的选择取决于您的具体需求,包括团队规模、工作流程、预算以及所需的特定功能。根据搜索结果,这里有一些被推荐的协同办公软件,它们在不同的领域提供了良好的协同体验: 一、文档协同: 1.Pixso:这…

微信小程序(三十八)滚动容器

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.滚动触底事件 2.下拉刷新事件 源码&#xff1a; index.wxml <view class"Area"> <!-- scroll-y 垂直滚动refresher-enabled 允许刷新bindrefresherrefresh 绑定刷新作用函数bindscrollto…

单片机无线发射的原理剖析

目录 一、EV1527编码格式 二、OOK&ASK的简单了解 三、433MHZ 四、单片机的地址ID 五、基于STC15W104单片机实现无线通信 无线发射主要运用到了三个知识点&#xff1a;EV1527格式&#xff1b;OOk&#xff1b;433MHZ。下面我们来分别阐述&#xff1a; EV1527是数据的编…

【算法题】92. 反转链表 II

题目 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], left 2, right 4 输出&#xff1a;[…

Android 9.0 禁用adb reboot recovery命令实现正常重启功能

1.前言 在9.0的系统rom定制化开发中,在定制recovery模块的时候,由于产品开发需要要求禁用recovery的相关功能,比如在通过adb命令的 adb reboot recovery的方式进入recovery也需要实现禁用,所以就需要了解相关进入recovery流程来禁用该功能 2.禁用adb reboot recovery命…

【力扣 67】二进制求和 C++题解(位运算+模拟+字符串+位集合)

给你两个二进制字符串 a 和 b &#xff0c;以二进制字符串的形式返回它们的和。 示例 1&#xff1a; 输入:a “11”, b “1” 输出&#xff1a;“100” 示例 2&#xff1a; 输入&#xff1a;a “1010”, b “1011” 输出&#xff1a;“10101” 提示&#xff1a; 1 <…

网神 SecGate 3600 防火墙 route_ispinfo_import_save 文件上传漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

Golang 基础 Go Modules包管理

Golang 基础 Go Modules包管理 在 Go 项目开发中&#xff0c;依赖包管理是一个非常重要的内容&#xff0c;依赖包处理不好&#xff0c;就会导致编译失败&#xff0c;本文将系统介绍下 Go 的依赖包管理工具。 我会首先介绍下 Go 依赖包管理工具的历史&#xff0c;并详细介绍下…

LeetCode动态规划的解题思路

动态规划 动态规划&#xff0c;其实就是找规律&#xff0c;总结公式/方程。 动态规划&#xff0c;类似于数学归纳法。 关键的思想在「自底向上」和「空间换时间」。 动态规划&#xff0c;可以使用一维数组&#xff0c;有时也会用到二维数组。 应用场景 “动态规划”可以用于…

idea2023创建spring项目无法选择Java8

idea2023创建spring项目无法选择Java8 今天下载了新版的idea 2023.3.2&#xff0c;但是在创建springboot项目的时候只能选择Java17和Java21&#xff0c;没法选择其他的版本。 使用下面阿里云的地址替换Server URL中的start.spring.io的地址即可 https://start.aliyun.com/替…

C#调用WechatOCR.exe实现本地OCR文字识别

最近遇到一个需求&#xff1a;有大量的扫描件需要还原为可编辑的文本&#xff0c;很显然需要用到图片OCR识别为文字技术。本来以为这个技术很普遍的&#xff0c;结果用了几个开源库&#xff0c;效果不理想。后来&#xff0c;用了取巧的方法&#xff0c;直接使用了WX的OCR识别模…

Linux大集合

Linux Linux是什么&#xff1f; Linux是一套免费使用和自由传播的类Unix操作系统&#xff0c;是一个基于POSIX和UNIX的多用户、多任务、 支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和 64位硬件。 Linux内核 是一个Linux系统…

可达鸭二月月赛——入门赛第四场T3题解

姓名 王胤皓 AC 记录 题目&#xff1a; 思路 用数组进行操作太难&#xff0c;而这些操作可以再 STL 中的 vector 容器&#xff0c;有 insert 和 erase 函数&#xff0c;所以非常方便。 vector 下标从 0 0 0 开始&#xff0c;所以所有操作都要 − 1 -1 −1。 操作 1 1 1 …

Redis的数据类型Hash使用场景实战

Redis的数据类型Hash使用场景 常见面试题&#xff1a;redis在你们项目中是怎么用的&#xff0c;除了String数据类型还使用什么数据类型&#xff1f; 怎么保证缓存和数据一致性等问题… Hash模型使用场景 知识回顾&#xff1a; redisTemplate.opsForHash() 方法是 Redis 的 …

Spring Boot3整合Redis

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 &#x1f30a;山高路远&#xff0c;行路漫漫&#xff0c;终有归途。 目录 前置条件 1.导依赖 2.配置连接信息以及连接池参数 3.配置序列化方式 4.编写测试 前置条件 已经初始化好一个spr…