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

求助:如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:09:26