探索N-gram模型:语言模型中的基础算法

news2024/11/26 12:23:46

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️

👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博相关......)👈

N-gram

(封面图由ERNIE-ViLG AI 作画大模型生成)

探索N-gram模型:语言模型中的基础算法

当你输入一句话时,你有没有想过计算机是如何理解这句话的含义并做出正确的回答的呢?这涉及到自然语言处理(NLP)领域的一个重要概念——语言模型(Language Model)。语言模型可以用来预测一个给定序列(通常是单词序列或字符序列)的下一个单词或字符,这对于很多NLP任务都是很有用的。其中,N-gram模型是一种基于统计的语言模型,是自然语言处理中最经典的模型之一。本文将会详细介绍N-gram模型的原理、方法、优缺点以及实际应用,并结合案例和代码进行讲解。

1. N-gram模型的原理

1.1 概述

N-gram模型是一种基于马尔科夫链的统计语言模型。它假设一个词的出现只与前面N个词有关,即一个词的出现只与它前面N个词的出现概率相关。因此,N-gram模型被称为是一个N阶马尔科夫链模型。在实际应用中,N一般取1、2、3等较小的值。

1.2 公式推导

为了方便理解,我们以二元模型(N=2)为例进行推导。假设一个句子 W = w 1 w 2 ⋯ w n W=w_1w_2\cdots w_n W=w1w2wn,其中 w i w_i wi表示第i个单词。根据链式法则,句子W的概率可以表示为:

P ( W ) = P ( w 1 ) P ( w 2 ∣ w 1 ) P ( w 3 ∣ w 1 w 2 ) ⋯ P ( w n ∣ w n − 1 w n − 2 ⋯ w 1 ) P(W)=P(w_1)P(w_2|w_1)P(w_3|w_1w_2)\cdots P(w_n|w_{n-1}w_{n-2}\cdots w_1) P(W)=P(w1)P(w2w1)P(w3w1w2)P(wnwn1wn2w1)

其中, P ( w i ∣ w i − 1 ⋯ w 1 ) P(w_i|w_{i-1}\cdots w_1) P(wiwi1w1)表示在已知前i-1个单词的情况下,第i个单词出现的概率。

根据马尔科夫假设,第i个单词出现的概率只与前面的一个单词有关,即:

P ( w i ∣ w i − 1 ⋯ w 1 ) ≈ P ( w i ∣ w i − 1 ) P(w_i|w_{i-1}\cdots w_1)\approx P(w_i|w_{i-1}) P(wiwi1w1)P(wiwi1)

将上式代入 P ( W ) P(W) P(W)中,得到:

P ( W ) = P ( w 1 ) ∏ i = 2 n P ( w i ∣ w i − 1 ) P(W)=P(w_1)\prod_{i=2}^{n} P(w_i|w_{i-1}) P(W)=P(w1)i=2nP(wiwi1)

此时,句子W的概率就可以用二元模型表示。
对于N元模型,同理可得:

P ( W ) = P ( w 1 ) ∏ i = 2 n P ( w i ∣ w i − 1 w i − 2 ⋯ w i − N + 1 ) P(W)=P(w_1)\prod_{i=2}^{n} P(w_i|w_{i-1}w_{i-2}\cdots w_{i-N+1}) P(W)=P(w1)i=2nP(wiwi1wi2wiN+1)

1.3 实例说明

假设我们有一个由4个单词组成的句子:I love basketball games。

以二元模型为例,我们可以得到每个单词出现的概率:
P ( I ) = 0.25 P(\text{I})=0.25 P(I)=0.25
P ( love ∣ I ) = 1 P(\text{love}|\text{I})=1 P(loveI)=1
P ( basketball ∣ love ) = 1 P(\text{basketball}|\text{love})=1 P(basketballlove)=1
P ( games ∣ basketball ) = 1 P(\text{games}|\text{basketball})=1 P(gamesbasketball)=1

因此,根据公式推导,这个句子的概率为:

P ( I love basketball games ) = 0.25 × 1 × 1 × 1 = 0.25 P(\text{I love basketball games})=0.25\times 1\times 1\times 1=0.25 P(I love basketball games)=0.25×1×1×1=0.25

2. N-gram模型的优缺点

