"SubwordTokens" (神经网络编码器)

NetEncoder[{"SubwordTokens",{token1,token2,}}]

表示一个编码器,根据给定词汇将文本分割成子词.

NetEncoder[{"SubwordTokens",File["path"]}]

从文件中加载 SentencePiece BPE 模型.

NetEncoder[{"SubwordTokens",,"param"value}]

表示一个已被指定附加参数的编码器.

更多信息

  • 子词词元化是单词层级和字母层级之间的结构,词元要么是完整的单词,要么是子部分.
  • 编码器的输出是 1 到 d 之间的整数序列,其中 d 是词元列表中元素的数量.
  • NetEncoder[][input] 将编码器应用于字符串生成输出.
  • NetEncoder[][{input1,input2,}] 将编码器应用于字符串列表生成输出列表.
  • 当构建网络时,可通过指定 "port"->NetEncoder[] 将编码器附于网络的输入端口.
  • NetDecoder[NetEncoder[{"SubwordTokens",}]] 生成从给定编码器继承设置的 NetDecoder[{"SubwordTokens",}].
  • NetEncoder[{"SubwordTokens",{token1,token2,},}] 中,每个词元必须是字符串或这些特殊词元中的一个:
  • StartOfString出现在字符串开始的虚拟词元
    EndOfString出现在字符串尾部之后的虚拟词元
    _任何未分配字符
  • 按照惯例,引领一个单词的词元对应于以空格开头的字符串(如 "word"),单词中的词元对应于以任何其他字符开头的字符串(如"tion").
  • 词元列表必须包含字符 _.
  • 当设定 "IncludeTerminalTokens"True 时,必须同时包含 StartOfStringEndOfString.
  • 参数
  • 支持下列参数:
  • IgnoreCaseFalse是否忽略从字符串匹配词元的情况
    "IncludeTerminalTokens"False是否在输出中包括 StartOfStringEndOfString 词元
    "InputType""String"编码器每个输入的格式
    Method"BPE"将文本分割为子词的算法
    "OutputProperties""VocabularyIndex"每个子词词元的输出的属性
    "TargetLength"All要裁剪或填充的最终序列的长度
    "TextPreprocessing"None可以在任何其他编码器操作应用之前转换输入文本的函数
    "UnicodeNormalization"None要使用的 Unicode 标准化方案
    "Vocabulary"None可由编码器生成的词元组
  • Method 的可能设置包括:
  • "BPE"字节对编码
    {"BPE","param"value}有子选项的字节对编码
    "WordPiece"WordPiece
  • Method{"BPE", } 的可能子选项包括:
  • "CombineWhitespace"False
  • 是否结合多个相邻空白字符
  • "WhitespacePadding"None控制空白符插入输入字符串
  • 参数 "WhitespacePadding" 可设置为 LeftRight,以在编码前将空白符分别添加在输入字符串的开头或结尾. 默认值 None 不会插入任何额外空白符.
  • 可用下列对参数 "InputType" 的设置:
  • "ListOfStrings"每个输入文本由一个字符串列表表示
    "String"每个输入文本由一个字符串表示
  • 可用下列对参数 "OutputProperties" 的设置:
  • "VocabularyIndex"词元列表中的词元指数(缺省)
    "InputIndex"包括词元的字符串指数(可能在 "InputType""ListOfStrings"的设置下不是 1)
    "StartPosition"文本中词元的起始位置
    "EndPosition"文本中词元的结束位置
    {prop1,prop2,}有效属性列表
  • 默认设置参数 "TargetLength"->All,所有在输入字符串中找到的词元都会被编码.
  • 设置 "TargetLength"->n,则在输入字符串中找到的前 n 个词元都会被编码,并在如果找到的词元小于 n 个时应用填充. 若 EndOfString 存在于词元列表中,则填充值是与其相关联的整数代码;否则会使用与上个词元关联的代码.
  • "UnicodeNormalization" 的可能设置包括 CharacterNormalize 的 Unicode 标准化格式:
  • "NFD"标准分解(格式 D)
    "NFC"标准分解,跟着是标准分解(格式 C)
    "NFKD"兼容性分解(格式 KD)
    "NFKC"兼容性分解,跟着是标准分解(格式 KC)
    None无标准化
  • 词汇可使用选项 "Vocabulary"{token1,token2,} 指定为一个词元字符串列表. 若词汇已被指定,编码器不会生成词汇中词元的整数代码. 设置 Method"BPE" 时,在词元化生成未登录词词元的情况下,生成该词元的操作会被逆转直到该词元分解成词汇词元或单个字符.
  • 从 SentencePiece 中导入 BPE 模型
  • SentencePiece 库中的 BPE 模型文件可使用 NetEncoder[{"SubwordTokens",File["path"],}] 导入.
  • SentencePiece 库中的词汇文件可使用选项 "Vocabulary"File["path"] 导入. 接受词汇的阈值可使用 "Vocabulary"{File["path"],"Threshold"value} 来指定,其中 value 是一个数字. 如果没有指定阈值则会导入整个词汇.
  • SentencePiece BPE 词汇文件将整数分数与每个词元关联在一起. 每个词元的分数与其在训练数据中的频率关联在一起,最频繁出现的词元的分数为零,其他词元的分数为负整数. 通过将子选项 "Threshold" 设置为数字 n,词汇表只接受分数至少为 n 的词元.
  • 当导入 SentencePiece BPE 模型文件时,任何参数规范都会覆盖文件中的设置(如有).

