转换FastText训练数据格式到Parquet(Polars,KIMI)

news/2025/10/29 20:29:06/文章来源:https://www.cnblogs.com/xiaoma2018/p/19175321

转换FastText训练数据格式到Parquet(Polars,KIMI)

User: 你知道fasttext用于训练的数据格式吗?

Kimi: FastText 的训练数据格式非常简单:

  1. 每一行代表一个训练样本。
  2. 对于文本分类任务,每行的开头是标签(label) ,前缀是 __label__(两个下划线),后面跟的是文本内容
  3. 标签和文本之间用空格或制表符分隔。
  4. 可以有多个标签,也可以没有标签(用于无监督训练)。

示例

单标签分类

__label__positive 这部电影太棒了
__label__negative 质量很差,不推荐

多标签分类

__label__sports __label__news 今天的足球比赛结果

无监督训练(词向量)

今天天气很好
我喜欢吃苹果

注意事项

  • 标签前缀必须是 __label__,FastText 会识别这个前缀。
  • 文本部分不需要分词,FastText 会自动处理。
  • 文件编码建议使用 UTF-8。

如果你有具体任务(文本分类、词向量训练等),我可以给你更详细的格式说明。


User: 我需要将这些数据转换为parquet格式,需要考虑几点:

  1. 文本可能换行,所以不能直接逐行读取。每个数据只有一个标签。
  2. 数据量可能很大,输出文件批量保存在文件夹中,能够设置批量大小和paruqet格式中的row大小。
  3. 用polars实现。
  4. 写成命令行调用的形式,用python xxx.py --xxx xxx执行。
  5. 不要修改标签和文本内容。

Kimi: 下面给出一份可直接执行的 Python 脚本,用 Polars 把 FastText 单标签语料(含换行文本)转成 Parquet,支持:

  • 自定义输出目录、批次文件大小(rows_per_file)、Parquet row group 大小(rows_per_row_group)
  • 命令行调用:python ft2pq.py --input data.txt --output_dir pq_data --rows_per_file 1000000 --rows_per_row_group 100000

脚本不会改动标签与文本内容,仅做 UTF-8 解码与按 __label__ 切分。

#!/usr/bin/env python3
# ft2pq.py
import os
import re
import polars as pl
from pathlib import Path
import argparseLABEL_PREFIX = "__label__"
LABEL_RE = re.compile(rf"^{re.escape(LABEL_PREFIX)}(\S+)\s*", flags=re.UNICODE)def parse_fasttext_chunk(chunk_lines):"""将一段连续行还原成 (label, text) 列表。每条样本以 __label__xxx 开头,直到下一条 __label__ 或 chunk 结束。"""records = []cur_label, cur_text = None, []def flush():if cur_label is not None:records.append((cur_label, "".join(cur_text).rstrip("\n")))for line in chunk_lines:match = LABEL_RE.match(line)if match:  # 新样本开始flush()cur_label, cur_text = match.group(1), [line[match.end() :]]else:if cur_label is not None:  # 续行cur_text.append("\n" + line)# 如果文件开头没有 label,则丢弃flush()return recordsdef fasttext_reader(path, chunk_bytes=50 * 1024 * 1024):"""按字节块读取大文件,保证不截断 UTF-8 字符,并按行边界拆分。每次 yield 一个行列表(chunk_lines)。"""with open(path, "rb") as f:leftover = b""while True:blk = f.read(chunk_bytes)if not blk:if leftover:yield leftover.decode("utf-8").splitlines(keepends=True)break# 找到最后一个完整行idx = blk.rfind(b"\n")if idx == -1:leftover += blkcontinuecomplete = leftover + blk[: idx + 1]leftover = blk[idx + 1 :]yield complete.decode("utf-8").splitlines(keepends=True)def convert(args):os.makedirs(args.output_dir, exist_ok=True)rows_per_file = args.rows_per_filerows_per_rg = args.rows_per_row_groupwritten_total = 0file_idx = 0buffer = []schema = {"label": pl.Utf8, "text": pl.Utf8}for chunk_lines in fasttext_reader(args.input):records = parse_fasttext_chunk(chunk_lines)buffer.extend(records)while len(buffer) >= rows_per_file:df = pl.DataFrame(buffer[:rows_per_file], schema=schema)out_path = Path(args.output_dir) / f"part{file_idx:05d}.parquet"df.write_parquet(out_path, row_group_size=rows_per_rg, compression="snappy")written_total += len(df)print(f"Wrote {out_path}  rows={len(df)}  total={written_total}")buffer = buffer[rows_per_file:]file_idx += 1# 尾部剩余if buffer:df = pl.DataFrame(buffer, schema=schema)out_path = Path(args.output_dir) / f"part{file_idx:05d}.parquet"df.write_parquet(out_path, row_group_size=rows_per_rg, compression="snappy")written_total += len(df)print(f"Wrote {out_path}  rows={len(df)}  total={written_total}")print("All done.")def main():parser = argparse.ArgumentParser(description="Convert FastText single-label corpus (with possible newlines inside text) to Parquet via Polars.")parser.add_argument("--input", required=True, help="Path to FastText .txt file")parser.add_argument("--output_dir", required=True, help="Directory to save parquet files")parser.add_argument("--rows_per_file",type=int,default=1_000_000,help="Max rows per output parquet file",)parser.add_argument("--rows_per_row_group",type=int,default=100_000,help="Row group size inside each parquet file",)args = parser.parse_args()convert(args)if __name__ == "__main__":main()