N-gram模型作为一种简单而有效的语言模型,具有以下优点:

  1. 简单易懂:N-gram模型基于统计方法,直观易懂,容易实现和调整。

  2. 适用范围广:N-gram模型可以用于多种自然语言处理任务,如语音识别、机器翻译、文本生成等。

  3. 可扩展性好:N-gram模型可以通过增加N值来提高模型的准确性,也可以结合其他算法和技术来进一步优化模型。

然而,N-gram模型也存在一些缺点:

  1. 数据稀疏性:由于自然语言具有复杂的结构和多样的表达方式,N-gram模型在处理稀疏数据时可能会出现问题。

  2. 上下文依赖性:N-gram模型只考虑当前词的前N-1个词作为上下文,无法捕捉长距离依赖关系,这可能会导致模型的准确性受到限制。

  3. 参数过多:对于大规模的文本数据,N-gram模型需要维护大量的参数,这可能会导致模型的计算复杂度和存储开销过大。

3. 案例

接下来,我们将通过一个例子来介绍如何实现N-gram模型。假设我们有一个文本文件,其中包含了若干个句子。我们需要利用这个文本文件来构建一个2-gram模型,即考虑当前词的出现只与前面一个词有关。

首先,我们需要将文本文件中的所有句子读入,并对每个句子进行分词处理。然后,我们需要构建一个词汇表,统计每个词在整个文本中出现的次数。接下来,我们可以利用这些统计信息来计算2-gram模型的条件概率值。

具体而言,我们可以构建一个词频矩阵,其中每一行表示一个词,每一列表示该词后面出现的另一个词,矩阵中的每个元素表示该词后面出现指定词的次数。然后,我们可以将矩阵中的每个元素除以该词出现的总次数,从而得到2-gram模型的条件概率矩阵。

下面是一个Python实现的示例代码:

import jieba
import numpy as np

# 读取文本文件
with open('text.txt', 'r', encoding='utf-8') as f:
    text = f.read()

# 分词处理
sentences = text.split('\n')
words = []
for sentence in sentences:
    words += jieba.lcut(sentence)

# 构建词汇表
vocab = list(set(words))
word2idx = {w: i for i, w in enumerate(vocab)}
idx2word = {i: w for i, w in enumerate(vocab)}
vocab_size = len(vocab)

# 构建2-gram模型
freq_matrix = np.zeros((vocab_size, vocab_size))
for i in range(len(words) - 1):
    row = word2idx[words[i]]
    col = word2idx[words[i+1]]
    freq_matrix[row, col] += 1

prob_matrix = freq_matrix / np.sum(freq_matrix, axis=1, keepdims=True)

为了验证N-gram模型的效果,我们可以利用一个标准的语言模型评测数据集来进行实验。这里我们选用了Penn Treebank数据集,它是一个经典的英文语言模型评测数据集,包含了大量的新闻和文章文本。

我们可以将Penn Treebank数据集分成训练集、验证集和测试集三部分。使用训练集和验证集来训练N-gram模型,并调整模型的参数,如N值和平滑方法等。然后,我们可以利用测试集来评估模型的效果。

下面是一个Python实现的示例代码:

import nltk
from nltk.corpus import treebank

# 读取Penn Treebank数据集
sentences = treebank.sents()
words = []
for sentence in sentences:
	words += sentence

#将数据集分成训练集、验证集和测试集
train_size = int(len(words) * 0.6)
valid_size = int(len(words) * 0.2)
test_size = len(words) - train_size - valid_size
train_words = words[:train_size]
valid_words = words[train_size:train_size+valid_size]
test_words = words[-test_size:]
# 构建词汇表
vocab = list(set(train_words))
word2idx = {w: i for i, w in enumerate(vocab)}
idx2word = {i: w for i, w in enumerate(vocab)}
vocab_size = len(vocab)

# 计算2-gram模型的条件概率矩阵
freq_matrix = np.zeros((vocab_size, vocab_size))
for i in range(len(train_words) - 1):
	row = word2idx[train_words[i]]
	col = word2idx[train_words[i+1]]
	freq_matrix[row, col] += 1

prob_matrix = freq_matrix / np.sum(freq_matrix, axis=1, keepdims=True)

