在 .NET 9 中,微软引入了 Microsoft.ML.Tokenizers 库,为 .NET 开发者提供了强大的文本标记化功能。

一、什么是Microsoft.ML.Tokenizers

   Microsoft.ML.Tokenizers 是一个用于文本标记化的库,是 .NET 生态系统中的一个强大库旨在将文本转换为令牌(tokens)

以便在自然语言处理(NLP)任务中使用。该库支持多种标记化算法,包括字节对编码(BPE)、SentencePiece 和 WordPiece,满足不同模型和应用的需求。

二、主要应用场景

  1. 自然语言处理(NLP):在训练和推理阶段,将文本转换为模型可处理的令牌格式。

  2. 预处理步骤:在文本分析、情感分析、机器翻译等任务中,对输入文本进行标记化处理。

  3. 自定义词汇表:开发者可以导入自定义词汇表,使用 BPE Tokenizer 处理特定领域的文本数据。

三、支持的模型和服务

Microsoft.ML.Tokenizers 针对多种流行的模型系列进行了优化,包括:

    • GPT 系列:如 GPT-4、GPT-o1 等。

    • Llama 系列

    • Phi 系列

    • Bert 系列

此外,该库还与其他 AI 服务集成,如 Azure、OpenAI 等,为开发者提供统一的 C# 抽象层,简化与 AI 服务的交互。

四、主要类Class

1. Tokenizer

Tokenizer 类充当文本处理的管道,接受原始文本输入并输出 TokenizerResult 对象。它允许设置不同的模型、预处理器和规范化器,以满足特定需求。

主要方法:

    • Encode(string text): 将输入文本编码为包含令牌列表、令牌 ID 和令牌偏移映射的对象。

    • Decode(IEnumerable<int> ids, bool skipSpecialTokens = true): 将给定的令牌 ID 解码回字符串。

    • TrainFromFiles(Trainer trainer, ReportProgress reportProgress, params string[] files): 使用输入文件训练标记器模型。

主要属性:

    • Model: 获取或设置标记器使用的模型。

    • PreTokenizer: 获取或设置标记器使用的预处理器。

    • Normalizer: 获取或设置标记器使用的规范化器。

    • Decoder: 获取或设置标记器使用的解码器。

2. Model

Model 类是标记化过程中使用的模型的抽象基类,如 BPE、WordPiece 或 Unigram。具体模型(如 Bpe)继承自该类,并实现其方法。

主要方法:

    • GetTrainer(): 获取用于训练模型的训练器对象。

    • GetVocab(): 获取将令牌映射到 ID 的词汇表。

    • GetVocabSize(): 获取词汇表的大小。

    • TokenToId(string token): 将令牌映射到标记化 ID。

    • IdToToken(int id, bool skipSpecialTokens = true): 将标记化 ID 映射到令牌。

    • Tokenize(string sequence): 将字符串序列标记化为令牌列表。

    • Save(string vocabPath, string mergesPath): 将模型数据保存到词汇和合并文件中。

3. Bpe

Bpe 类表示字节对编码(Byte Pair Encoding)模型,是 Model 类的具体实现之一。它用于将文本拆分为子词单元,以提高对未登录词的处理能力。

主要属性:

    • UnknownToken: 获取或设置未知令牌。在遇到未知字符时使用。

    • FuseUnknownTokens: 获取或设置是否允许多个未知令牌融合。

    • ContinuingSubwordPrefix: 用于仅存在于另一个子词后面的任何子词的可选前缀。

    • EndOfWordSuffix: 用于描述词尾子词特征的可选后缀。

主要方法:

    • Save(string vocabPath, string mergesPath): 将模型数据保存到词汇和合并文件中。

    • Tokenize(string sequence): 将字符串序列标记化为令牌列表。

    • GetTrainer(): 获取用于训练模型的训练器对象,并生成词汇和合并数据。

4. EnglishRoberta

EnglishRoberta 类是专门为英语 Roberta 模型设计的标记器模型。它继承自 Model 类,并实现了特定于 Roberta 的标记化逻辑。

主要属性:

    • PadIndex: 获取符号列表中填充符号的索引。

    • SymbolsCount: 获取符号列表的长度。

主要方法:

    • AddMaskSymbol(string maskSymbol): 将掩码符号添加到符号列表。

    • IdsToOccurrenceRanks(IReadOnlyList<int> ids): 将令牌 ID 列表转换为最高出现次数排名。

    • OccurrenceRanksIds(IReadOnlyList<int> ranks): 将最高出现次数排名的列表转换为令牌 ID 列表。

    • Save(string vocabPath, string mergesPath): 将模型数据保存到词汇、合并和匹配项映射文件中。

