当前位置: 首页 > news >正文

Token 和 N-Gram、Bag-of-Words 模型释义

ChatGPT(GPT-3.5)和其他大型语言模型(Pi、Claude、Bard 等)凭何火爆全球?这些语言模型的运作原理是什么?为什么它们在所训练的任务上表现如此出色?

虽然没有人可以给出完整的答案,但了解自然语言处理的一些基本概念有助于我们了解 LLM 内在工作原理。尤其是了解 Token 和 N-gram 对于理解几乎所有当前自回归和自编码模型都十分重要。本文为“「X」Embedding in NLP”的进阶版,将带大家详解 NLP 的核心基础!

01.Token 和 N-gram

在 C/C++ 的入门计算机科学课程中,通常很早就会教授字符串的概念。例如,C 语言中的字符串可以表示为以空字符终止的字符数组:

char my_str[128] = "Milvus";

在这个例子中,每个字符都可以被视为一个离散单位,将它们组合在一起就形成了有意义的文本——在这种情况下,my_str表示了世界上最广泛采用的向量数据库。

简单来说,这就是 N-gram 的定义:一系列字符(或下一段讨论的其他离散单位),当它们连在一起时,具有连贯的意义。在这个实例中,N 对应于字符串中的字符总数(在这个例子是 7)。

N-gram 的概念不必局限于单个字符——它们也可以扩展到单词。例如,下面的字符串是一个三元组(3-gram)的单词:

char my_str[128] = "Milvus vector database"

在上面的例子中,很明显my_str是由三个单词组成的,但一旦考虑到标点符号,情况就变得有些复杂:

char my_str[128] = "Milvus's architecture is unparalleled"

上面的字符串,严格来说,是四个单词,但第一个单词Milvus's是使用另一个单词Milvus作为基础的所有格名词。对于语言模型来说,将类似单词分割成离散的单位是有意义的,这样就可以保留额外的上下文:Milvus's。这些被称为 Token,将句子分割成单词的基本方法称为标记化(Tokenization)。采用这种策略,上述字符串现在是一个由 5 个 Token 组成的 5-gram。

所有现代语言模型在数据转换之前都会进行某种形式的输入标记化。市面上有许多不同的标记器——例如,WordPiece 是一个流行的标记器,它被用在大多数 BERT 的变体中。在这个系列中我们没有过多深入标记器的细节——对于想要了解更多的人来说,可以查看 Huggingface的标记器总结

02.N-gram 模型

接下来,我们可以将注意力转向 N-gram 模型。简单来说,n-gram 模型是一种简单的概率语言模型,它输出一个特定 Token 在现有 Token 串之后出现的概率。例如,我们可以建模一个特定 Token 在句子或短语中跟随另一个Token(∣)的概率(p):

p(database∣vector)=0.1

上述声明表明,在这个特定的语言模型中,“vector”这个词跟在“database”这个词后面的概率为 10%。对于 N-gram 模型,这些模型总是通过查看输入文档语料库中的双词组的数量来计算,但在其他语言模型中,它们可以手动设置或从机器学习模型的输出中获取。

上面的例子是一个双词模型,但我们可以将其扩展到任意长度的序列。以下是一个三元组的例子:

p(database∣Milvus,vector)=0.9

这表明“database”这个词将以 90% 的概率跟在“Milvus vector”这两个 Token 之后。同样,我们可以写成:

p(chocolate∣Milvus,vector)=0.001

这表明在“Milvus vector”之后出现的词不太可能是“chocolate”(确切地说,概率为0.1%)。将这个应用到更长的序列上:

p(Milvus∣the,most,widely,adopted,vector,database,is)=0.999

接下来讨论一个可能更重要的问题:我们如何计算这些概率?简单而直接的答案是:我们计算文档或文档语料库中出现的次数。我将通过以下 3 个短语的例子来逐步解释(每个句子开头的代表特殊的句子开始标记)。为了清晰起见,我还在每个句子的结尾句号和前一个词之间增加了额外的空格:

  • <S>Milvus是最广泛采用的向量数据库

  • <S>使用Milvus进行向量搜索

  • <S>Milvus很棒

