我需要对文本进行最少的清理过程。
清理是删除双关语、非字母字符并仅保留英文文本。
目前我正在使用 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 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