Python Polars 正则表达式 - 删除非英语,保留数字标点符号和表情符号
Python Polars regex - remove non english, keep numbers punctuations and emojis
我有 python 任务代码。
import re
import string
emoji_pat = '[\U0001F300-\U0001F64F\U0001F680-\U0001F6FF\u2600-\u26FF\u2700-\u27BF]'
shrink_whitespace_reg = re.compile(r'\s{2,}')
def clean_text(raw_text):
reg = re.compile(r'({})|[^a-zA-Z0-9 -{}]'.format(emoji_pat,r"\".join(list(string.punctuation)))) # line a
result = reg.sub(lambda x: ' {} '.format(x.group(1)) if x.group(1) else ' ', raw_text)
return shrink_whitespace_reg.sub(' ', result).lower()
我试过用极坐标polars.internals.series.StringNameSpace.contains
But I got an exceptions
ComputeError: regex error: Syntax(
regex parse error:
([--☀-⛿✀-➿])|[^a-zA-Z0-9 -!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\]\^\_\`\{\}\~]
^^
error: unclosed character class
中英文不详示例
texts = ['水虫対策にはコレが一番ですね','','I love polars!-ã„ã¤ã‚‚ã•ã‚‰ã•ã‚‰.','So good .']
df = pd.DataFrame({'text':texts})
d = df.text.apply(clean_text)
预计:
0
1
2 i love polars! .
3 so good .
Name: text, dtype: object
另一个问题:
它比使用re
快吗?
import polars as pl
emoji_pat = "[\U0001F300-\U0001F64F\U0001F680-\U0001F6FF\u2600-\u26FF\u2700-\u27BF]"
texts = ['水虫対策にはコレが一番ですね','','I |love| polars!-ã„ã¤ã‚‚ã•ã‚‰ã•ã‚‰.','So good .']
df = pl.DataFrame(pl.Series("text", texts))
In [78]: df
Out[78]:
shape: (4, 1)
┌─────────────────────────────────────┐
│ text │
│ --- │
│ str │
╞═════════════════════════════════════╡
│ 水虫対策にはコレが一番ですね │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ I |love| polars!-ã„ã¤ã‚‚ã•ã‚‰ã•... │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ So good . │
└─────────────────────────────────────┘
# Add cleaned column (rust regex requires "[" inside [] to be escaped).
df_cleaned = df.with_column(
pl.col("text").str.replace_all(
"[^a-zA-Z0-9 " + string.punctuation.replace("[", "\[") + emoji_pat + "]+",
""
).str.replace_all(
"\s{2,}", " "
).str.to_lowercase().alias("text_cleaned")
)
In[79]: df_cleaned
Out[79]:
shape: (4, 2)
┌─────────────────────────────────────┬────────────────────┐
│ text ┆ text_cleaned │
│ --- ┆ --- │
│ str ┆ str │
╞═════════════════════════════════════╪════════════════════╡
│ 水虫対策にはコレが一番ですね ┆ │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ ┆ │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ I |love| polars!-ã„ã¤ã‚‚ã•ã‚‰ã•... ┆ i |love| polars!-. │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ So [good] . ┆ so [good] . │
└─────────────────────────────────────┴────────────────────┘
我有 python 任务代码。
import re
import string
emoji_pat = '[\U0001F300-\U0001F64F\U0001F680-\U0001F6FF\u2600-\u26FF\u2700-\u27BF]'
shrink_whitespace_reg = re.compile(r'\s{2,}')
def clean_text(raw_text):
reg = re.compile(r'({})|[^a-zA-Z0-9 -{}]'.format(emoji_pat,r"\".join(list(string.punctuation)))) # line a
result = reg.sub(lambda x: ' {} '.format(x.group(1)) if x.group(1) else ' ', raw_text)
return shrink_whitespace_reg.sub(' ', result).lower()
我试过用极坐标polars.internals.series.StringNameSpace.contains
But I got an exceptions
ComputeError: regex error: Syntax(
regex parse error:
([--☀-⛿✀-➿])|[^a-zA-Z0-9 -!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\]\^\_\`\{\}\~]
^^
error: unclosed character class
中英文不详示例
texts = ['水虫対策にはコレが一番ですね','','I love polars!-ã„ã¤ã‚‚ã•ã‚‰ã•ã‚‰.','So good .']
df = pd.DataFrame({'text':texts})
d = df.text.apply(clean_text)
预计:
0
1
2 i love polars! .
3 so good .
Name: text, dtype: object
另一个问题:
它比使用re
快吗?
import polars as pl
emoji_pat = "[\U0001F300-\U0001F64F\U0001F680-\U0001F6FF\u2600-\u26FF\u2700-\u27BF]"
texts = ['水虫対策にはコレが一番ですね','','I |love| polars!-ã„ã¤ã‚‚ã•ã‚‰ã•ã‚‰.','So good .']
df = pl.DataFrame(pl.Series("text", texts))
In [78]: df
Out[78]:
shape: (4, 1)
┌─────────────────────────────────────┐
│ text │
│ --- │
│ str │
╞═════════════════════════════════════╡
│ 水虫対策にはコレが一番ですね │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ I |love| polars!-ã„ã¤ã‚‚ã•ã‚‰ã•... │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ So good . │
└─────────────────────────────────────┘
# Add cleaned column (rust regex requires "[" inside [] to be escaped).
df_cleaned = df.with_column(
pl.col("text").str.replace_all(
"[^a-zA-Z0-9 " + string.punctuation.replace("[", "\[") + emoji_pat + "]+",
""
).str.replace_all(
"\s{2,}", " "
).str.to_lowercase().alias("text_cleaned")
)
In[79]: df_cleaned
Out[79]:
shape: (4, 2)
┌─────────────────────────────────────┬────────────────────┐
│ text ┆ text_cleaned │
│ --- ┆ --- │
│ str ┆ str │
╞═════════════════════════════════════╪════════════════════╡
│ 水虫対策にはコレが一番ですね ┆ │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ ┆ │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ I |love| polars!-ã„ã¤ã‚‚ã•ã‚‰ã•... ┆ i |love| polars!-. │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ So [good] . ┆ so [good] . │
└─────────────────────────────────────┴────────────────────┘