text

GitHub
1.3k 373 简单 5 次阅读 2天前Apache-2.0语言模型数据工具
AI 解读 由 AI 自动生成,仅供参考

TensorFlow Text(包名 tensorflow-text)是 TensorFlow 生态中专注于文本处理的扩展库,旨在让文本数据在 TensorFlow 中享有“一等公民”的地位。它为 TensorFlow 2.0 用户提供了一系列开箱即用的文本类与操作,涵盖 Unicode 处理、文本规范化、多种分词策略(如空格分词、脚本分词)以及 N-grams 生成等功能。

许多开发者在使用 TensorFlow 构建自然语言模型时,常面临训练与推理阶段分词逻辑不一致、需额外维护预处理脚本等难题。TensorFlow Text 通过将文本处理操作直接嵌入 TensorFlow 计算图内,有效解决了这些问题,确保了数据预处理流程的统一性与高效性,无需担心环境差异导致的偏差。

它特别适合 NLP 领域的开发者和研究人员使用,尤其是依赖 TensorFlow 进行序列建模的团队。不仅支持标准 Python 调用,还提供 Keras API 接口,便于快速集成到现有模型架构中。配合完善的文档和社区贡献机制,TensorFlow Text 能显著降低文本数据预处理的复杂度,提升模型开发效率。

使用场景

某电商平台技术团队正在开发基于 TensorFlow 的智能客服意图识别系统,需实时处理海量多语言用户咨询文本。

没有 text 时

  • 分词逻辑分散在独立的 Python 预处理脚本中,训练集与线上推理的分词规则偶尔不一致,导致模型准确率大幅下降。
  • 面对多语言混合输入,需要手动编写代码处理 UTF-8 编码转换和特殊符号清洗,维护成本极高且极易引入 Bug。
  • 文本预处理步骤无法融入 TensorFlow 计算图,部署时需额外加载外部预处理模块,显著增加了服务延迟和运维复杂度。
  • 不同运行环境下的 Unicode 规范化行为存在细微差异,难以保证模型在生产环境中输出结果的长期稳定性。

使用 text 后

  • 利用 TensorFlow Text 提供的原生算子,将分词、归一化直接嵌入模型计算图,彻底消除了训练与推理的逻辑差异。
  • 内置强大的 Unicode 处理功能,自动完成大小写折叠和结构验证,开发者无需再编写繁琐的额外清洗代码。
  • 支持通过 tf.data 管道高效串联预处理步骤,大幅提升了大规模文本数据集的加载速度与流水线执行效率。
  • 统一了所有环境下的文本解析标准,确保了模型在不同服务器部署时表现始终如一,极大降低了测试验证成本。

TensorFlow Text 让文本处理成为计算图的第一公民,实现了从数据清洗到模型预测的全链路一致性与高效性。

运行环境要求

操作系统
  • Linux
  • macOS
  • Windows
GPU

未说明

内存

未说明

依赖
notesTF Text 版本必须与 TensorFlow 版本严格对应(如 TF 2.3.x 对应 TF Text 2.3.x);输入文本建议为 UTF-8 编码;部分分词功能依赖 ICU 系统库;模型训练输出涉及 Ragged Tensors 数据结构。
python未说明
tensorflow (版本需严格匹配)
text hero image

快速开始




PyPI version PyPI nightly version PyPI Python version Documentation Contributions
welcome License

TensorFlow Text - TensorFlow 中的文本处理

重要提示:使用 pip install 安装 TF Text(TensorFlow Text)时,请注意您正在运行的 TensorFlow 版本,因为您应该指定相应次要版本的 TF Text(例如,对于 tensorflow==2.3.x,请使用 tensorflow_text==2.3.x)。

目录

简介

TensorFlow Text 提供了一系列与文本相关的类和操作 (ops),可直接用于 TensorFlow 2.0。该库可以执行基于文本的模型通常所需的预处理,并包含核心 TensorFlow 未提供的对序列建模有用的其他功能。

在文本预处理中使用这些操作的好处是,它们是在 TensorFlow 计算图内完成的。您无需担心训练时的分词 (tokenization) 与推理时的分词不同,也无需管理预处理脚本。

文档

请访问 http://tensorflow.org/text 查看所有文档。该网站包括 API 文档、关于如何使用 TensorFlow Text 的指南,以及构建特定模型的教程。

Unicode

