AI大模型开发原理篇-1:语言模型雏形之N-Gram模型

N-Gram模型概念

N-Gram模型是一种基于统计的语言模型,用于预测文本中某个词语的出现概率。它通过分析一个词语序列中前面N-1个词的出现频率来预测下一个词的出现。具体来说,N-Gram模型通过将文本切分为长度为N的词序列来进行建模。

注意:这里的一个Gram(词)不一定是一个单词一个汉字,也可以是一个词组,一个短语,比如“唐僧”、“自然语言”等,还可以是一个字符,比如playing可以分为 play 和 ##ing 这2个Gram。

  • Unigram(1-Gram): 仅依赖于当前词的概率。例如,给定一个句子“我 爱 自然语言”,它将被切分为“我”,“爱”,“自然语言”三个独立的词。

  • Bigram(2-Gram): 使用前一个词来预测下一个词。例如,在句子“我 爱 自然语言”中,Bigram模型将考虑“我 → 爱”和“爱 → 自然语言”两个词对的概率。

  • Trigram(3-Gram): 使用前两个词来预测下一个词。例如,句子“我 爱 自然语言”可以表示为“我 爱 → 自然语言”的三元组。

主要特点:

  • 局部上下文:N-Gram模型假设一个词的出现仅依赖于前面N-1个词。这意味着它没有考虑词序列中更远的上下文信息。
  • 简易实现:N-Gram模型实现简单,可以用于机器翻译、文本生成、自动纠错等多种任务。
  • 数据稀疏问题:随着N的增大,可能会遇到数据稀疏问题,因为某些N-Gram组合可能在训练数据中没有出现过。

优缺点:

  • 优点
    • 简单易懂,容易实现。
    • 可以在不需要太复杂计算的情况下,对语言进行一定的建模。
  • 缺点
    • 模型可能会忽略远距离词之间的依赖关系,限制了其对复杂语言模式的捕捉能力。
    • 数据稀疏问题:如果某个N-Gram在训练数据中没有出现过,模型就无法进行有效预测。

应用场景:

  • 自动文本生成:通过N-Gram模型,可以生成流畅的文本,虽然在复杂度和语义准确度上有一定局限性。
  • 拼写纠错:可以根据大数据中最常见的词组合来判断用户输入是否有误。
  • 语言翻译:基于N-Gram的机器翻译模型,虽然如今已经被更先进的模型(如神经网络)所取代,但仍然有其历史意义。

N-Gram模型的构建过程

1. 数据预处理

首先,获取原始文本数据,并对其进行预处理。这个过程通常包括:

  • 文本清洗:去除无用的符号、标点符号、特殊字符、HTML标签等。
  • 分词将文本划分为词(或字),这是N-Gram模型的基础。在不同语言中,分词的方法可能有所不同。 一般的自然语言处理工具包都为我们提供好了分词的工具。比如,英文分词通常使用NLTK、spaCy等自然语言处理库,中文分词通常使用jieba库(中文NLP工具包),而如果你将来会用到BERT这样的预训练模型,那么你就需要使用BERT的专属分词器Tokenizer,它会把每个单词拆成子词——这是BERT处理生词的方法。
  • 去除停用词(可选):停用词是指在某些任务中不重要的词,比如“的”、“是”等。虽然在一些情况下,停用词不被删除,但在构建模型时有时会去除这些词以提高效率。

2. 生成N-Grams

在数据预处理完成后,接下来就是生成N-Grams。在这一过程中,将文本划分为连续的N个词组成的序列。

  • Unigram:每个单独的词构成一个N-Gram。例如,文本“我 爱 自然语言”会变成 ["我", "爱", "自然语言"]。
  • Bigram:将相邻的两个词作为一个N-Gram。例如,文本“我 爱 自然语言”会变成 ["我 爱", "爱 自然语言"]。(可称为二元组)
  • Trigram:将相邻的三个词作为一个N-Gram。例如,文本“我 爱 自然语言”会变成 ["我 爱 自然语言"]。