保存为 ft2pq.py 后直接命令行调用即可:

python ft2pq.py \--input corpus.txt \--output_dir pq_data \--rows_per_file 500000 \--rows_per_row_group 50000

运行完毕会在 pq_data/ 下得到若干 part00000.parquetpart00001.parquet … 文件,可直接用 Polars 或任何支持 Parquet 的工具读取。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/950231.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PlantAssistant-VUE属性数据

PlantAssistant-VUE属性数据 引言 依托主流工厂设计软件数字化交付数据文件,AVEVA公司PDMS/E3D的RVM和Intergraph公司SP3D的VUE:VUE 属性数据 SP3D的VUE文件一般可以导出两种属性文件,一种是XML文件,一种是MDB2文件…

由 Mybatis 源码畅谈软件设计(四):动态 SQL 执行流程

本节我们探究动态 SQL 的执行流程,由于在前一节我们已经对各个组件进行了详细介绍,所以本节不再赘述相关内容,在本节中主要强调静态 SQL 和动态 SQL 执行的不同之处。在这个过程中,SqlNode 相关实现值得关注,它为…

数学证明的一些记录

T[2025/10/29]: 题目链接:https://codeforces.com/gym/105578/problem/B \(n与m互质,i从1到n,j从1到m,式子im+jn \% nm\),对于任何一对\(i j\),式子的值都不同 要证明这个式子,即证明不存在一对i,j使得 f(i1,j1)…

10.29(续)

代码大全2的6-10章读后感: 第 6 章 “变量命名的艺术” 看似基础,却直击编程中的 “沟通痛点”。书中强调 “好的命名应能自我说明,让读者无需查看上下文就能理解变量含义”,这一点让我深受触动。以往我常为图方便…

DicomObjects .NET 8.48.231.0 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025.10.29__jyu每日一题题解

完全平方数 题目大意 给定一个正整数 \(n\),找到最小的正整数 x,使得它们的乘积是一个完全平方数。 思路 1. 定理 算术基本定理指出:任何大于1的自然数 \(N\),要么本身是素数,要么可以唯一地分解为有限个素数的乘…

CSP-J/S2024 游记

一个蒟蒻的CSP-J/S2024游记可能是全网写得最晚的一篇 CSP-J/S2024 游记 歌:Fin.ArcDeaR - MisoilePunch♪ ~タケノコ添え~ 游记 Day 0x80000000 在表弟家玩时得知了csp报名的事 申请报名了,但一直没有审核通过 结果…

以《出师表》作为例子,对比通用分块和父子分块的区别

