基于字符串检测为推特数据集批量匹配填充政客名称列的技术求助
解决推特数据集多政客名称匹配问题
我来帮你搞定这个多政客匹配的需求,你之前遇到的核心问题有两个:一是正则模式的使用方式不对,二是多次赋值导致之前匹配到的政客数据被覆盖。下面是一套扩展性强、结果准确的解决方案:
步骤1:构建政客别名-正式名称映射表
首先我们创建一个结构化的映射表,把每个政客的所有别名(昵称、全名、简称)对应到统一的正式名称,这样后续新增或修改政客信息会非常方便:
library(tidyverse) # 加载你的推特数据集(注意你原代码里写的是users,应该是tweets?这里按需求调整) tweets <- read_csv("http://nodeassets.nbcnews.com/russian-twitter-trolls/users.csv") # 构建政客别名映射表,可随时添加新政客 politician_map <- tribble( ~alias, ~official_name, "Hillary Clinton", "Clinton", "Hillary", "Clinton", "Clinton", "Clinton", "Donald Trump", "Trump", "Donald", "Trump", "Trump", "Trump", "Barack Obama", "Obama", "Barack", "Obama", "Obama", "Obama", "Bernie Sanders", "Sanders", "Bernie", "Sanders", "Sanders", "Sanders" )
步骤2:生成优化的正则匹配模式
这里要注意一个细节:优先匹配长别名(比如先匹配"Hillary Clinton",再匹配"Clinton"),避免出现把全名拆成简称匹配的错误。我们先对别名按长度降序排序,再合并成正则表达式:
# 按别名长度从长到短排序,确保全名先被匹配 sorted_aliases <- politician_map %>% arrange(desc(str_length(alias))) %>% pull(alias) %>% str_c(collapse = "|") # 合并成正则匹配模式
步骤3:提取匹配结果并映射到正式名称
用str_extract提取每条推文里第一个匹配到的政客别名,再通过左连接映射到正式名称,最后生成party列:
tweets_with_party <- tweets %>% # 提取第一个匹配的政客别名 mutate(matched_alias = str_extract(text, sorted_aliases)) %>% # 映射到正式名称 left_join(politician_map, by = c("matched_alias" = "alias")) %>% # 重命名为你需要的party列,无匹配则设为NA rename(party = official_name) %>% mutate(party = replace_na(party, NA))
处理一条推文提及多个政客的情况
如果你的需求是保留所有被提及的政客(而不是只取第一个),可以用str_extract_all结合unnest把每条拆分成多行:
tweets_multi_party <- tweets %>% # 提取所有匹配的政客别名 mutate(matched_aliases = str_extract_all(text, sorted_aliases)) %>% # 把多个匹配项拆分成单独行 unnest(matched_aliases) %>% # 映射到正式名称 left_join(politician_map, by = c("matched_aliases" = "alias")) %>% rename(party = official_name)
为什么你之前的代码出问题了?
- 正则模式错误:你直接用
str_detect(text, politicians)时,str_detect会把向量形式的pattern循环应用到每条推文,而不是同时匹配所有模式。正确的做法是把所有模式合并成一个用|分隔的正则表达式。 - 赋值覆盖问题:你多次用
grepl赋值后修改politician列,后面的赋值会覆盖前面的结果——比如一条同时提到Clinton和Trump的推文,最后会被标记成Trump,而漏掉Clinton,这也是你统计结果远低于实际提及数的原因。
验证结果
你可以用下面的代码统计每个政客的提及次数:
tweets_with_party %>% filter(!is.na(party)) %>% count(party, sort = TRUE)
内容的提问来源于stack exchange,提问作者alex_stephenson
相关产品推荐
相关产品推荐

