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.hqwc.cn/news/460009.html

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

相关文章

c++之说_13|模板 折叠表达式

折叠表达式 可以通过形参包的的实际参数&#xff08;不是类型&#xff09; 展开式子 这是这里说的几种 实际上并还有一些写法 先介绍这几种吧 #include <cstdio> template<typename T,T... n> struct integer_sequence {T val; }; template<int idx,typenam…

[NOI2014] 起床困难综合症

[NOI2014] 起床困难综合症 题目描述 21 21 21 世纪&#xff0c;许多人得了一种奇怪的病&#xff1a;起床困难综合症&#xff0c;其临床表现为&#xff1a;起床难&#xff0c;起床后精神不佳。作为一名青春阳光好少年&#xff0c;atm 一直坚持与起床困难综合症作斗争。通过研究…

windows上卸载完程序后,清理残余文件,无法删除的情况处理

现象&#xff1a;通常在卸载完软件后&#xff0c;要删除残余文件或者移动残余文件时候&#xff0c;会弹出来 原因&#xff1a; 因为文件被其他程序已经加载&#xff0c;处理的目标是找到使用这个文件的进程&#xff0c;然后kill掉。类似于linux上的lsof命令查找到进程号&…

C++新版本特性

目录: 前言 C11的常用新特性 auto类型推导&#xff1a; auto的限制&#xff1a; auto的应用&#xff1a; decltype类型推导&#xff1a; decltype的实际应用&#xff1a; 使用using 定义别名&#xff1a; 支持函数模板的默认模板参数 : tuple元组&#xff1a; 列表初…

Linux操作系统基础(三):虚拟机与Linux系统安装

文章目录 虚拟机与Linux系统安装 一、系统的安装方式 二、虚拟机概念 三、虚拟机的安装 四、Linux系统安装 1、解压人工智能虚拟机 2、找到解压目录中的node1.vmx 3、启动操作系统 虚拟机与Linux系统安装 一、系统的安装方式 Linux操作系统也有两种安装方式&#xf…

从零开始手写mmo游戏从框架到爆炸(十)— 集成springboot-jpa与用户表

导航&#xff1a;从零开始手写mmo游戏从框架到爆炸&#xff08;零&#xff09;—— 导航-CSDN博客 集成springboot-jpa&#xff0c;不用mybatis框架一个是方便对接不同的数据源。第二个目前规划的游戏内容可能对数据库的依赖不是很大&#xff0c;jpa应该肯定能满足要求了…

阿里云服务器价格表2024最新版CPU内存带宽报价

2024年2月阿里云服务器租用价格表更新&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年、ECS u1实例2核4G、5M固定带宽、80G ESSD Entry盘优惠价格199元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元、2核4G4M带宽轻量服务器一年165元12个月、2核…

2024.2.7日总结(小程序开发4)

页面导航 页面导航是页面之间的相互跳转&#xff1a; <a>链接location.href 小程序中实现页面导航的两种方式&#xff1a; 声明式导航 在页面上声明一个<navigator>导航组件通过点击<navigator>组件实现页面跳转 编程式导航 调用小程序的导航API&…

[C#] 如何使用ScottPlot.WPF在WPF桌面程序中绘制图表

什么是ScottPlot.WPF&#xff1f; ScottPlot.WPF 是一个开源的数据可视化库&#xff0c;用于在 WPF 应用程序中创建高品质的绘图和图表。它是基于 ScottPlot 库的 WPF 版本&#xff0c;提供了简单易用的 API&#xff0c;使开发人员能够通过简单的代码创建各种类型的图表&#…

极值图论基础

目录 一&#xff0c;普通子图禁图 二&#xff0c;Turan问题 三&#xff0c;Turan定理、Turan图 1&#xff0c;Turan定理 2&#xff0c;Turan图 四&#xff0c;以完全二部图为禁图的Turan问题 1&#xff0c;最大边数的上界 2&#xff0c;最大边数的下界 五&#xff0c;…

CentOS7集群配置免密登录

准备工作 提前开启三台虚拟机hadoop102、hadoop103,hadoop104,关于三台虚拟机的安装可以参考&#xff1a;https://mp.csdn.net/mp_blog/creation/editor/136010108 配置免密登录 一、分别修改三台机器的hosts,配置主机映射关系 vim /etc/hosts 文件中输入以下内容&#xf…

Web 目录爆破神器:Dirb 保姆级教程(附链接)

一、介绍 dirb 是一款用于目录爆破的开源工具&#xff0c;旨在帮助渗透测试人员和安全研究人员发现目标网站上的隐藏目录和文件。它使用字典文件中的单词来构建 URL 路径&#xff0c;然后发送 HTTP 请求来检查这些路径是否存在。 以下是 dirb 工具的一些特点和基本用法&#…