大多数操作 (ops) 期望字符串为 UTF-8 格式。如果您使用不同的编码,可以使用核心 TensorFlow 的转码操作 (transcode op) 将其转码为 UTF-8。如果您的输入可能无效,您也可以使用相同的操作将您的字符串强制转换为结构上有效的 UTF-8。

docs = tf.constant([u'Everything not saved will be lost.'.encode('UTF-16-BE'),
                    u'Sad☹'.encode('UTF-16-BE')])
utf8_docs = tf.strings.unicode_transcode(docs, input_encoding='UTF-16-BE',
                                         output_encoding='UTF-8')

规范化

在处理不同来源的文本时,确保相同的单词被识别为相同非常重要。Unicode 中大小写不敏感匹配的常用技术是大小写折叠 (case folding)(类似于小写化 (lower-casing))。(注意,大小写折叠内部应用了 NFKC 规范化。)

我们还提供了 Unicode 规范化操作,用于将字符串转换为字符的标准表示形式,默认情况下为规范化形式 KC(NFKC)。

print(text.case_fold_utf8(['Everything not saved will be lost.']))
print(text.normalize_utf8(['Äffin']))
print(text.normalize_utf8(['Äffin'], 'nfkd'))
tf.Tensor(['everything not saved will be lost.'], shape=(1,), dtype=string)
tf.Tensor(['\xc3\x84ffin'], shape=(1,), dtype=string)
tf.Tensor(['A\xcc\x88ffin'], shape=(1,), dtype=string)

分词

分词 (Tokenization) 是将字符串拆分为标记 (tokens) 的过程。通常,这些标记是单词、数字和/或标点符号。

主要接口是 TokenizerTokenizerWithOffsets,它们分别只有一个方法 tokenizetokenizeWithOffsets。目前有多种实现的分词器可用。每一个都实现了 TokenizerWithOffsets(它扩展了 Tokenizer),其中包括获取原始字符串字节偏移量的选项。这使得调用者能够知道创建该标记的原始字符串中的字节。

所有分词器都返回 RaggedTensors(不规则张量),其中标记的最内维映射到原始的各个字符串。因此,结果形状的秩 (rank) 增加了一。如果您不熟悉它们,请查阅 ragged tensor 指南。https://www.tensorflow.org/guide/ragged_tensor

WhitespaceTokenizer

这是一个基本的分词器,它在 ICU (International Components for Unicode) 定义的空白字符(如空格、制表符、换行)处拆分 UTF-8 字符串。

tokenizer = text.WhitespaceTokenizer()
tokens = tokenizer.tokenize(['everything not saved will be lost.', u'Sad☹'.encode('UTF-8')])
print(tokens.to_list())
[['everything', 'not', 'saved', 'will', 'be', 'lost.'], ['Sad\xe2\x98\xb9']]

UnicodeScriptTokenizer

此分词器根据 Unicode 脚本边界拆分 UTF-8 字符串。使用的脚本代码对应于国际组件库 for Unicode (ICU) 的 UScriptCode 值。参见:http://icu-project.org/apiref/icu4c/uscript_8h.html

在实践中,这与 WhitespaceTokenizer 类似,最明显的区别在于它会区分标点符号(USCRIPT_COMMON)和语言文本(例如 USCRIPT_LATIN, USCRIPT_CYRILLIC 等),同时也会将不同的语言文本彼此分开。

tokenizer = text.UnicodeScriptTokenizer()
tokens = tokenizer.tokenize(['everything not saved will be lost.',
                             u'Sad☹'.encode('UTF-8')])
print(tokens.to_list())
[['everything', 'not', 'saved', 'will', 'be', 'lost', '.'],
 ['Sad', '\xe2\x98\xb9']]

Unicode 分割

在对没有空格的语言进行分词以分割单词时,通常只需按字符分割,这可以使用核心中的 unicode_split 操作符 (op) 来实现。

tokens = tf.strings.unicode_split([u"仅今年前".encode('UTF-8')], 'UTF-8')
print(tokens.to_list())
[['\xe4\xbb\x85', '\xe4\xbb\x8a', '\xe5\xb9\xb4', '\xe5\x89\x8d']]

偏移量

在对字符串进行分词时,通常希望知道每个 token 源自原始字符串的哪个位置。因此,每个实现了 TokenizerWithOffsets(带偏移量的分词器)的分词器都有一个 tokenize_with_offsets 方法,该方法将返回字节偏移量 (byte offsets) 以及 tokens。start_offsets 列出每个 token 在原始字符串中开始的字节(包含),而 end_offsets 列出每个 token 结束的字节(不包含,即 token 之后的第一个字节)。

tokenizer = text.UnicodeScriptTokenizer()
(tokens, start_offsets, end_offsets) = tokenizer.tokenize_with_offsets(
    ['everything not saved will be lost.', u'Sad☹'.encode('UTF-8')])
print(tokens.to_list())
print(start_offsets.to_list())
print(end_offsets.to_list())
[['everything', 'not', 'saved', 'will', 'be', 'lost', '.'],
 ['Sad', '\xe2\x98\xb9']]
[[0, 11, 15, 21, 26, 29, 33], [0, 3]]
[[10, 14, 20, 25, 28, 33, 34], [3, 6]]

TF.Data 示例

分词器与 tf.data API 配合使用效果符合预期。下面提供了一个简单的示例。

docs = tf.data.Dataset.from_tensor_slices([['Never tell me the odds.'],
                                           ["It's a trap!"]])
tokenizer = text.WhitespaceTokenizer()
tokenized_docs = docs.map(lambda x: tokenizer.tokenize(x))
iterator = tokenized_docs.make_one_shot_iterator()
print(iterator.get_next().to_list())
print(iterator.get_next().to_list())
[['Never', 'tell', 'me', 'the', 'odds.']]
[["It's", 'a', 'trap!']]

Keras API

当您使用不同的分词器 (tokenizer) 和操作符 (ops) 来预处理数据时,生成的输出是 Ragged Tensors(不规则张量)。Keras API 现在使得使用 Ragged Tensors 训练模型变得容易,无需担心数据的填充或掩码处理,您可以使用自动处理所有这些的 ToDense 层,或者依赖 Keras 内置层对原生处理不规则数据的支持。

model = tf.keras.Sequential([
  tf.keras.layers.InputLayer(input_shape=(None,), dtype='int32', ragged=True)
  text.keras.layers.ToDense(pad_value=0, mask=True),
  tf.keras.layers.Embedding(100, 16),
  tf.keras.layers.LSTM(32),
  tf.keras.layers.Dense(32, activation='relu'),
  tf.keras.layers.Dense(1, activation='sigmoid')
])

其他文本操作符

TF.Text 包封装了其他有用的预处理操作符。下面我们将回顾几个。

Wordshape 特征

某些自然语言理解模型中常用的一种特征是查看文本字符串是否具有某种属性。例如,句子分割模型可能包含检查单词大小写或标点符号是否在字符串末尾的特征。

Wordshape 定义了一系列基于正则表达式的有用辅助函数,用于匹配输入文本中的各种相关模式。以下是一些示例。

tokenizer = text.WhitespaceTokenizer()
tokens = tokenizer.tokenize(['Everything not saved will be lost.',
                             u'Sad☹'.encode('UTF-8')])

# Is capitalized?
f1 = text.wordshape(tokens, text.WordShape.HAS_TITLE_CASE)
# Are all letters uppercased?
f2 = text.wordshape(tokens, text.WordShape.IS_UPPERCASE)
# Does the token contain punctuation?
f3 = text.wordshape(tokens, text.WordShape.HAS_SOME_PUNCT_OR_SYMBOL)
# Is the token a number?
f4 = text.wordshape(tokens, text.WordShape.IS_NUMERIC_VALUE)

print(f1.to_list())
print(f2.to_list())
print(f3.to_list())
print(f4.to_list())
[[True, False, False, False, False, False], [True]]
[[False, False, False, False, False, False], [False]]
[[False, False, False, False, False, True], [True]]
[[False, False, False, False, False, False], [False]]

N-gram 与滑动窗口

给定大小为 n 的滑动窗口,N-grams 是连续的单词序列。在组合 tokens 时,支持三种归约机制。对于文本,您应该使用 Reduction.STRING_JOIN,它将字符串彼此连接。默认分隔符字符是空格,但可以通过 string_separater 参数更改。

另外两种归约方法通常与数值一起使用,它们是 Reduction.SUMReduction.MEAN

tokenizer = text.WhitespaceTokenizer()
tokens = tokenizer.tokenize(['Everything not saved will be lost.',
                             u'Sad☹'.encode('UTF-8')])

# Ngrams, in this case bi-gram (n = 2)
bigrams = text.ngrams(tokens, 2, reduction_type=text.Reduction.STRING_JOIN)

print(bigrams.to_list())
[['Everything not', 'not saved', 'saved will', 'will be', 'be lost.'], []]

安装

使用 PIP 安装

当使用 pip install 安装 TF Text 时,请注意您正在运行的 TensorFlow 版本,因为您应该指定相应版本的 TF Text。例如,如果您使用的是 TF 2.0,请安装 TF Text 的 2.0 版本;如果您使用的是 TF 1.15,请安装 TF Text 的 1.15 版本。

pip install -U tensorflow-text==<version>

关于不同操作系统包的说明

2.10 版本之后,我们将仅提供适用于 Linux x86_64 和基于 Intel 的 Mac 的 pip 包。TF Text 一直利用核心 TensorFlow 包的发布基础设施,以更轻松地维护兼容版本并减少维护工作,使团队能够专注于 TF Text 本身以及对 TensorFlow 生态系统其他部分的贡献。

对于其他系统,如 Windows、Aarch64 和 Apple Mac,TensorFlow 依赖于 构建协作者,因此我们将不为它们提供包。不过,我们将继续接受 PRs(拉取请求),以使为这些操作系统构建变得更加容易,并尝试指向相关的社区努力。

从源码构建步骤:

请注意,TF Text 需要在与 TensorFlow 相同的环境中构建。因此, 如果您手动构建 TF Text,强烈建议您同时构建 TensorFlow。

如果在 MacOS 上构建,您必须安装 coreutils。使用 Homebrew 可能是最简单的方法。

  1. 构建并安装 TensorFlow
  2. 克隆 TF Text 仓库:
    git clone https://github.com/tensorflow/text.git
    cd text
    
  3. 运行构建脚本以创建 pip 包:
    ./oss_scripts/run_build.sh
    
    完成此步骤后,当前目录中应该会有一个 *.whl 文件。文件名类似于 tensorflow_text-2.5.0rc0-cp38-cp38-linux_x86_64.whl
  4. 将包安装到环境中:
    pip install ./tensorflow_text-*-*-*-os_platform.whl
    

使用 TensorFlow 的 SIG(特别兴趣组)Docker(容器引擎)镜像构建或测试:

  1. TensorFlow SIG Docker 构建 拉取镜像。

  2. 基于拉取的镜像运行一个容器并创建一个 bash 会话。 这可以通过运行 docker run -it {image_name} bash 来完成。
    {image_name} 可以是任何符合 {tf_version}-python{python_version} 格式的字符串。 Python 3.10 和 TF 版本 2.10 的一个示例为:2.10-python3.10

  3. 在容器内克隆 TF-Text Github 仓库:git clone https://github.com/tensorflow/text.git
    克隆完成后,使用 cd text/ 切换到工作目录。

  4. 运行配置脚本:./oss_scripts/configure.sh./oss_scripts/prepare_tf_dep.sh
    这将更新 Bazel 和 TF 依赖项以匹配容器中安装的 TensorFlow。

  5. 要运行测试,请使用 Bazel 命令:bazel test --test_output=errors tensorflow_text:all。这将运行 BUILD 文件中声明的所有测试。
    要运行特定测试,请修改上述命令,将 :all 替换为测试名称(例如 :fast_bert_normalizer)。

  6. 构建 pip 包/wheel:
    bazel build --config=release_cpu_linux oss_scripts/pip_package:build_pip_package
    ./bazel-bin/oss_scripts/pip_package/build_pip_package /{wheel_dir}

    构建完成后,您应该在 {wheel_dir} 目录下看到可用的 wheel。

版本历史

v2.20.12026/03/10
v2.20.02026/01/28
v2.19.02025/04/04
v2.19.0-rc02025/04/04
v2.18.12024/12/17
v2.18.02024/10/28
v2.18.0-rc02024/09/30
v2.17.02024/07/15
v2.17.0-rc02024/06/25
v2.16.12024/03/11
v2.16.0-rc02024/02/28
v2.15.02023/11/15
v2.15.0-rc02023/10/26
v2.14.02023/10/06
v2.14.0-rc02023/08/18
v2.13.02023/07/06
v2.13.0-rc02023/05/16
v2.12.12023/04/12
v2.12.02023/03/27
v2.12.0-rc02023/02/21

常见问题

相似工具推荐

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

139k|★★☆☆☆|今天
开发框架Agent语言模型

NextChat

NextChat 是一款轻量且极速的 AI 助手,旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性,以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发,NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。 这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言,它也提供了便捷的自托管方案,支持一键部署到 Vercel 或 Zeabur 等平台。 NextChat 的核心亮点在于其广泛的模型兼容性,原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型,让用户在一个界面即可自由切换不同 AI 能力。此外,它还率先支持 MCP(Model Context Protocol)协议,增强了上下文处理能力。针对企业用户,NextChat 提供专业版解决方案,具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能,满足公司对数据隐私和个性化管理的高标准要求。

87.6k|★★☆☆☆|今天
开发框架语言模型

ML-For-Beginners

ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程,旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周,包含 26 节精炼课程和 52 道配套测验,内容涵盖从基础概念到实际应用的完整流程,有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。 无论是希望转型的开发者、需要补充算法背景的研究人员,还是对人工智能充满好奇的普通爱好者,都能从中受益。课程不仅提供了清晰的理论讲解,还强调动手实践,让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持,通过自动化机制提供了包括简体中文在内的 50 多种语言版本,极大地降低了全球不同背景用户的学习门槛。此外,项目采用开源协作模式,社区活跃且内容持续更新,确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路,ML-For-Beginners 将是理想的起点。

85k|★★☆☆☆|今天
图像数据工具视频

ragflow

RAGFlow 是一款领先的开源检索增强生成(RAG)引擎,旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体(Agent)能力相结合,不仅支持从各类文档中高效提取知识,还能让模型基于这些知识进行逻辑推理和任务执行。 在大模型应用中,幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构(如表格、图表及混合排版),显著提升了信息检索的准确度,从而有效减少模型“胡编乱造”的现象,确保回答既有据可依又具备时效性。其内置的智能体机制更进一步,使系统不仅能回答问题,还能自主规划步骤解决复杂问题。 这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统,还是致力于探索大模型在垂直领域落地的创新者,都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口,既降低了非算法背景用户的上手门槛,也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目,它正成为连接通用大模型与行业专有知识之间的重要桥梁。

77.1k|★★★☆☆|昨天
Agent图像开发框架

PaddleOCR

PaddleOCR 是一款基于百度飞桨框架开发的高性能开源光学字符识别工具包。它的核心能力是将图片、PDF 等文档中的文字提取出来,转换成计算机可读取的结构化数据,让机器真正“看懂”图文内容。 面对海量纸质或电子文档,PaddleOCR 解决了人工录入效率低、数字化成本高的问题。尤其在人工智能领域,它扮演着连接图像与大型语言模型(LLM)的桥梁角色,能将视觉信息直接转化为文本输入,助力智能问答、文档分析等应用场景落地。 PaddleOCR 适合开发者、算法研究人员以及有文档自动化需求的普通用户。其技术优势十分明显:不仅支持全球 100 多种语言的识别,还能在 Windows、Linux、macOS 等多个系统上运行,并灵活适配 CPU、GPU、NPU 等各类硬件。作为一个轻量级且社区活跃的开源项目,PaddleOCR 既能满足快速集成的需求,也能支撑前沿的视觉语言研究,是处理文字识别任务的理想选择。

74.9k|★★★☆☆|今天
语言模型图像开发框架

OpenHands

OpenHands 是一个专注于 AI 驱动开发的开源平台,旨在让智能体(Agent)像人类开发者一样理解、编写和调试代码。它解决了传统编程中重复性劳动多、环境配置复杂以及人机协作效率低等痛点,通过自动化流程显著提升开发速度。 无论是希望提升编码效率的软件工程师、探索智能体技术的研究人员,还是需要快速原型验证的技术团队,都能从中受益。OpenHands 提供了灵活多样的使用方式:既可以通过命令行(CLI)或本地图形界面在个人电脑上轻松上手,体验类似 Devin 的流畅交互;也能利用其强大的 Python SDK 自定义智能体逻辑,甚至在云端大规模部署上千个智能体并行工作。 其核心技术亮点在于模块化的软件智能体 SDK,这不仅构成了平台的引擎,还支持高度可组合的开发模式。此外,OpenHands 在 SWE-bench 基准测试中取得了 77.6% 的优异成绩,证明了其解决真实世界软件工程问题的能力。平台还具备完善的企业级功能,支持与 Slack、Jira 等工具集成,并提供细粒度的权限管理,适合从个人开发者到大型企业的各类用户场景。

70.6k|★★★☆☆|今天
语言模型Agent开发框架