Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

如何设置清洗后的数据不包含"__dj__stats__"字段? #102

Closed
3 tasks done
ZhouqyCH opened this issue Nov 28, 2023 · 3 comments · Fixed by #106
Closed
3 tasks done

如何设置清洗后的数据不包含"__dj__stats__"字段? #102

ZhouqyCH opened this issue Nov 28, 2023 · 3 comments · Fixed by #106
Assignees
Labels
enhancement New feature or request question Further information is requested

Comments

@ZhouqyCH
Copy link

Before Asking 在提问之前

  • I have read the README carefully. 我已经仔细阅读了 README 上的操作指引。

  • I have pulled the latest code of main branch to run again and the problem still existed. 我已经拉取了主分支上最新的代码,重新运行之后,问题仍不能解决。

Search before asking 先搜索,再提问

  • I have searched the Data-Juicer issues and found no similar questions. 我已经在 issue列表 中搜索但是没有发现类似的问题。

Question

在使用中发现清洗后的数据中不仅包含原有数据的字段,还新增了"dj__stats"字段,里面包括一系列与清洗时的算子相关的属性值。这确实方便了我们了解数据在清洗过程中为何被保留下来。

现在我想要进行多个阶段的数据清洗,例如第一阶段在数据集内进行清洗,第二阶段在数据集间进行清洗。针对这种多阶段的设计,当我想要基于预处理后的数据再次做预处理时,会报错:

pyarrow.lib.ArrowInvalid: Unable to merge: Field __dj__stats__ has incompatible types: struct<alnum_ratio: double, avg_line_length: double, char_rep_ratio: double, flagged_words_ratio: double, max_line_length: int64, num_words: int64, perplexity: double, special_char_ratio: double, text_len: int64, word_rep_ratio: double> vs struct<alnum_ratio: double>
  0%|          | 0/1 [00:00<?, ?it/s]

看起来似乎是"dj__stats"字段的格式引起的问题。
我没有找到如何设置清洗后的数据不包含"dj__stats"字段,看源代码似乎是一个默认包含"dj__stats"字段的设计?

Additional 额外信息

No response

@ZhouqyCH ZhouqyCH added the question Further information is requested label Nov 28, 2023
@HYLcool
Copy link
Collaborator

HYLcool commented Nov 28, 2023

你好,感谢你的关注与使用!

目前Data-Juicer的确在导出处理结果数据集时,会将中间计算得到的stats信息一起导出,这的确有可能导致数据集在后续使用时出现您提到的问题,目前对你来说一个暂时的快速的解决方法为对每个处理后的数据集进行一下额外处理:

from datasets import load_dataset
from data_juicer.utils.constants import Fields
ds = load_dataset(...)  # load the result dataset
ds = ds.remove_columns(Fields.stats)  # remove this extra stats field
# export to the expected format
ds.to_jsonl(...)
# or 
ds.to_parquet(...)
...

你可以尝试一下这个暂时方案能否解决你的问题?

此外,后续我们会针对这种场景添加一个额外参数来供用户选择是否在结果数据集中保留这些处理过程中额外添加的字段,并且会对相关的需求的场景做一些优化,但这个会花费一些开发的时间,我们会在这部分改进完成后告知你,感谢你的提议~

@HYLcool HYLcool added the enhancement New feature or request label Nov 28, 2023
@ZhouqyCH
Copy link
Author

你好,感谢你的关注与使用!

目前Data-Juicer的确在导出处理结果数据集时,会将中间计算得到的stats信息一起导出,这的确有可能导致数据集在后续使用时出现您提到的问题,目前对你来说一个暂时的快速的解决方法为对每个处理后的数据集进行一下额外处理:

from datasets import load_dataset
from data_juicer.utils.constants import Fields
ds = load_dataset(...)  # load the result dataset
ds = ds.remove_columns(Fields.stats)  # remove this extra stats field
# export to the expected format
ds.to_jsonl(...)
# or 
ds.to_parquet(...)
...

你可以尝试一下这个暂时方案能否解决你的问题?

此外,后续我们会针对这种场景添加一个额外参数来供用户选择是否在结果数据集中保留这些处理过程中额外添加的字段,并且会对相关的需求的场景做一些优化,但这个会花费一些开发的时间,我们会在这部分改进完成后告知你,感谢你的提议~

感谢非常及时的回复和解答!ds.remove_columns(Fields.stats)确实是一个有效的解决办法,给其他朋友们的参考:如果有固定需求的话,可以将ds_new = ds.remove_columns(Fields.stats)添加到Exporter._export_impl()的export_method()操作之前,然后对ds_new进行export_method()操作。

@HYLcool
Copy link
Collaborator

HYLcool commented Nov 30, 2023

Hi @ZhouqyCH

我们再上面提到的那个PR中添加了两个新参数keep_stats/hashes_in_res_ds,用来控制是否在导出的结果数据集文件中保留处理过程中计算得到的中间stats以及hash,他们的默认值均为False,你可以尝试一下是否能够满足你上面提到的使用场景

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request question Further information is requested
Projects
None yet
2 participants