如何基于多词列表从Pandas DataFrame中提取连续短语?
解决方案
核心问题是现有代码未区分连续出现的匹配词和被非匹配词隔开的匹配词,直接将所有提取到的词汇用下划线连接。我们需要先把文本拆分为单词,将连续的匹配词归为一组(组内用下划线连接),非连续的组之间用空格分隔。
实现代码
import pandas as pd L = ['top', 'left', 'behind', 'before', 'right', 'after', 'hand', 'side'] word_set = set(L) # 转为集合提升查询效率 def extract_target_phrases(text): words = text.split() groups = [] current_group = [] for word in words: if word in word_set: current_group.append(word) else: # 遇到非匹配词时,若当前组有内容则存入groups,清空当前组 if current_group: groups.append('_'.join(current_group)) current_group = [] # 处理文本末尾的匹配词组 if current_group: groups.append('_'.join(current_group)) return ' '.join(groups) # 应用到DataFrame的Text列 df['Extracted'] = df['Text'].apply(extract_target_phrases)
代码说明
- 拆分单词:将文本按空格拆分为单词列表,方便逐个判断是否属于目标词汇表。
- 分组逻辑:遍历单词时,将连续的匹配词放入同一组;遇到非匹配词时,若当前组有内容则存入结果列表并清空组。
- 组内/组间连接:每组内的匹配词用下划线连接,不同组之间用空格分隔,最终拼接成结果字符串。
比如针对文本right top of the left hand side,拆分后会形成两个连续组:['right','top']和['left','hand','side'],处理后得到right_top left_hand_side;若文本中left、hand、side之间存在非匹配词(如right top of the left xxx hand yyy side),则会拆分为三个独立组,结果为right_top left hand side,完全符合预期。
内容的提问来源于stack exchange,提问作者Parsh
相关产品推荐
相关产品推荐

