Polars - 处理文本的有效方法

问题描述 投票:0回答:1

我需要对文本进行最少的清理过程。

清理是删除双关语、非字母字符并仅保留英文文本。

目前我正在使用 clean-text 但我可以使用任何东西。

我有几个带有文本列的 csv 文件。

我用过

map_elements
,但运行速度很慢,

有没有更好的方法(高效)来完成它?

def clean_text(s):
    return clean(s, lower=True, lang='en', no_punct=True)

df.select(pl.col('text').map_elements(clean_text))
python python-polars
1个回答
1
投票

我们可以做一些表达式功夫,这样我们只需要调用 python lambda 一次。

请耐心听我说:

splitter = "🪓"
df.select([
    pl.col("my_column").list().arr.join(splitter).apply(lambda x: clean(x, no_punct=True)).str.split(splitter).explode()
])
  • 首先,我们使用
    list()
    表达式将该列转换为一个值的列表列
  • 然后我们使用
    join
    命名空间中的
    arr
    表达式与
    splitter
    进行连接。这是一些不在我们稍后分割的数据中的字符串数据。
  • 然后我们称
    apply
    为一个大字符串。 (请注意,我们仍然需要将其转换为 python 字符串,因此它并不便宜。
  • 然后我们
    split
    explode
    获取返回值的字符串列。

我发现本地速度快了约 5 倍。

真实表现

如果您想要最佳性能,您可以编译一个函数,该函数采用

polars
系列并对 Rust 中的字符串数据进行操作。这是一个例子:https://github.com/pola-rs/polars/tree/master/examples/python_rust_compiled_function

© www.soinside.com 2019 - 2024. All rights reserved.