我们以《出师表》(节选)为例,通过具体分割结果对比**通用分块**和**父子分块**的核心差异。《出师表》结构清晰(含表文开头、历史回顾、治国建议、出师目的等部分),适合展示两种分块策略的不同逻辑。以《出师表》…

苏联套娃

无意义文章。无意义文章。

DP 状态设计

如果有些东西是一段一段的,那么你可以考虑一个一个点转移,分别考虑拼到前一段上或者新开一段。 P2679 [NOIP 2015 提高组] 子串

winget不可用,一直转圈,文字变蓝色

情况解决 原因是连接不上默认的winget源。(默认自带winget源和msstore源) 换ustc源之后一切都好了。 https://mirrors.ustc.edu.cn/help/winget-source.html winget source remove winget winget source add winget …

Uno Platform 6.3 发布:支持 .NET 10 预览版并兼容 VS 2026

Uno Platform 6.3 发布,新增对 .NET 10 预览版和 Visual Studio 2026 新解决方案格式的支持,提升 WebAssembly 图像解码性能,优化 TabView 控件和 Hot Design 设计时工具。Uno Platform 团队发布了 6.3 版本,这是一…

申威ky10架构安装MongoDB 4.0.1(rpm包:mongodb-4.0.1-8.ky10.sw_64.rpm)详细步骤

申威ky10架构安装MongoDB 4.0.1(rpm包:mongodb-4.0.1-8.ky10.sw_64.rpm)详细步骤​ ​1. 先检查环境​ 确保你的服务器是申威(ky10)架构的,系统是CentOS/RedHat系的(比如麒麟V10基于ky10的版本)​,因为这rpm包…

线段树入门 - idle

前言 笔者从2025.4.22第一次通过线段树模板,至今也不过半年时间,虽然短暂,但是却让其成为了笔者最喜欢的算法,因此,我常常会大喊我是线段树的狗。为了帮助自己记忆以及造福后人,笔者提键盘写出了这篇文章。——2…

2025年10月临江鳝丝店推荐:五家口碑店铺综合对比排行

临江鳝丝作为乐山地区的特色美食,近年来受到越来越多食客的关注。在选择临江鳝丝店时,消费者通常会考虑店铺的地域特色、食材新鲜度、烹饪技艺以及就餐环境等多个因素。根据餐饮行业数据显示,乐山地区特色餐饮门店数…

文档抽取技术在智能合同对比系统中的应用与优势分析

在商业活动日益频繁的今天,合同作为规范交易、界定权责的核心载体,其审查与管理的重要性不言而喻。传统的合同对比方式主要依赖于法务或业务人员的人工逐字阅读,耗时耗力且容易因疲劳或疏忽导致关键差异被遗漏。随着…

2025年10月临江鳝丝店对比报告:详析五家店铺特色与差异

临江鳝丝作为乐山地区的特色美食,近年来受到越来越多食客的关注。许多游客和本地居民在寻找正宗临江鳝丝店时,常常面临选择困难。根据餐饮行业数据显示,乐山地区主打临江鳝丝的店铺数量在2024年已达到数十家,但品质…

vs2022(2026)离线安装失败的问题解决

安装微软网站上的 创建 Visual Studio 的脱机安装包以进行本地安装 创建离线安装目录后,在内网机器安装一直出错。如果使用--noweb参数,就会提示要下载文件才能安装,但是内网机是不联网的,无法下载。 忘了截图,往…

家训

饿就吃饭菜成什么样了 2156 Div.2 D 压线过了。 考虑从低位到高位判定 0/1,每次 check 的数大约减半,那么 \(time=n+\frac{n}{2}+\frac{n}{4}+\dots=2n+\epsilon\),有 \(\epsilon\) 是因为可能上一步只删了下取整个…

2025年10月临江鳝丝店推荐榜:五家口碑店铺深度对比与选择指南

作为乐山地区特色美食的代表,临江鳝丝以其独特的烹饪工艺和鲜明的地方风味吸引着众多食客。选择一家正宗的临江鳝丝店不仅关乎味蕾享受,更关系到对传统美食文化的体验。当前餐饮市场呈现多元化发展趋势,消费者在选择…