如何实现DataFrame列元素的模糊包含匹配并过滤数据
问题解决:筛选包含国家/地区相关词汇的推文数据
原代码存在的问题
- 逻辑倒置:原代码是删除包含国家名称的行,与需求(保留包含行、删除不包含行)完全相反
- 语法错误:
entry in tweets_df['text']无法正确判断每条文本是否包含指定词汇,需用Pandas的str.contains()系列方法 - 覆盖不全:只处理了
Country列,未用到globe_df中的Region数据 - 匹配能力不足:不支持大小写不敏感和词干匹配,无法识别
Ukrainian、british这类变体词汇
解决方案实现
步骤说明
- 合并国家和地区词汇,构建统一的匹配词库
- 对词汇和推文文本做词干提取、大小写归一化,实现模糊匹配
- 批量检查每条推文是否包含任意匹配词的词干变体,保留符合条件的行
完整代码
首先安装词干处理依赖:
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
相关产品推荐
相关产品推荐