列出以<S>Milvusvector开头的双词组:

some_bigrams = {these bigrams begin with <S>
    ("<S>""Milvus"): 2,
    ("<S>""vector"): 1,these bigrams begin with Milvus
    ("Milvus""is"): 1,
    ("Milvus""."): 1,
    ("Milvus""rocks"): 1,these bigrams begin with vector
    ("vector""database"): 1,
    ("vector""search"): 1
}

根据这些出现的情况,可以通过对每个 Token 出现的总次数进行规范化来计算概率。例如:

alt

类似:

alt

有了这些知识,我们就可以编写一些代码来构建一个双词模型。为了简单起见,我们假设所有输入文档中的每个 Token 都由一些空白字符分隔(回想一下前面的部分,现代标记器通常有更复杂的规则)。让我们从定义模型本身开始,即双词计数和 Token 计数:

from typing import Dict, Tuple
from collections import defaultdict
#keys correspond to tokensvalues are the number of occurences
token_counts = defaultdict(int)

#keys correspond to 2-tuples bigram pairsvalues are the number of occurences
bigram_counts = defaultdict(int)

def build_bigram_model(corpus):
    """Bigram model.  """
    #loop through all documents in the corpus
    for doc in corpus:
        prev = "<S>"
        for word in doc.split():
            #update token counts
            token_counts[word] += 1
            #update bigram counts
            bigram = (prev, word)
            bigram_counts[bigram] += 1
            prev = word
        #add a dummy end-of-sequence token so probabilities add to one
        bigram_counts[(word, "</S>")] += 1
    return (token_counts, bigram_counts)

def bigram_probability(bigram: Tuple[str]):
    """Computes the likelihood of the bigram from the corpus.  """
    return bigram_counts[bigram] / token_counts[bigram[0]]

然后,build_bigram_model会遍历整个文档语料库,先按空白字符分割每个文档,再存储双词组和 Token 计数。然后,我们可以调用bigram_probability函数,该函数查找相应的双词组计数和 Token 计数,并返回比率。

我们在 Milvus 的文档上测试这个模型,大家可以在此下载文档,并尝试上面的代码。

