如何用Polars替代Pandas处理文本搜索词并移除JSON依赖?
用Polars替代Pandas实现文本术语标记(移除JSON依赖)
核心思路
- 直接在代码中定义搜索词结构,彻底移除JSON文件依赖
- 利用Polars的向量化字符串操作替代Pandas的
apply,大幅提升处理效率 - 针对单词和精确短语分别构建正则规则:
- 单词匹配:用
\b正则边界确保匹配完整单词(避免部分匹配,比如"apple"不会匹配"applesauce") - 精确短语匹配:直接匹配完整短语,自动转义特殊字符避免正则语法冲突
- 单词匹配:用
完整实现代码
import polars as pl import re class DataFrameProcessor: def __init__(self, df: pl.DataFrame, col_name: str) -> None: self.df = df self.col_name = col_name def _build_regex_pattern(self, terms: dict) -> str: # 处理单词:添加正则边界确保完整匹配 word_patterns = [rf"\b{re.escape(word)}\b" for word in terms.get("words", [])] # 处理精确短语:直接转义后匹配完整字符串 phrase_patterns = [re.escape(phrase) for phrase in terms.get("exact_phrases", [])] # 合并所有模式,用|分隔表示逻辑或 return "|".join(word_patterns + phrase_patterns) def add_contains_columns(self, search_terms: dict) -> pl.DataFrame: for term_type, terms in search_terms.items(): pattern = self._build_regex_pattern(terms) if not pattern: # 如果没有匹配项,直接生成全False列 self.df = self.df.with_columns(pl.lit(False).alias(term_type)) continue # 用Polars的str.contains做向量化匹配 self.df = self.df.with_columns( pl.col(self.col_name).str.contains(pattern, regex=True).alias(term_type) ) return self.df # 示例使用 if __name__ == "__main__": # 直接定义搜索词(替代原JSON文件) SEARCH_TERMS = { "type1": { "words": ["apple", "tasty"], "exact_phrases": ["soccer ball"] }, "type2": { "words": ["banana"], "exact_phrases": ["red apple"] } } # 构造Polars DataFrame data = {'text_column': ['The apple is red', 'I like bananas', 'Cherries are tasty']} df = pl.DataFrame(data) # 处理数据 processor = DataFrameProcessor(df, 'text_column') new_df = processor.add_contains_columns(SEARCH_TERMS) print(new_df)
关键细节说明
搜索词定义:
把原JSON中的结构直接转换成Python字典SEARCH_TERMS,放在代码中,彻底摆脱JSON文件依赖。正则模式构建:
- 单词匹配用
\b边界,比如\bapple\b只会匹配独立的"apple"单词,不会匹配包含它的更长单词 - 精确短语用
re.escape()转义特殊字符(比如如果短语包含.、*等正则符号,会自动转义避免语法错误) - 所有模式用
|合并,一次匹配所有目标术语,减少多次扫描文本的开销
- 单词匹配用
Polars向量化操作:
用pl.col(self.col_name).str.contains()替代原Pandas的apply,Polars会对整列进行批量处理,性能远高于逐行遍历的apply,尤其是处理大数据量时优势明显。空值/无匹配项处理:
如果某个类型没有定义任何单词或短语,会自动生成全False的列,避免出现错误。
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