# 使用验证集调整2-gram模型的参数
best_n = None
best_smooth = None
best_perplexity = float('inf')
for n in [1, 2, 3, 4]:
	for smooth in ['additive', 'interpolated', 'discounted']:
		model = NGramModel(n=n, smoothing=smooth)
		model.train(train_words)
		perplexity = model.evaluate(valid_words)
		if perplexity < best_perplexity:
			best_n = n
			best_smooth = smooth
			best_perplexity = perplexity

# 在测试集上评估2-gram模型的效果
model = NGramModel(n=best_n, smoothing=best_smooth)
model.train(train_words)
perplexity = model.evaluate(test_words)
print('2-gram model with {}-gram and {} smoothing, perplexity: {:.2f}'.format(best_n, best_smooth, perplexity))

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

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

相关文章

Proteus8.15安装教程

1、解压Proteus8.15 安装包&#xff0c;然后双击进去&#xff0c;找到setup文件&#xff0c;右键&#xff0c;以管理员身份运行。 2、需要安装一些插件&#xff0c;点击“next”。把插件安装完成。 点击“finfish” 点击“install” 点击“Cancel” 3、如果没有上面步骤&…

零拷贝技术

1. 零拷贝技术 零拷贝就是一种避免 CPU 将数据从一块存储拷贝到另外一块存储的技术。针对操作系统中的设备驱动程序、文件系统以及网络协议堆栈而出现的各种零拷贝技术极大地提升了特定应用程序的性能&#xff0c;并且使得这些应用程序可以更加有效地利用系统资源。这种性能的…

latex使用笔记

在线表格转latex格式:https://tablesgenerator.com/ 在线公式转latex格式:https://latex.91maths.com/ 1、希腊字母 eg.σ 2、% 3、大小写罗马数字 大写罗马数字&#xff1a;\uppercase\expandafter{\romannumeral} 在romannumeral后加上相应的数字即可。 eg.Ⅱ \uppercas…

Python每日一练(20230311)

目录 1. 合并两个有序数组 2. 二叉树的右视图 3. 拼接最大数 &#x1f31f; 每日一练刷题专栏 C/C 每日一练 ​专栏 Python 每日一练 专栏 1. 合并两个有序数组 给你两个有序整数数组 nums1 和 nums2&#xff0c;请你将 nums2 合并到 nums1 中&#xff0c;使 nums1 成为…

SpringSecurity第一讲

目录 一、SpringSecurity01 1.2 什么是会话 1.2.1 基于session的认证 1.2.2 基于ToKen的认证 1.3 什么是授权 1.3.1 为什么要授权 1.3.2 SpringSecurity简介 1.4 SpringSecurity入门 1.4.1 pom文件 1.4.2 主启动类 1.4.3 创建控制层 1.4.4 启动项目进行测试 1.5 自…

工作三年,月薪不到20k,软件测试工程师,担心被应届生取代

工作了3年&#xff0c;一个月工资不到20K&#xff0c;担心被应届毕业生取代&#xff01; 互联网的快速发展伴随着员工适者生存的加速。几年是一条分界线。如果人们的能力和体力不够&#xff0c;他们就会被淘汰。生动的工作生活让许多人焦虑不安。 最近&#xff0c;一名来自211本…

Java分布式事务(五)

前言 随着互联网的快速发展&#xff0c;软件系统由原来的单体应用转变为分布式应用&#xff0c;下图描述了单体应用向微服务的演变。 文章目录&#x1f525;分布式事务处理-认识分布式事物&#x1f525;分布式架构的理论知识-CAP理论&#x1f525;分布式事务处理-分布式事务产…

查询校园网是否支持IPv6绕过校园网

方法一、连接校园网&#xff0c;登录认证网络可用后返回WIFI页面点击校园网WIFI的属性查看是否有IPV6地址 本地的IPV6地址不算哦 &#xff08;一般IPv6地址都是数字开头&#xff0c;fe80开头的都是本地IPv6地址是没用的&#xff09;方法二、连接校园网&#xff0c;登录认证网络…

《信号分析与处理》期末复习题库整理(题目+手写知识点+答案+期末知识点精细)

文章目录一、傅里叶变换、s域变换、z域变换&#xff08;待&#xff1a;整理一些常用以及方程变换&#xff09;傅里叶变换s域变换z域变换二、试卷一、选择题12345678910111213141516171819202122232425262728二、填空题123567891011121314151617三、计算题123456781011121314151…