with open("README.md""r"as f:
    build_bigram_model([f.read()])

print(bigram_probability(("vector""database")))
0.3333333333333333

03.词袋模型

除了 N-gram,另一个值得讨论的是词袋模型(BoW)。词袋模型将文档或文档语料库表示为一个无序的 Token 集合——从这个意义上说,它保持了每个 Token 出现的频率,但忽略了它们在每个文档中出现的顺序。因此,BoW 模型中的整个文档可以转换为稀疏向量,其中向量的每个条目对应于文档中特定单词出现的频率。在这里,我们将文档“Milvus 是最广泛采用的向量数据库。使用Milvus进行向量搜索很容易。”表示为一个 BoW稀疏向量:

limited vocabularybow_vector = [   
 0# a    
 1# adopted    
 0# bag    
 0# book    
 0# coordinate    
 1# database    
 1# easy    
 0# fantastic    
 0# good    
 0# great    
 2# is    
 0# juggle    
 2# Milvus    
 1# most    
 0# never    
 0# proof    
 0# quotient    
 0# ratio    
 0# rectify    
 1# search    
 1# the    
 0# undulate    
 2# vector    
 1# widely    
 1# with    
 0# yes    
 0# zebra
 ]

这些稀疏向量随后可以用于各种 NLP 任务,如文本和情感分类。关于词袋模型的训练和推理学习可参考 Jason Brownlee的博客。

虽然词袋模型易于理解和使用,但它们有明显的局限性,即无法捕捉上下文或单个 Token 的语义含义,这意味着它们不适合用于最简单的任务之外的任何事情。

04.总结

在这篇文章中,我们讨论了自然语言处理的三个核心基础:标记化(Tokenization)、N-gram 和词袋模型。围绕 N-gram 的概念有助于后续了解关于自回归和自编码模型的训练方式。在下一个教程中,我们将分析“现代”NLP,即循环网络和文本 embedding。敬请期待!

本文由 mdnice 多平台发布

相关文章:

Token 和 N-Gram、Bag-of-Words 模型释义

ChatGPT&#xff08;GPT-3.5&#xff09;和其他大型语言模型&#xff08;Pi、Claude、Bard 等&#xff09;凭何火爆全球&#xff1f;这些语言模型的运作原理是什么&#xff1f;为什么它们在所训练的任务上表现如此出色&#xff1f; 虽然没有人可以给出完整的答案&#xff0c;但…...

【go语言实践】基础篇 - 流程控制

if语句 go里面if不需要括号将条件表达式包含起来&#xff0c;这与python也有点类似 if 条件表达式 { } if num > 18 {// ... } else if num > 20 {// ... } else {// ... }需要注意的是go支持在if的条件表达式中直接定义一个变量&#xff0c;变量的作用域只在if范围内…...

Linux:gdb的简单使用

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》 文章目录 前言一、前置理解二、使用总结 前言 gdb是Linux中的调试代码的工具 一、前置理解 我们都知道要调试一份代码&#xff0c;这份代码的发布模式必须是debug。那你知道在li…...

NestJS的微服务实现

1.1 基本概念 微服务基本概念&#xff1a;微服务就是将一个项目拆分成多个服务。举个简单的例子&#xff1a;将网站的登录功能可以拆分出来做成一个服务。 微服务分为提供者和消费者&#xff0c;如上“登录服务”就是一个服务提供者&#xff0c;“网站服务器”就是一个服务消…...

Debian 终端Shell命令行长路径改为短路径

需要修改bashrc ~/.bashrc先备份一份 cp .bashrc bashrc.backup编辑bashrc vim ~/.bashrc可以看到bashrc内容为 # ~/.bashrc: executed by bash(1) for non-login shells. # see /usr/share/doc/bash/examples/startup-files (in the package bash-doc) # for examples# If…...

Ansible变量是什么?如何实现任务的循环?

Ansible 利用变量存储整个 Ansible 项目文件中可重复使用的值&#xff0c;从而可以简化项目的创建和维护&#xff0c;并减少错误的发生率。在定义Ansible变量时&#xff0c;通常有如下三种范围的变量&#xff1a; global范围&#xff1a;从命令行或Ansible配置中设置的变量&am…...

随机梯度下降的代码实现

在单变量线性回归的机器学习代码中&#xff0c;我们讨论了批量梯度下降代码的实现&#xff0c;本篇将进行随机梯度下降的代码实现&#xff0c;整体和批量梯度下降代码类似&#xff0c;仅梯度下降部分不同&#xff1a; import numpy as np import pandas as pd import matplotl…...

渐进推导中常用的一些结论

标题很帅 STAR-RIS Enhanced Joint Physical Layer Security and Covert Communications for Multi-antenna mmWave Systems文章末尾的一个推导。 lim ⁡ M → ∞ ∥ Φ ( w k ⊗ Θ r ) Ω r w H g ∗ ∥ 2 2 M lim ⁡ M → ∞ Tr ⁡ ( g T Ω r w ( w k ⊗ Θ r ) H Φ H Φ…...

网络安全等级保护V2.0测评指标

网络安全等级保护&#xff08;等保V2.0&#xff09;测评指标&#xff1a; 1、物理和环境安全 2、网络和通信安全 3、设备和计算安全 4、应用和数据安全 5、安全策略和管理制度 6、安全管理机构和人员 7、安全建设管理 8、安全运维管理 软件全文档获取&#xff1a;点我获取 1、物…...

java中list的addAll用法详细实例?

List 的 addAll() 方法用于将一个集合中的所有元素添加到另一个 List 中。下面是一个详细的实例&#xff0c;展示了 addAll() 方法的使用&#xff1a; java Copy code import java.util.ArrayList; import java.util.List; public class AddAllExample { public static v…...

关于学习计算机的心得与体会

也是隔了一周没有发文了&#xff0c;最近一直在准备期末考试&#xff0c;后来想了很久&#xff0c;学了这么久的计算机&#xff0c;这当中有些收获和失去想和各位正在和我一样在学习计算机的路上的老铁分享一下&#xff0c;希望可以作为你们碰到困难时的良药。先叠个甲&#xf…...

LLM之RAG理论(一)| CoN:腾讯提出笔记链(CHAIN-OF-NOTE)来提高检索增强模型(RAG)的透明度

论文地址&#xff1a;https://arxiv.org/pdf/2311.09210.pdf 检索增强语言模型&#xff08;RALM&#xff09;已成为自然语言处理中一种强大的新范式。通过将大型预训练语言模型与外部知识检索相结合&#xff0c;RALM可以减少事实错误和幻觉&#xff0c;同时注入最新知识。然而&…...

Android studio:打开应用程序闪退的问题2.0

目录 找到问题分析问题解决办法 找到问题 老生常谈&#xff0c;可能这东西真的很常见吧&#xff0c;在之前那篇文章中 linkhttp://t.csdnimg.cn/UJQNb 已经谈到了关于打开Androidstuidio开发的软件后明明没有报错却无法运行&#xff08;具体表现为应用程序闪退的问题&#xff…...

Spring IoC如何存取Bean对象

小王学习录 IoC(Inversion of Control)1. 什么是IoC2. 什么是Spring IoC3. 什么是DI4. Spring IoC的作用 存储Bean对象1. 创建Bean2. 将Bean注册到Spring中. 取Bean对象.1. 获取Spring上下文信息使用ApplicationContext和BeanFactory的区别 2. 获取指定Bean对象 IoC(Inversion …...

【开源】基于Vue.js的实验室耗材管理系统

文末获取源码&#xff0c;项目编号&#xff1a; S 081 。 \color{red}{文末获取源码&#xff0c;项目编号&#xff1a;S081。} 文末获取源码&#xff0c;项目编号&#xff1a;S081。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 耗材档案模块2.2 耗材入库模块2.3 耗…...

Datawhale聪明办法学Python(task2Getting Started)

一、课程基本结构 课程开源地址&#xff1a;课程简介 - 聪明办法学 Python 第二版 章节结构&#xff1a; Chapter 0 安装 InstallationChapter 1 启航 Getting StartedChapter 2 数据类型和操作 Data Types and OperatorsChapter 3 变量与函数 Variables and FunctionsChapte…...

量化交易怎么操作?量化软件怎么选择比较好?(散户福利,建议收藏)

一&#xff1a;量化的具体操作步骤是什么呢&#xff1f;1. 数据获取&#xff1a;索取和收集金融市场数据。 2. 策略制定&#xff1a;制定数量交易策略&#xff0c;这包括制定投资目标、建立交易规则和风险控制机制等&#xff0c;这个过程需要不断优化和更新。 3. 编写算法&am…...

什么是 AWS IAM?如何使用 IAM 数据库身份验证连接到 Amazon RDS(上)

驾驭云服务的安全环境可能很复杂&#xff0c;但 AWS IAM 为安全访问管理提供了强大的框架。在本文中&#xff0c;我们将探讨什么是 AWS Identity and Access Management (IAM) 以及它如何增强安全性。我们还将提供有关使用 IAM 连接到 Amazon Relational Database Service (RDS…...

Python从入门到精通七:Python函数进阶

函数多返回值 学习目标&#xff1a; 知道函数如何返回多个返回值 问: 如果一个函数如些两个return (如下所示)&#xff0c;程序如何执行&#xff1f; 答&#xff1a;只执行了第一个return&#xff0c;原因是因为return可以退出当前函数&#xff0c;导致return下方的代码不执…...

uniapp踩坑之项目:使用过滤器将时间格式化为特定格式

利用filters过滤器对数据直接进行格式化&#xff0c;注意&#xff1a;与method、onLoad、data同层级 <template><div><!-- orderInfo.time的数据为&#xff1a;2023-12-12 12:10:23 --><p>{{ orderInfo.time | formatDate }}</p> <!-- 2023-1…...

从魔兽团本到元宇宙:一个老玩家关于游戏终极形态的思考

前言这是一场跨越数日的对话。始于一位老玩家对当下游戏的困惑&#xff0c;终于一次关于宇宙递归的哲学探讨。如果你也曾怀念那个和兄弟一起通宵开荒的夜晚&#xff0c;如果你也对满屏的抽卡、648、限定池感到疲惫&#xff0c;如果你隐约觉得游戏不应该只是这样——那么这篇文章…...

企业SEO优化与个人SEO优化有什么不同_外部链接建设在SEO优化中扮演什么角色

企业SEO优化与个人SEO优化的不同 在当今数字化时代&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;已成为企业和个人提升在线曝光度和吸引流量的关键策略。企业SEO优化与个人SEO优化在策略、目标和实施上存在显著差异。了解这些不同是制定有效优化计划的重要一步。 企业…...

【数据结构】顺序表的应用->通讯录(详细代码及配图)

小编主页详情<-请点击 小编gitee代码仓库<-请点击 本文主要介绍了数据结构的顺序表的应用->通讯录&#xff0c;内容全由作者原创&#xff08;无AI&#xff09;&#xff0c;同时深度解析了通讯录顺序表增删查改等功能&#xff0c;并带有配图帮助博友们更好的理解&#…...

城通网盘解析终极指南:如何免费获取高速直连下载地址

城通网盘解析终极指南&#xff1a;如何免费获取高速直连下载地址 【免费下载链接】ctfileGet 获取城通网盘一次性直连地址 项目地址: https://gitcode.com/gh_mirrors/ct/ctfileGet 在数字化信息时代&#xff0c;城通网盘作为国内广泛使用的文件分享平台&#xff0c;却因…...

批量新员工入职培训怎么做?行政/销售/技术等5大核心岗位培训重点拆解

年后复工、校招季、业务扩招&#xff0c;一次入职几十上百人&#xff0c;覆盖销售、客服、运维、行政、技术、生产等多个岗位。这是企业培训中非常普遍、甚至是常态的管理场景&#xff0c;尤其在中大型企业、连锁企业、制造型企业、互联网/科技公司里&#xff0c;同时管理多岗位…...

3个效率倍增步骤:茉莉花插件让中文文献管理效率提升92%

3个效率倍增步骤&#xff1a;茉莉花插件让中文文献管理效率提升92% 【免费下载链接】jasminum A Zotero add-on to retrive CNKI meta data. 一个简单的Zotero 插件&#xff0c;用于识别中文元数据 项目地址: https://gitcode.com/gh_mirrors/ja/jasminum 茉莉花插件是专…...

AudioLDM代码架构详解:从CLAP到HiFi-GAN的完整技术栈

AudioLDM代码架构详解&#xff1a;从CLAP到HiFi-GAN的完整技术栈 【免费下载链接】AudioLDM AudioLDM: Generate speech, sound effects, music and beyond, with text. 项目地址: https://gitcode.com/gh_mirrors/au/AudioLDM AudioLDM是一个基于潜在扩散模型的文本到音…...

windows系统部署funrec项目:安装WSL2

注意&#xff1a;WSL系统与Windows系统环境是完全隔离开的&#xff0c;只有代码文件可以互通 windows的anaconda、python、uv、torch、tensorflow等&#xff0c;WSL都不能用&#xff0c;都需要另外安装 WSL 可以访问 Windows 的项目文件&#xff08;比如 /mnt/d/MyProject/……...

seo优化专业如何做移动端优化_seo优化专业如何做关键词优化

SEO优化专业如何做移动端优化 随着互联网的发展&#xff0c;移动端已经成为了人们获取信息和服务的主要渠道。对于SEO优化专业人员而言&#xff0c;如何进行有效的移动端优化成为了一个重要的课题。本文将从问题分析、原因说明、解决方法和注意事项四个方面&#xff0c;帮助SE…...

PyFluent:CFD仿真的Python自动化革命

PyFluent&#xff1a;CFD仿真的Python自动化革命 【免费下载链接】pyfluent Pythonic interface to Ansys Fluent 项目地址: https://gitcode.com/gh_mirrors/pyf/pyfluent PyFluent是Ansys Fluent的Python原生接口&#xff0c;它将传统CFD仿真从繁琐的GUI操作转变为代码…...