5. RobertaPreTokenizer

RobertaPreTokenizer 类是为英语 Roberta 标记器设计的预处理器。它负责在标记化之前对文本进行初步拆分和处理。

主要方法:

    • PreTokenize(string text): 对输入文本进行预标记化处理。

6. Split

Split 类表示将原始字符串拆分后的子字符串。每个子字符串由一个标记表示,最终可能代表原始输入字符串的各个部分。

主要属性:

    • TokenString: 获取基础拆分令牌。

 五、示例代码

使用 Microsoft.ML.Tokenizers 库对文本进行标记化,以适配 GPT-4 模型,可以按照以下步骤进行:

  1. 安装必要的 NuGet 包:确保项目引用了 Microsoft.ML.Tokenizers 包。

  2. 加载 GPT-4 的词汇表和合并对文件:从官方或可信来源获取 GPT-4 模型的词汇表(vocab.json)和合并对(merges.txt)文件。

  3. 初始化 BPE 模型并加载词汇表:使用 Microsoft.ML.Tokenizers 库中的 Bpe 类加载词汇表和合并对文件。

  4. 创建标记器并进行文本标记化和解码:使用 Tokenizer 类对输入文本进行标记化,并根据需要解码回原始文本。

以下是示例代码:

using System;
using Microsoft.ML.Tokenizers; class Program
{
static void Main(string[] args)
{
// 初始化 BPE 模型
var bpe = new Bpe(); // 加载 GPT-4 的词汇表和合并对文件
bpe.Load("path_to_vocab.json", "path_to_merges.txt"); // 创建标记器
var tokenizer = new Tokenizer(bpe); // 输入文本
var inputText = "这是一个用于测试的文本。"; // 对文本进行标记化
var encoded = tokenizer.Encode(inputText); // 输出标记化结果
Console.WriteLine("Tokens:");
foreach (var token in encoded.Tokens)
{
Console.WriteLine(token);
} // 解码回原始文本
var decodedText = tokenizer.Decode(encoded.Ids);
Console.WriteLine($"Decoded Text: {decodedText}");
}
}
  • 路径设置:将 "path_to_vocab.json""path_to_merges.txt" 替换为实际的文件路径。

  • 词汇表和合并对文件的获取:确保从官方或可信来源获取与 GPT-4 模型兼容的词汇表和合并对文件。

  • 模型兼容性:虽然此代码使用了通用的 BPE 标记器,但在实际应用中,可能需要根据 GPT-4 模型的具体要求进行调整。

周国庆

2025/1/6

.NET 9 new features-Microsoft.ML.Tokenizers 库的更多相关文章

  1. Spark ML机器学习库评估指标示例

    本文主要对 Spark ML库下模型评估指标的讲解,以下代码均以Jupyter Notebook进行讲解,Spark版本为2.4.5.模型评估指标位于包org.apache.spark.ml.eval ...

  2. Spark的MLlib和ML库的区别

    机器学习库(MLlib)指南 MLlib是Spark的机器学习(ML)库.其目标是使实际的机器学习可扩展和容易.在高层次上,它提供了如下工具: ML算法:通用学习算法,如分类,回归,聚类和协同过滤 特 ...

  3. 使用ML.NET和Azure Function进行机器学习 - 第1部分

    介绍 一提到机器学习,总是让人望而生畏.幸运的是,Azure正在想方设法让开发人员更容易进入机器学习.ML.NET是Microsoft Research专为.NET开发人员开发的机器学习框架,因此您可 ...

  4. ML.NET---.NET下的机器学习引擎(简介)

    ML.NET 是一个跨平台的开源机器学习框架,它可以使 .NET 开发人员更容易的开展机器学习工作. ML.NET 允许 .NET 开发人员开发自己的模型,即使没有机器学习的开发经验,也可以很容易的将 ...

  5. 深度学习库 SynapseML for .NET 发布0.1 版本

    2021年11月 微软开源一款简单的.多语言的.大规模并行的机器学习库 SynapseML(以前称为 MMLSpark),以帮助开发人员简化机器学习管道的创建.具体参见[1]微软深度学习库 Synap ...

  6. 《Spark 官方文档》机器学习库(MLlib)指南

    spark-2.0.2 机器学习库(MLlib)指南 MLlib是Spark的机器学习(ML)库.旨在简化机器学习的工程实践工作,并方便扩展到更大规模.MLlib由一些通用的学习算法和工具组成,包括分 ...

  7. ML.NET 发布0.11版本:.NET中的机器学习,为TensorFlow和ONNX添加了新功能

    微软发布了其最新版本的机器学习框架:ML.NET 0.11带来了新功能和突破性变化. 新版本的机器学习开源框架为TensorFlow和ONNX添加了新功能,但也包括一些重大变化, 这也是发布RC版本之 ...

  8. 使用ML.NET + ASP.NET Core + Docker + Azure Container Instances部署.NET机器学习模型

    本文将使用ML.NET创建机器学习分类模型,通过ASP.NET Core Web API公开它,将其打包到Docker容器中,并通过Azure Container Instances将其部署到云中. ...

  9. 使用ML.NET实现基于RFM模型的客户价值分析

    RFM模型 在众多的客户价值分析模型中,RFM模型是被广泛应用的,尤其在零售和企业服务领域堪称经典的分类手段.它的核心定义从基本的交易数据中来,借助恰当的聚类算法,反映出对客户较为直观的分类指示,对于 ...

  10. 使用ML.NET实现NBA得分预测

    使用ML.NET实现NBA得分预测 导读:ML.NET系列文章 ML.NET已经发布了v0.2版本,新增了聚类训练器,执行性能进一步增强.本文将介绍一种特殊的回归--泊松回归,并以NBA比赛得分预测的 ...

