基于Python Pandas实现特定词汇句子提取与标记的高效类编写需求
高效实现文本匹配与格式化的Python类
需求说明
- 提取包含指定词汇的句子
- 在匹配到的特定词汇前后添加
*标记 - 单条文本中若有多句匹配,拆分后每行保留一句
- 过滤掉完全没有匹配词汇的文本行
数据集
text I like to eat bananas. I like to eat apples. I like to eat pears. I like to eat apples. I like to eat almonds. I like to eat fruits. I like to eat walnuts. I like to eat fruits. I like walnuts. I like figs.
需匹配的词汇列表
words = ['apples','fruits']
期望输出格式
final_text I like to eat *apples*. I like to eat *apples*. I like to eat *fruits*. I like to eat *fruits*.
现有实现的问题
原代码需要逐个指定词汇处理,步骤繁琐且效率低下,无法批量处理词汇列表,还需要额外的空值过滤步骤。
解决方案:批量处理类实现
import pandas as pd import re class TextMatcherFormatter: def __init__(self, target_words): # 构建匹配任意目标词汇的正则模式,确保匹配完整单词 self.pattern = re.compile( r'([^.]*?\b(' + '|'.join(map(re.escape, target_words)) + r')\b[^.]*)\.', re.IGNORECASE ) # 构建用于替换词汇为带星号格式的函数 self.replace_func = lambda m: m.group(1).replace(m.group(2), f'*{m.group(2)}*') + '.' def process_text(self, text): # 提取所有匹配的句子并格式化词汇 matched_sentences = self.pattern.findall(text) # 对每个匹配结果应用替换,得到格式化后的句子 formatted = [self.replace_func(re.match(r'([^.]*?\b' + re.escape(word) + r'\b[^.]*)', sent[0])) for sent in matched_sentences] return formatted # 示例使用 if __name__ == "__main__": # 构造测试数据集 data = { 'text': [ 'I like to eat bananas. I like to eat apples. I like to eat pears.', 'I like to eat apples. I like to eat almonds. I like to eat fruits.', 'I like to eat walnuts. I like to eat fruits.', 'I like walnuts. I like figs.' ] } df = pd.DataFrame(data) # 初始化处理器 matcher = TextMatcherFormatter(['apples', 'fruits']) # 处理文本并展开为每行一句 df['final_text'] = df['text'].apply(matcher.process_text) df = df.explode('final_text').dropna(subset=['final_text']).reset_index(drop=True) # 输出结果 print(df[['final_text']])
代码说明
- 初始化阶段:将目标词汇列表转为正则模式,确保匹配完整单词(避免部分匹配,比如不会把'applesauce'误判为'apples'),同时构建词汇替换函数。
- 文本处理:使用正则提取所有包含目标词汇的句子片段,然后对每个句子中的目标词汇添加星号标记。
- DataFrame处理:用
explode将单列表中的多个句子拆分为单独行,过滤空值后得到最终结果。
内容的提问来源于stack exchange,提问作者CPDatascience
相关产品推荐
相关产品推荐

