如何通过Beam pipeline构建数据点到整数映射的全局词汇表
实现方案
你可以通过先全局聚合所有元素、再枚举分配索引的方式生成目标映射结构,示例代码如下:
import apache_beam as beam with beam.Pipeline() as pipeline: vocab_mapping = ( pipeline | 'Create produce' >> beam.Create([ '🍓 Strawberry', '🥕 Carrot', '🍆 Eggplant', '🍅 Tomato', '🥔 Potato', ]) # 可选步骤:去重避免重复元素分配不同ID | 'Deduplicate elements' >> beam.Distinct() # 可选步骤:排序保证同一份数据每次运行生成的ID稳定不变 | 'Sort for stable ID' >> beam.combiners.ToList().then(sorted) # 生成{元素: 整数索引}的映射字典 | 'Build mapping' >> beam.Map(lambda elem_list: {elem: idx for idx, elem in enumerate(elem_list)}) # 打印验证结果 | beam.Map(print) )
运行上述代码会直接输出你需要的结构:{'🍓 Strawberry': 0, '🥕 Carrot': 1, '🍆 Eggplant': 2, '🍅 Tomato': 3, '🥔 Potato': 4}
注意事项
- 该方案适合常规词汇表场景,要求全量词汇总大小可以放入单节点内存,这在绝大多数NLP、数据分类的词汇表构建场景下都适用
- 如果不需要保证ID的稳定性,可以去掉排序步骤,性能会更好
- 如果词汇量超大无法单节点加载,可以改用分桶分配ID的方案,不过实现复杂度会高很多
内容的提问来源于stack exchange,提问作者S. P
相关产品推荐
相关产品推荐

