求助:如何从DataFrame文本中提取匹配关键词并生成新列
我来帮你搞定这个在DataFrame里匹配关键词(包括词形变形)的需求!下面是具体的实现步骤和代码,亲测可用~
解决方案:在DataFrame中匹配关键词(含词形变形)
1. 准备示例数据
先复现你给出的两个DataFrame,方便后续测试:
import pandas as pd # 关键词DataFrame df_keywords = pd.DataFrame({ 'Keywords': ['New', 'FUND', 'EVENT', 'Author', 'book'] }) # 内容DataFrame(初始无Keywords列) df_content = pd.DataFrame({ 'ID': [12, 23, 14], 'NAME': ['x1', 'x2', 'x3'], 'Month': ['Jan', 'Feb', 'Mar'], 'DESCRIPTION': ['funding recived', 'author of the book', 'new year event'] })
2. 方法一:用词干提取匹配(推荐,适配各种词形变形)
这种方法用nltk的词干提取器,能精准匹配词根一致的词(比如Funding/Funded都能匹配到fund),是处理词形变形的专业方案。
步骤:
- 安装并导入
nltk工具 - 预处理关键词,建立「词干-小写关键词」的映射
- 编写函数处理每个
DESCRIPTION文本,匹配关键词 - 新增
Keywords列
import nltk from nltk.stem import PorterStemmer from nltk.tokenize import word_tokenize # 第一次运行需要下载分词资源 nltk.download('punkt') # 初始化词干提取器 stemmer = PorterStemmer() # 预处理关键词:提取每个关键词的词干,同时保留小写形式 keyword_stem_map = {} for keyword in df_keywords['Keywords'].str.lower(): stem = stemmer.stem(keyword) if stem not in keyword_stem_map: keyword_stem_map[stem] = [] keyword_stem_map[stem].append(keyword) # 定义匹配函数 def extract_matched_keywords(text): # 处理空值情况 if pd.isna(text): return '' # 把文本转小写、分词、提取每个词的词干 words = word_tokenize(text.lower()) word_stems = [stemmer.stem(word) for word in words] # 收集所有匹配的关键词(去重) matched_keywords = set() for stem in word_stems: if stem in keyword_stem_map: matched_keywords.update(keyword_stem_map[stem]) # 转成逗号分隔的字符串,排序保证结果一致 return ', '.join(sorted(matched_keywords)) # 新增Keywords列到内容DataFrame df_content['Keywords'] = df_content['DESCRIPTION'].apply(extract_matched_keywords)
运行后你会得到和示例完全一致的结果:
ID NAME Month DESCRIPTION Keywords 0 12 x1 Jan funding recived fund 1 23 x2 Feb author of the book author, book 2 14 x3 Mar new year event new, event
3. 方法二:用正则表达式匹配(轻量,无需额外库)
如果不想安装nltk,可以用正则表达式实现近似匹配,通过不区分大小写+前缀匹配来覆盖词形变形:
import re # 生成正则模式:匹配以任意关键词(小写)开头的单词,不区分大小写 keywords_lower = df_keywords['Keywords'].str.lower().tolist() regex_pattern = r'\b(?:' + '|'.join(keywords_lower) + r')\w*\b' def match_with_regex(text): if pd.isna(text): return '' # 找到所有匹配的词 matched_words = re.findall(regex_pattern, text.lower()) # 映射回原关键词(比如funding对应fund) matched_keywords = set() for word in matched_words: for kw in keywords_lower: if word.startswith(kw): matched_keywords.add(kw) break return ', '.join(sorted(matched_keywords)) # 新增列(可以和方法一的结果对比) df_content['Keywords_regex'] = df_content['DESCRIPTION'].apply(match_with_regex)
这个方法也能得到相同的结果,缺点是对一些复杂变形(比如author和authorship)的匹配可能不如词干提取精准,但胜在无需额外依赖。
内容的提问来源于stack exchange,提问作者ssan
相关产品推荐
相关产品推荐

