You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PySpark ML的Tokenizer/RegexTokenizer实现字符级分词?

没问题!你想要的字符级分词(包括空格)完全可以实现,不过默认的Tokenizer做不到——它是按空白字符拆分单词的。下面给你两种靠谱的方案,用PySpark ML就能搞定:

方案1:用RegexTokenizer快速实现

RegexTokenizer比默认Tokenizer灵活得多,通过调整参数就能直接实现字符级拆分。核心是利用gaps=False参数,让正则表达式匹配我们要保留的内容而不是分隔符:

from pyspark.ml.feature import RegexTokenizer

# 初始化数据
sentenceDataFrame = spark.createDataFrame([
    (0, "Hi I heard about Spark"),
    (1, "I wish Java could use case classes"),
    (2, "Logistic,regression,models,are,neat")
], ["id", "sentence"])

# 配置字符级分词器
char_tokenizer = RegexTokenizer(
    inputCol="sentence",
    outputCol="words",
    pattern=".",  # 匹配任意单个字符(包括空格、标点)
    gaps=False    # 表示pattern是要提取的内容,而非分隔符
)

# 执行分词
char_tokenized = char_tokenizer.transform(sentenceDataFrame)

# 查看结果
print(char_tokenized.head())

执行后你会得到预期的结果:Row(id=0, sentence='Hi I heard about Spark', words=['H','i',' ','h','e','a','r','d',' ','a','b','o','u','t',' ','S','p','a','r','k']),完美符合需求。

方案2:自定义Transformer(更灵活)

如果之后需要扩展分词逻辑(比如过滤特定字符、处理特殊编码),自定义Transformer会更适配PySpark ML的Pipeline生态。这里我们基于PySpark的Transformer类实现一个字符分词器:

from pyspark.ml import Transformer
from pyspark.ml.param.shared import HasInputCol, HasOutputCol
from pyspark.sql.functions import udf
from pyspark.sql.types import ArrayType, StringType

class CharacterTokenizer(Transformer, HasInputCol, HasOutputCol):
    def __init__(self, inputCol=None, outputCol=None):
        super().__init__()
        # 设置输入输出列参数
        self._setDefault(inputCol=inputCol, outputCol=outputCol)
        self.setParams(inputCol=inputCol, outputCol=outputCol)
    
    def _transform(self, dataset):
        # 定义UDF:把字符串拆成单个字符的列表
        split_to_chars = udf(lambda s: list(s), ArrayType(StringType()))
        # 应用UDF生成新列
        return dataset.withColumn(self.getOutputCol(), split_to_chars(dataset[self.getInputCol()]))

# 使用自定义分词器
custom_tokenizer = CharacterTokenizer(inputCol="sentence", outputCol="words")
custom_tokenized = custom_tokenizer.transform(sentenceDataFrame)

# 查看结果
print(custom_tokenized.head())

这个方案的优势是可以自由修改_transform方法里的逻辑,比如加个判断过滤掉非打印字符,或者处理多字节字符,完全按需定制。


内容的提问来源于stack exchange,提问作者ShuoshuoFan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:50:05