You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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)

关键细节说明

  1. 搜索词定义:
    把原JSON中的结构直接转换成Python字典SEARCH_TERMS,放在代码中,彻底摆脱JSON文件依赖。

  2. 正则模式构建:

    • 单词匹配用\b边界,比如\bapple\b只会匹配独立的"apple"单词,不会匹配包含它的更长单词
    • 精确短语用re.escape()转义特殊字符(比如如果短语包含.、*等正则符号,会自动转义避免语法错误)
    • 所有模式用|合并,一次匹配所有目标术语,减少多次扫描文本的开销
  3. Polars向量化操作:
    用pl.col(self.col_name).str.contains()替代原Pandas的apply,Polars会对整列进行批量处理,性能远高于逐行遍历的apply,尤其是处理大数据量时优势明显。

  4. 空值/无匹配项处理:
    如果某个类型没有定义任何单词或短语,会自动生成全False的列,避免出现错误。

内容的提问来源于stack exchange,提问作者Simon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 13:43:18