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

基于字符串检测为推特数据集批量匹配填充政客名称列的技术求助

解决推特数据集多政客名称匹配问题

我来帮你搞定这个多政客匹配的需求,你之前遇到的核心问题有两个:一是正则模式的使用方式不对,二是多次赋值导致之前匹配到的政客数据被覆盖。下面是一套扩展性强、结果准确的解决方案:

步骤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)

为什么你之前的代码出问题了?

  1. 正则模式错误:你直接用str_detect(text, politicians)时,str_detect会把向量形式的pattern循环应用到每条推文,而不是同时匹配所有模式。正确的做法是把所有模式合并成一个用|分隔的正则表达式。
  2. 赋值覆盖问题:你多次用grepl赋值后修改politician列,后面的赋值会覆盖前面的结果——比如一条同时提到Clinton和Trump的推文,最后会被标记成Trump,而漏掉Clinton,这也是你统计结果远低于实际提及数的原因。

验证结果

你可以用下面的代码统计每个政客的提及次数:

tweets_with_party %>%
  filter(!is.na(party)) %>%
  count(party, sort = TRUE)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:13:21