3. 计算N-Gram频率

对于生成的N-Grams,计算它们在整个训练语料中出现的频率。这通常使用一个词频统计工具或者简单的计数器来完成。例如,假设你的文本数据中出现了以下的Bigram:

  • “我 爱” 出现了5次
  • “爱 自然语言” 出现了3次
  • “我 学习” 出现了2次

4. 计算概率

N-Gram模型的核心就是通过计算每个N-Gram的出现概率。对于一个N-Gram模型,我们需要计算一个特定N-Gram的条件概率,表示给定前N-1个词的情况下,某个特定词出现的概率。如,二元组“我爱”在语料库中出现了3次,而二元组的前缀“我”在语料库中出现了10次,则给定“我”,下一个词为“爱”的概率为30%(如下图所示)。

给定“我”,下一个词为“爱”的概率为30%

5、预算文本

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

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

哪一个词更可能出现在“爱”后面

总结

N-Gram模型是一个简单而有效的语言建模方法,但对于复杂的语言依赖关系,它有一定的局限性。

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

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

相关文章

Python3 + Qt5:实现AJAX异步更新UI

使用 Python 和 Qt5 开发时异步加载数据的方法 在开发使用 Python 和 Qt5 的应用程序时,为了避免在加载数据时界面卡顿,可以采用异步加载的方式。以下是几种实现异步加载的方法: 1. 使用多线程(QThread) 通过将数据…

Tree Compass( Codeforces Round 934 (Div. 2) )

Tree Compass( Codeforces Round 934 (Div. 2) ) You are given a tree with n n n vertices numbered 1 , 2 , … , n 1, 2, \ldots, n 1,2,…,n. Initially, all vertices are colored white. You can perform the following two-step operation: …

程序代码篇---项目目录结构HSV掩膜Opencv图像处理

文章目录 前言第一部分:项目目录结构第二部分:HSV提取HSV色调(Hue)含义取值范围 饱和度(Saturation)含义取值范围 亮度(Value)含义取值范围 第三部分:Opencv图像处理1. 读…

M. Triangle Construction

