将JSON/字典转为带标识令牌的扁平化字符串的工具问询
问题解答
1. CPython原生方案
CPython标准库中没有直接实现你需求的JSON转扁平化字符串的函数,但可以结合原生语法实现非硬编码的解决方案,核心思路是基于指定字段顺序遍历、过滤空值、替换换行符,示例代码如下:
def flatten_product(product_dict, field_order, sep_token="[SEP]", kv_delimiter=": "): flattened_parts = [] # 严格按照指定顺序遍历字段 for field_name in field_order: field_value = product_dict.get(field_name) # 忽略值为None的字段 if field_value is None: continue # 替换字符串中的换行符为指定令牌 if isinstance(field_value, str): field_value = field_value.replace("\n", sep_token) # 拼接键值对 flattened_parts.append(f"{field_name}{kv_delimiter}{field_value}") # 用令牌拼接所有有效字段 return sep_token.join(flattened_parts) # 示例调用 sample_product = { "product_name": "Wireless Headphones", "description": "Noise cancellation\n20-hour battery life", "price": 199.99, "discount": None } specified_fields = ["product_name", "description", "price", "discount"] print(flatten_product(sample_product, specified_fields)) # 输出: product_name: Wireless Headphones[SEP]description: Noise cancellation[SEP]20-hour battery life[SEP]price: 199.99
这种方式通过将字段顺序、令牌等作为参数传入,避免了硬编码问题,完全依赖CPython原生的字典操作、字符串处理实现。
2. tokenizers库相关方案
Hugging Face的tokenizers库核心功能是文本分词(将文本转换为子词/令牌序列),本身没有直接处理JSON/字典转扁平化字符串的功能,但可以结合以下流程实现需求:
步骤1:先将字典转为符合要求的扁平化字符串
用上面的原生方法(或自定义逻辑)生成满足规则的扁平化文本。
步骤2:用tokenizers进行令牌化
将扁平化后的文本传入tokenizers,转换为令牌序列。示例代码:
from tokenizers import Tokenizer from tokenizers.models import WordPiece from tokenizers.pre_tokenizers import Whitespace # 初始化并配置分词器 tokenizer = Tokenizer(WordPiece(unk_token="[UNK]")) tokenizer.pre_tokenizer = Whitespace() # 可选:自定义训练分词器(若使用预训练分词器可跳过此步) from tokenizers.trainers import WordPieceTrainer trainer = WordPieceTrainer( vocab_size=1500, special_tokens=["[UNK]", "[SEP]"] ) # 用样本扁平化文本训练 tokenizer.train_from_iterator([flatten_product(sample_product, specified_fields)], trainer) # 令牌化扁平化文本 encoded_output = tokenizer.encode(flatten_product(sample_product, specified_fields)) print(encoded_output.tokens) # 输出示例: ['product', '_name', ':', 'Wireless', 'Headphones', '[SEP]', 'description', ':', 'Noise', 'cancellation', '[SEP]', '20', '-', 'hour', 'battery', 'life', '[SEP]', 'price', ':', '199', '.', '99']
如果需要将扁平化逻辑集成到tokenizers的流水线中,可以自定义PreTokenizer来处理换行符替换,但过滤None值、按指定顺序拼接的逻辑仍需在传入tokenizers前完成,因为tokenizers不具备结构化数据处理的能力。
内容的提问来源于stack exchange,提问作者alvas
相关产品推荐
相关产品推荐