随机推荐

  1. UE4纯C++实现游戏快捷栏

    要想创建一个游戏中的快捷栏我们往往通过以下几步来实现(目录导航): 1.创建UI:我们首先需要有在游戏视口中添加一个快捷栏UI界面,以供玩家看到自身的快捷栏. 2.物品读取:其次有了界面之后我们需要往 ...

  2. chrome标签同步神器插件-集装箱!

    前言 最近无法忍受360极速浏览器铺天盖地的广告.也无法忍受火狐浏览器的耗内存打开慢的情况.最终又把浏览器换回了Chrome.总所周知Chrome在国内使用的最大问题是同步书签.扩展等功能受到网络环境 ...

  3. java api 接口 postman @RequestBody

    首先解释一下注解 @RequestBody @RequestBody标记的参数接受的是一个json格式的字符串,一定是一个字符串. 举个例子 这里参数 entryingEntity 如果调用api 如 ...

  4. Http状态码502常见原因及排错思路

    Http状态码502常见原因及排错思路 502表示Bad Gateway.当Nginx返回502错误时,通常表示Nginx作为代理服务器无法从上游服务器(如:我们的后端服务器地址)获取有效的响应.导致 ...

  5. 深入JVM——栈和局部变量

    java栈概述 记得当初我学习java时,常常听见身边的朋友说:"你要记住,当new一个对象时,对象的引用存放在栈里,而对象是存放在堆里的".当时,听到这句教导时,脑海里立即出现栈 ...

  6. Node.js 模拟Apache服务器

    1.知识必备 (1)当服务器响应不同文件类型时,需要设置响应报文头,让浏览器选择相应的编码解析数据. 常用对照表HTTP Mime-type: https://tool.oschina.net/com ...

  7. 全网最适合入门的面向对象编程教程:60 Python面向对象综合实例-传感器数据实时绘图器

    全网最适合入门的面向对象编程教程:60 Python 面向对象综合实例-传感器数据实时绘图器 摘要: 本文将结合之前内容实现模拟一个传感器系统软件,包括三个线程:传感器线程生成数据并通过串口发送给主机 ...

  8. zz 云原生时代,Java的危与机

    https://icyfenix.cn/tricks/2020/java-crisis/qcon.html 另一方面,在微服务的背景下,提倡服务围绕业务能力而非技术来构建应用,不再追求实现上的一致,一 ...

  9. EverEdit插件-CHM助手:一种免费、高效的CHM手册制作方式

    1 EverEdit插件-CHM助手:一种免费.高效的CHM手册制作方式 1.1 前言   业界制作CHM手册的工具多如牛毛,高贵的商业工具如:HelpNDoc.Help+Manual.HelpSmi ...

  10. Ubuntu 22.04 LTS 代号已经公布:那就是 Jammy Jellyfish

    Ubuntu 22.04 LTS 代号已在 Ubuntu 开发之家 Launchpad 上公布. 在字母系列中的字母"I"之后,是"J". 因此,Canonic ...