范例

打开所有单元关闭所有单元

基本范例  (1)

从预训练 SentencePiece 模型文件中创建一个 BPE 编码器:

对字符串进行编码:

获取相应的词元:

范围  (1)

给定词汇表,创建 WordPiece 词元化结果:

对字符串进行编码:

获取相应的词元:

参数  (10)

"CombineWhitespace"  (1)

导入 SentencePiece BPE 模型并覆盖其 "CombineWhitespace" 设置:

编码一串字符. 多个空白字符在编码前不会合并为一个:

该模型的默认设置为 "CombineWhitespace"->True

"IgnoreCase"  (1)

导入 SentencePiece BPE 模型并覆写其 "IgnoreCase" 设置:

对字符的字符串进行编码. 编码器不会区分大写字母和小写字母:

"IncludeTerminalTokens"  (1)

SentencePiece BPE 模型默认情况下不包括终端词元. 导入模型并启用 "IncludeTerminalTokens"

对字符的字符串进行编码. 现在可以生成 StartOfStringEndOfString 词元:

"OutputProperties"  (1)

给定词汇表,创建 WordPiece 词元化结果,获取每个词元的不同属性:

对字符串列表进行编码:

从字典中获取相应的词元:

获取每个词元的 containing string 的索引:

获取每个词元的起始位置和结束位置:

从输入字符串中获取相应的词元:

"TargetLength"  (1)

导入 SentencePiece BPE 模型并指定该序列应被填充或裁剪至 12 个元素的长度:

对字符的字符串进行编码. 少于 12 个元素的输出使用 EndOfString 词元进行填充:

"TextPreprocessing"  (1)

构建一个 BPE 编码器,只使用前 255 个 Unicode 字符:

创建一个包含 10 个随机 Unicode 字符的字符串:

某些字符可能会被映射到未知词元:

用预处理函数将字符串转换为 UTF-8 字符:

现在所有字符都已被编码:

"UnicodeNormalization"  (1)

导入不进行任何 Unicode 标准化的 SentencePiece BPE 模型:

这个模型将 Unicode 十进制代码为 937 的大写 omega 编码为 ID 29:

Unicode 十进制代码为 8486 的欧姆符号未被识别,所以被编码为未知词元,其在模型中的 ID 为 1:

通过对模型指定 Unicode 标准化设置,欧姆字符可在编码前被标准化为一个大写 omega:

"Vocabulary"  (2)

根据 SentencePiece BPE 模型和词汇文件创建 BPE 编码器:

在现有词汇表的约束条件下对字符串进行编码:

单词 "world" 被分割成子词,因为它不在词汇表中:

导入一个含有词汇表的 BPE 模型,并指定词汇阈值:

对字符串进行编码:

由于词汇表的限制,不会产生复合词元:

"WhitespacePadding"  (1)

导入 SentencePiece BPE 模型并覆盖其 "WhitespacePadding" 设置:

编码一串字符. 初始单词 "great" 被分割成子词:

此模型的默认设置是 "WhitespacePadding"Left,该设置插入一个前导空格,为标记 "great" 创建一个匹配项:

应用  (1)

将一个对影评片段分类为 "positive" 或 "negative" 的分类器进行训练. 首先,获取训练和检验数据:

使用 NetModel,使用 Wolfram 神经网络资源库中的 "SubwordTokens" 编码器获取一个 EmbeddingLayer

使用嵌入定义一个将单词字符串作为输入并返回 "positive""negative" 的网络:

对该网络进行五个回合的训练. 使用选项 LearningRateMultipliers 保持 EmbeddingLayer 的权重不变:

在检验组中计算范例中的被训练网络,获取概率:

属性和关系  (1)

使用与给定编码器类似的规范创建 "SubwordTokens" 解码器:

对字符的字符串进行编码和解码:

可能存在的问题  (1)

"SubwordTokens" 解码器并不需要解码器的大多数参数. 因此,在回合往返后有些设置会丢失. 下列编码器在进行 Unicode 标准化:

回合往返后该设置丢失: