数据分析数据工程机器学习【免费下载链接】cudfcuDF - GPU DataFrame Library项目地址https://gitcode.com/gh_mirrors/cu/cudf点击查看免费下载导读pylibcudf.nvtext.ngrams_tokenize是 cuDF GPU 文本处理工具集 nvtext 中的一个核心 API它把字符串切词tokenize与N-gram 生成两个步骤合并为一次 GPU 内核调用直接在一列字符串上批量产出 bigram、trigram 等连续词元组合。本文以 ngrams_tokenize.rst 文档为骨架结合其 Python 封装、C 底层实现与单元测试完整讲解该 API 的参数语义、行为规则、典型用法与源码级原理。读完本文你将能准确理解每个参数的取值范围与默认行为并能在自己的数据上直接复现示例代码。一、API 定位一次调用完成切词 组元ngrams_tokenize属于 cuDF 的 nvtext 子模块位于python/pylibcudf/pylibcudf/nvtext/目录下与tokenize、generate_ngrams、normalize、edit_distance等文本工具并列。它的核心能力在 C 头文件 中定义得非常明确对输入字符串列执行切词然后为每个字符串生成 ngram。ngram 是由 2 个及以上词元token按分隔符组合而成的分组例如生成 bigram 会组合字符串中所有相邻的词元对。也就是说它同时完成了传统 NLP 流程中的两步切词按指定的 delimiter 把每个字符串切分成词元序列组元按窗口大小ngrams把相邻词元用 separator 连接成 N-gram 并输出。例如输入[a bb ccc]用空格切词得到[a, bb, ccc]bigramn2生成[a_bb, bb_ccc]trigramn3则生成[a_bb_ccc]。二、函数签名与参数详解2.1 Python 接口签名依据 ngrams_tokenize.pyx 与对应的 类型标注文件def ngrams_tokenize( input: Column, # 输入字符串列 ngrams: int, # 要生成的 ngram 阶数size_type delimiter: Scalar, # 切词分隔符UTF-8 字符串标量 separator: Scalar, # 连接 ngram 词元的分隔字符串 stream: CudaStreamLike | None None, # CUDA 流 mr: DeviceMemoryResource | None None, # 设备内存资源 ) - Column: ...该函数位于模块pylibcudf.nvtext.ngrams_tokenize使用时通过plc.nvtext.ngrams_tokenize.ngrams_tokenize(...)调用与 RST 文档 中automodule:: pylibcudf.nvtext.ngrams_tokenize生成的 API 文档页完全对应。2.2 参数语义参数类型说明inputColumn输入字符串列可为空值null行ngramsintsize_type要生成的 ngram 阶数即每个输出词元由几个原始词元组成delimiterScalar字符串用于把每个字符串切分为词元的 UTF-8 字符空字符串表示按空白切分字符码点 ≤ 空格 的字符separatorScalar字符串用于拼接 ngram 中各个词元的分隔字符串streamCudaStreamLike \| None执行运算的 CUDA 流默认取当前默认流mrDeviceMemoryResource \| None用于分配输出列设备内存的内存资源默认取当前设备资源注意delimiter与separator都是UTF-8 字符串标量string_scalar这意味着分隔符可以是一个或多个字符也可以是中文字符等非 ASCII 字符。2.3 返回值返回一个新的字符串列元素为生成的 ngram 词元输出列的行数等于从输入列中实际生成的所有 ngram 总数见 C 头文件。三、行为规则边界条件与执行语义这部分内容来自 C 头文件 的官方文档是理解该 API 的关键切词从每个字符串开头定位 delimiter 划分词元。delimiter 为空时使用空白切分字符码点 的字符均视为分隔符即空格、制表符等均会被识别为词元边界。跨行不组元ngram 只使用同一字符串内部的词元生成不会跨越相邻行组合。例如[a b c, d e]中c与d永远不会被组合成一个 bigram。词元不足则跳过任何输入字符串如果其词元数少于指定的ngrams值则该字符串整个被跳过不贡献任何输出。例如 bigramn2会忽略只有 1 个词元的字符串trigramn3会忽略词元数为 2 或更少的字符串。输出有序每个字符串内部按输入列的行序生成 ngram且input row[i]生成的 ngram 在输出列中紧排在input row[i1]生成的 ngram 之前。空值处理所有 null 行条目均被忽略输出只包含有效行产生的 ngram见 头文件。3.1 官方伪代码示例C 头文件 给出了一个可直接推演的完整示例输入s [a b c, d e, f g h i, j] 调用t ngrams_tokenize(s, 2, , _) 输出t [a_b, b_c, d_e, f_g, g_h, h_i]逐行推演a b c→ 词元[a,b,c]→ bigrama_b、b_cd e→ 词元[d,e]→ bigramd_ef g h i→ 词元[f,g,h,i]→ bigramf_g、g_h、h_ij→ 只有 1 个词元少于 n2被跳过不产生输出。结果共 6 行与文档描述完全一致。四、源码级实现从 Python 到 CUDA 内核的调用链4.1 Python 封装层Cythonpylibcudf 的 .pyx 实现 展示了完整的调用流程通过_get_stream(stream)获取 CUDA 流通过_get_memory_resource(mr)解析内存资源将输入Column转为column_viewinput.view()将 Python 层的delimiter、separator标量强转为 C 的string_scalar引用在nogil块中调用底层 C 函数cpp_ngrams_tokenize(...)释放 GIL 以便并发执行将返回的unique_ptr[column]通过Column.from_libcudf包装为 Python 层Column。4.2 Cython 声明层pylibcudf 内部的 .pxd 声明 将 C 头文件nvtext/ngrams_tokenize.hpp中的nvtext::ngrams_tokenize函数暴露给 Python 层并挂接了libcudf_exception_handler——C 侧抛出的异常会被统一转换为 Python 异常保证错误信息可读。4.3 C 底层接口C 层的函数声明见 cpp/include/nvtext/ngrams_tokenize.hpp#L70-L76std::unique_ptrcudf::column ngrams_tokenize( cudf::strings_column_view const input, cudf::size_type ngrams, cudf::string_scalar const delimiter, cudf::string_scalar const separator, cuda::stream_ref stream cudf::get_default_stream(), rmm::device_async_resource_ref mr cudf::get_current_device_resource_ref());它属于nvtext_ngramsDoxygen 分组见头文件第 15-19 行输入是strings_column_view字符串列视图返回的是新分配的cudf::column。两个默认参数表明不显式传入流与内存资源时运算在默认 CUDA 流上执行内存分配使用当前设备资源——这与 Python 层streamNone, mrNone的默认行为一一对应。五、单元测试行为验证与预期推演仓库在 python/pylibcudf/tests/test_nvtext_ngrams_tokenize.py 中提供了完整测试可以直接作为行为验证样例arr [a*b*c*d, a b c d, a-b-c-d, a*b c-d] pytest.mark.parametrize(ngrams, [2, 3]) pytest.mark.parametrize(delim, [*, , -]) pytest.mark.parametrize(sep, [_, , ,]) def test_ngrams_tokenize(input_col, ngrams, delim, sep): # 用 Python 纯逻辑构造期望结果 # 按 delim 切分 → 滑动窗口取 ngrams 个词元 → 用 sep 拼接 result plc.nvtext.ngrams_tokenize.ngrams_tokenize( plc.Column.from_arrow(input_col), ngrams, plc.Scalar.from_arrow(pa.scalar(delim)), plc.Scalar.from_arrow(pa.scalar(sep)), ) assert_column_eq(result, expected)该测试揭示了几个重要的实战细节输入构造使用 PyArrowpa.array构造字符串列再通过plc.Column.from_arrow(input_col)转换为 pylibcudf 的Column标量参数构造delimiter与separator需要用plc.Scalar.from_arrow(pa.scalar(...))包成Scalar这正是签名要求Scalar 类型的原因参数矩阵验证测试对 ngrams2、3、delimiter*、空格、-、separator_、、,做了 3×3×2 共 18 组组合的交叉验证且期望结果由 Python 切片逻辑独立推演有效覆盖了多字符分隔符、混合分隔符如a*b c-d同时含*和空格等场景跨行不组元的验证输入 4 行各含 4 个词元n2 时每行应产出 3 个 bigram总共 12 行输出——若实现错误地跨行组元结果将完全不同。测试采用的期望逻辑可以视作该 API 的精确行为规范for s in strings: ss s.split(delim) for i in range(len(ss) - ngrams 1): token sep.join(ss[i : i ngrams])六、与 generate_ngrams 的区别nvtext 中还有另一个 ngram 相关 APIpylibcudf.nvtext.generate_ngrams文档见 generate_ngrams.rst源码位于 generate_ngrams.pyx。二者的分工是generate_ngrams对输入字符串列中的每一个词元本身生成 ngram 组合按指定 n 阶把每个 token 组合进 n 个 ngram 序列适合特征工程中为每个 token 生成上下文窗口ngrams_tokenize先切词、再对每个字符串内部的词元序列生成 ngram输出是拼接后的词元串。实际使用中可按需求二选一需要先切词再成组用ngrams_tokenize需要对已有词元列表生成 N-gram 序列用generate_ngrams。两者同属于nvtext_ngramsDoxygen 分组见 ngrams_tokenize.hpp。七、典型应用场景与实战建议7.1 适用场景文本特征工程为文本分类、聚类快速生成 bigram/trigram 词袋特征相似度/检索预处理与 nvtext 的jaccard、edit_distance等工具组合使用生成短语级特征批处理管道在 cuDF 数据帧的字符串列上直接调用避免 Python 逐行循环的 CPU 瓶颈。7.2 实战要点词元不足的字符串会被静默跳过这会导致输出行数与输入行数不一致下游需要留意行号对应关系null 行被忽略不会报错也不会进入输出delimiter 为空字符串表示按空白切分且空白判定标准是字符码点 ≤ 空格覆盖常见空白字符分隔符支持多字符与 UTF-8中文字符串同样适用可通过stream与mr参数接入自定义 CUDA 流和内存资源便于与更大的 GPU 管道集成默认值均为当前环境默认流与默认设备资源。八、快速上手示例结合上述测试用例一个可直接运行的端到端示例import pyarrow as pa import pylibcudf as plc from pylibcudf.nvtext.ngrams_tokenize import ngrams_tokenize # 1. 构造输入字符串列 arr pa.array([a b c, d e, f g h i, j]) input_col plc.Column.from_arrow(arr) # 2. 构造标量参数 delimiter plc.Scalar.from_arrow(pa.scalar( )) # 空格切词 separator plc.Scalar.from_arrow(pa.scalar(_)) # ngram 词元用 _ 连接 # 3. 生成 bigram result ngrams_tokenize(input_col, ngrams2, delimiterdelimiter, separatorseparator) # 4. 查看结果j 只有 1 个词元被跳过 print(result.to_arrow().to_pylist()) # 预期输出[a_b, b_c, d_e, f_g, g_h, h_i]结语pylibcudf.nvtext.ngrams_tokenize虽然 API 表面只有 6 个参数但其背后是切词—滑窗—拼接的完整 GPU 文本处理流水线。理解它的参数语义空 delimiter 的空白切分、跨行不组元、词元不足跳过、null 忽略与调用链Python Scalar → Cython 强转 → Cnvtext::ngrams_tokenize→ CUDA 内核就能在 cuDF 文本分析管道中正确、高效地使用这一工具。需要进一步探索时可查阅 nvtext 模块索引、底层 C 头文件 以及 pylibcudf 单元测试 获取第一手行为证据。赞分享数据分析数据工程机器学习【免费下载链接】cudfcuDF - GPU DataFrame Library项目地址https://gitcode.com/gh_mirrors/cu/cudf点击查看免费下载相关推荐cuDF pylibcudf nvtext.generate_ngrams 指南GPU 加速的词 n-gram 与字符 n-gram 生成cuDF pylibcudf nvtext.generate_ngrams 指南GPU 加速的词 n gram 与字符 n gram 生成 本文围绕 cuDF数据分析数据工程机器学习cuDF nvtext N-gram 生成 API 全解析从词级 n-gram 到字符级 MurmurHash 哈希cuDF nvtext N gram 生成 API 全解析从词级 n gram 到字符级 MurmurHash 哈希 cuDF 的 nvtext 子库为文本处数据分析数据工程机器学习pylibcudf nvtext 的 jaccard 模块基于字符 n-gram 的 GPU 字符串相似度计算指南pylibcudf nvtext 的 jaccard 模块基于字符 n gram 的 GPU 字符串相似度计算指南 cuDF 的 nvtext 子模块为 GP数据分析数据工程机器学习上一篇终极指南如何使用EDSR-PyTorch实现图像超分辨率提升下一篇Android蓝牙低功耗GATT完整指南快速掌握BLE设备开发技巧创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考