shiro反序列化

shiro550反序列化 | 清风的博客这个看着更舒服点 环境搭建 JDK&#xff1a;1.7 Tomcat&#xff1a;8.5.83 shiro源码&#xff1a;下载地址&#xff1a;https://codeload.github.com/apache/shiro/zip/shiro-root-1.2.4 shiro war包&#xff1a;下载地址SHIRO-550/samples-…

逻辑优化基础-disjoint support decomposition

先遣兵 在了解 disjoint support decomposition 之前&#xff0c;先学习两个基本的概念。 disjoint 数学含义上的两个集合交集&#xff0c;所谓非相交&#xff0c;即交集为空集。 A∩BC⊘A \cap B C \oslash A∩BC⊘ support 逻辑综合中的 supportsupportsupport 概念是…

【创建“待选项”按钮02计算坐标 Objective-C语言】

一、之前,我们已经把“待选项”按钮,创建好了,但是唯一的问题是,坐标都是一样的,所以都显示在一起了 1.下面,我们来设置一下,这些“待选项”按钮的坐标, 现在,“待选项”按钮的坐标,是不是都在同一个位置啊, 回忆一下,这个待选项按钮,是怎么生成的, 首先,是在…

PCA-APCA-MLR

全称 principal component analysis-absolute principal component score-multiple linear regression 原理 绝对因子分析/多元线性回归受体模型(APCS—MLR)的基本原理是将因子分析的主因子得分转化为绝对主因子得分(APCS),各指标含量再分别对所有的APCS进行多元线性回…

课程作业及比赛任务,已支持 Notebook 内直接提交|ModelWhale 版本更新

早春时节、万物复苏&#xff0c;我们又迎来了 ModelWhale 新一轮的版本更新。本次更新中&#xff0c;ModelWhale 主要进行了以下功能迭代&#xff1a;新增 Notebook 内提交课程作业及比赛任务&#xff08;团队版✓ &#xff09;新增 Canvas 组件停止维护提示&#xff08;团队版…

44-Golang中的channel

Golang中的channel为什么要使用channelchannel的介绍channel的基本使用定义/声明channel管道的遍历和关闭channel的关闭channel的遍历goroutine和channel结合应用实例1应用实例2案例注意事项为什么要使用channel 前面使用全局变量加锁同步来解决goroutine的通讯&#xff0c;但…

设计模式—适配器模式

适配器模式&#xff08;Adapter Pattern&#xff09;是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式&#xff0c;它结合了两个独立接口的功能。这种模式涉及到一个单一的类&#xff0c;该类负责加入独立的或不兼容的接口功能。举个真实的例子&#xff0c…

【操作系统】如何排查死锁?

【操作系统】如何排查死锁&#xff1f; 文章目录【操作系统】如何排查死锁&#xff1f;死锁的概念死锁的排查工具排查工具 1&#xff1a;jstack排查工具 2&#xff1a;jconsole死锁的发生条件互斥条件持有并等待条件不可剥夺条件环路等待条件避免死锁问题的发生总结死锁的概念 …

TCP、UDP

TCP和UDPTCP报头三次握手&#xff0c;四次挥手确认机制&#xff08;重传ARQ&#xff09;重传机制拥塞控制&#xff08;慢开始-拥塞避免&#xff0c;快重传、快恢复&#xff09;流量控制&#xff08;滑动窗口&#xff09;差错控制&#xff08;校验和&#xff09;UDP报头TCP和UDP…

Qt之高仿QQ系统设置界面

QQ或360安全卫士的设置界面都是非常有特点的,所有的配置项都在一个垂直的ScrollArea中,但是又能通过左侧的导航栏点击定位。这样做的好处是既方便查看指定配置项,又方便查看所有配置项。 一.效果 下面左边是当前最新版QQ的系统设置界面,右边是我的高仿版本,几乎一毛一样…

JVM初步理解浅析

一、JVM的位置 JVM的位置 JVM在操作系统的上一层&#xff0c;是运行在操作系统上的。JRE是运行环境&#xff0c;而JVM是包含在JRE中 二、JVM体系结构 垃圾回收主要在方法区和堆&#xff0c;所以”JVM调优“大部分也是发生在方法区和堆中 可以说调优就是发生在堆中&#xf…