0

我有一个多行 json 数据集,其中包含多个可以存在或不存在的字段,并且可以包含字符串、字符串列表或更复杂的映射(dicts 列表)中的文本数据

例如。:

{"yvalue":1.0,"field1":"Some text", "field2":"More Text", "field3": ["text","items","in","list"], "field4":[{"id":3,"name":"text"},{"id":4,"name":"text"}]}
{"yvalue":2.0,"field2":"More Text2", "field3": ["text2","items2","in2","list2"], "field4":[{"id":4,"name":"text"},{"id":4,"name":"text"}], "field5":"extra text"}
...

需要此数据集作为 sklearn 管道的输入

首先,我正在通过 pandas 读取文件

df = pandas.read_json(args.input_file, lines=True)

但我想使用管道转换器,例如DataframeMapper将所有文本字段(甚至是嵌套的)连接到一个巨大的文本字段。考虑到某些字段可能会丢失,是嵌套结构等的一部分。

输出看起来像:

y值 | 文本

1.0 | 列表文本文本中的一些文本更多文本文本项

2.0 | 更多 Text2 text2 items2 in2 list2 text text extra text

当然我可以使用自定义转换器,但由于我也有兴趣将管道转换为 mleap 或 pmml 格式,因此我宁愿尽可能避免使用自定义转换器。

是否有最佳实践甚至简单的方法来做到这一点而不会太老套?


更新

显然我想要的可能有点太多了,但可能更容易一些:有没有办法使用 pandas 中的转换器连接 2 个(或更多)类似字符串的字段:

df[['field1', 'field2']].apply(lambda x: ' '.join(x.astype(str)), axis=1)

4

2 回答 2

1

考虑重构您的数据预处理。Scikit-Learn 管道不是进行低级数据清理/准备工作的地方,例如解包集合,以及(有条件地)将文本字段连接到文本文档中。

这是一项常规的编程任务,而不是机器学习任务。因此,您应该使用常规编程工具,而不是机器学习工具(例如 Scikit-Learn 转换器)来完成它。PMML 和 MLeap 都不适合低级文本处理。

于 2018-04-18T08:53:21.647 回答
0

使用管道和转换器来简化模型的可解释性(例如 shap 值)是合理的,而不是直接的 Pandas 预处理。

假设X文本列的数据框:


    class StringConcatTransformer(TransformerMixin, BaseEstimator):
        """Concatenate multiple string fields into a single field.
        """
        
        def __init__(self, missing_indicator=''):
            self.missing_indicator = missing_indicator

        def fit(self, X, y=None, **fit_params):
            return self

        def transform(self, X, y=None):
            return X.fillna(self.missing_indicator).agg(' '.join, axis=1)
于 2021-12-17T20:59:36.240 回答