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

如何实现DataFrame列元素的模糊包含匹配并过滤数据

问题解决:筛选包含国家/地区相关词汇的推文数据

原代码存在的问题

  • 逻辑倒置:原代码是删除包含国家名称的行,与需求(保留包含行、删除不包含行)完全相反
  • 语法错误:entry in tweets_df['text'] 无法正确判断每条文本是否包含指定词汇,需用Pandas的str.contains()系列方法
  • 覆盖不全:只处理了Country列,未用到globe_df中的Region数据
  • 匹配能力不足:不支持大小写不敏感和词干匹配,无法识别Ukrainian、british这类变体词汇

解决方案实现

步骤说明

  1. 合并国家和地区词汇,构建统一的匹配词库
  2. 对词汇和推文文本做词干提取、大小写归一化,实现模糊匹配
  3. 批量检查每条推文是否包含任意匹配词的词干变体,保留符合条件的行

完整代码

首先安装词干处理依赖:

pip install nltk

处理代码如下:

import pandas as pd
from nltk.stem import PorterStemmer
import nltk

# 首次运行下载nltk分词资源
nltk.download('punkt')

# 初始化词干提取器
stemmer = PorterStemmer()

# 读取数据
globe_df = pd.read_csv('countriesAndRegions.csv')
tweets_df = pd.read_csv('tweetSheet.csv')

# 1. 构建词干化的匹配词库:合并国家、地区,去重后提取词干
def get_stemmed_words(series):
    stemmed_set = set()
    # 处理空值,转小写后拆分词汇提取词干
    for term in series.dropna().str.lower():
        for token in nltk.word_tokenize(term):
            stemmed_set.add(stemmer.stem(token))
    return stemmed_set

# 合并国家和地区的词干集合
country_stems = get_stemmed_words(globe_df['Country'])
region_stems = get_stemmed_words(globe_df['Region'])
all_match_stems = country_stems.union(region_stems)

# 2. 定义检查函数:判断推文词干是否与匹配词干有交集
def has_match_stem(text):
    if pd.isna(text):
        return False
    # 文本转小写、分词、提取词干
    text_stems = {stemmer.stem(token) for token in nltk.word_tokenize(text.lower())}
    # 检查是否存在匹配词干
    return len(text_stems & all_match_stems) > 0

# 3. 筛选保留符合条件的推文
tweets_df = tweets_df[tweets_df['text'].apply(has_match_stem)]

print(tweets_df)

代码细节说明

  • 词干匹配:用PorterStemmer将词汇统一为词干形式,比如Ukrainian→ukrain、Britain→britain,实现变体词汇的匹配;若需要更精准的词形还原,可替换为WordNetLemmatizer
  • 大小写兼容:所有文本统一转小写后处理,避免大小写差异导致的匹配失败
  • 高效批量处理:用apply批量检查所有推文,替代循环遍历的低效写法
  • 多词名称支持:对United States这类多词的国家/地区名称,拆分后分别提取词干,确保部分词汇匹配也能被识别

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 17:55:30