题目链接:Problem - 1906M - Codeforces 题目大意:给一个 n 边形, 每一个边上有a[ i ] 个点, 在此多边形上求可以连的三角形有多少个, 每个点只能用一次。 输入: 第一行是一个整数 N ( 3 ≤ N ≤ 200000…

【汽车电子软件架构】AutoSAR从放弃到入门专栏导读

本文是汽车电子软件架构:AutoSAR从放弃到入门专栏的导读篇。文章延续专栏文章的一贯作风,从概念与定义入手,希望读者能对AutoSAR架构有一个整体的认识,然后对专栏涉及的文章进行分类与链接。本文首先从AutoSAR汽车软件架构的概念&…

python-UnitTest框架笔记

UnitTest框架的基本使用方法 UnitTest框架介绍 框架:framework,为了解决一类事情的功能集合 UnitTest框架:是python自带的单元测试框架 自带的,可以直接使用,不需要格外安装 测试人员用来做自动化测试,作…

EtherCAT主站IGH-- 49 -- 搭建xenomai系统及自己的IGH主站

EtherCAT主站IGH-- 49 -- 搭建xenomai系统及自己的IGH主站 0 Ubuntu18.04系统IGH博客、视频欣赏链接一 移植xenomai系统1,下载安装工具包2,下载linux内核及xenomai2.1,下载linux内核2.2,下载xenomai2.3,下载补丁ipipe2.4,解压缩包3,打补丁4,配置内核5,编译内核6,安装编译好的内…

【数据结构】_链表经典算法OJ:复杂链表的复制

目录 1. 题目链接及描述 2. 解题思路 3. 程序 1. 题目链接及描述 题目链接:138. 随机链表的复制 - 力扣(LeetCode) 题目描述: 给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,…

Docker Hello World

Docker Hello World 引言 Docker 是一个开源的应用容器引擎,可以让开发者打包他们的应用以及应用的依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。本文将带领您从零开始,学习如何使用 Docker 运行一个简单的 "Hello World"…

Linux——进程间通信之SystemV共享内存

前言 SystemV通信一般包括三种:共享内存、消息队列和信号量。共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到 内核,换句话说是进程不再通过执行进入内核的系统调用来…

Linux网络 | 网络层IP报文解析、认识网段划分与IP地址

前言:本节内容为网络层。 主要讲解IP协议报文字段以及分离有效载荷。 另外, 本节也会带领友友认识一下IP地址的划分。 那么现在废话不多说, 开始我们的学习吧!! ps:本节正式进入网络层喽, 友友们…

SQLGlot:用SQLGlot解析SQL

几十年来,结构化查询语言(SQL)一直是与数据库交互的实际语言。在一段时间内,不同的数据库在支持通用SQL语法的同时演变出了不同的SQL风格,也就是方言。这可能是SQL被广泛采用和流行的原因之一。 SQL解析是解构SQL查询…

【Docker项目实战】使用Docker部署MinIO对象存储(详细教程)

【Docker项目实战】使用Docker部署MinIO对象存储 前言一、 MinIO介绍1.1 MinIO简介1.2 主要特点1.3 主要使用场景二、本次实践规划2.1 本地环境规划2.2 本次实践介绍三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本四、下载MinIO镜像五、…

webrtc编译需要常用环境变量以及相关名词解释

set vs2022_installD:\\vs2022 set GYP_MSVS_OVERRIDE_PATHD:\\vs2022 set GYP_GENERATORSmsvs-ninja,ninja set WINDOWSSDKDIRD:\\Windows Kits\10 set DEPOT_TOOLS_WIN_TOOLCHAIN0 set GYP_MSVS_VERSION2022 这些环境变量是为了编译 WebRTC 时让 GYP/Depot Tools 正确找到 V…

Windows程序设计10:文件指针及目录的创建与删除

文章目录 前言一、文件指针是什么?二、设置文件指针的位置:随机读写,SetFilePointer函数1.函数说明2.函数实例 三、 目录的创建CreateDirectory四、目录的删除RemoveDirectory总结 前言 Windows程序设计10:文件指针及目录的创建与…

线程互斥同步

前言: 简单回顾一下上文所学,上文我们最重要核心的工作就是介绍了我们线程自己的LWP和tid究竟是个什么,总结一句话,就是tid是用户视角下所认为的概念,因为在Linux系统中,从来没有线程这一说法,…

DRM系列七:Drm之CREATE_DUMB

本系列文章基于linux 5.15 DRM驱动的显存由GEM(Graphics execution management)管理。 一、创建流程 创建buf时,user层提供需要buf的width,height以及bpp(bite per pixel),然后调用drmIoctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &…

我们信仰AI?从神明到人工智能——信任的进化

信任的进化: 信任是我们最宝贵的资产。而现在,它正像黑色星期五促销的廉价平板电视一样,被一点点拆解。在过去,世界很简单:人们相信晚间新闻、那些满是灰尘书籍的教授,或者手持病历、眉头紧锁的医生。而如…

数据分析系列--[11] RapidMiner,K-Means聚类分析(含数据集)

一、数据集 二、导入数据 三、K-Means聚类 数据说明:提供一组数据,含体重、胆固醇、性别。 分析目标:找到这组数据中需要治疗的群体供后续使用。 一、数据集 点击下载数据集 二、导入数据 三、K-Means聚类 Ending, congratulations, youre done.

1-刷力扣问题记录

25.1.19 1.size()和.length()有什么区别 2.result.push_back({nums[i], nums[left], nums[right]});为什么用大括号? 使用大括号 {} 是 C11 引入的 初始化列表 语法,它允许我们在构造或初始化对象时直接传入一组值。大括号的使用在许多情况下都能让代码…