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

基于R(spaCy)实体识别匹配实体与个体:国会议员NAFTA提及统计及党派关联实现问询

基于R(spaCy)实体识别匹配实体与个体:国会议员NAFTA提及统计及党派关联实现问询

嘿,你已经做了不少前期工作啦!针对你要统计国会议员提及NAFTA的次数并关联党派的需求,咱们可以一步步调整代码来实现~

首先得明确核心目标:咱们需要从议会辩论文本里精准识别三类关键信息——国会议员姓名、NAFTA、党派缩写(WP/PRD/PAN),然后把这三者关联起来,最终统计每位议员提及NAFTA的占比。

从你给出的parsed_texts示例来看,默认的spaCy模型还没精准识别出议员姓名和党派,毕竟en_core_web_sm是通用模型,对议会这类特定领域的实体支持有限。下面是具体的优化步骤:

第一步:自定义实体匹配规则,精准识别党派和NAFTA

我们可以给spaCy添加自定义匹配器,专门标记出党派缩写和NAFTA,弥补默认模型的不足:

library(spacyr)
library(dplyr)
library(stringr)

# 重新初始化spaCy(如果之前没启动的话)
spacy_initialize(model = "en_core_web_sm")

# 创建自定义匹配器
matcher <- spacy$matcher

# 添加党派匹配规则:识别WP/PRD/PAN,标记为PARTY实体
matcher$add("PARTY", list(list(list("LOWER" = "wp"))))
matcher$add("PARTY", list(list(list("LOWER" = "prd"))))
matcher$add("PARTY", list(list(list("LOWER" = "pan"))))

# 添加NAFTA匹配规则:标记为NAFTA实体
matcher$add("NAFTA", list(list(list("LOWER" = "nafta"))))

# 用自定义匹配器重新解析PDF文本
parsed_texts_custom <- spacy_parse(pdf_texts, entity = TRUE, matcher = matcher)

第二步:关联议员姓名、NAFTA与党派

议会辩论的文本通常有固定格式,比如议员发言前会标注姓名和党派(类似「Rafael (WP): [发言内容]」)。我们可以利用上下文把这三类信息关联起来:

# 先提取所有关键实体:PERSON(议员姓名)、PARTY(党派)、NAFTA
key_entities <- parsed_texts_custom %>%
  filter(entity %in% c("PERSON", "PARTY", "NAFTA")) %>%
  select(doc_id, sentence_id, token, entity)

# 关联每个NAFTA提及对应的议员和党派
# 逻辑:同一文档+相近句子里的PERSON和PARTY配对,再关联同段落的NAFTA
nfta_mentions <- key_entities %>%
  group_by(doc_id, sentence_id) %>%
  mutate(
    # 提取当前句子里的党派
    political_affiliation = ifelse(entity == "PARTY", token, NA),
    political_affiliation = first(na.omit(political_affiliation)),
    # 提取当前句子里的议员姓名
    congress_member = ifelse(entity == "PERSON", token, NA),
    congress_member = first(na.omit(congress_member))
  ) %>%
  filter(entity == "NAFTA") %>%
  ungroup() %>%
  select(congress_member, political_affiliation) %>%
  na.omit() # 去掉没有匹配到姓名或党派的无效记录

第三步:统计每位议员的NAFTA提及占比

最后我们就可以统计次数和占比,得到你想要的结果格式:

# 计算NAFTA总提及次数
total_nafta_mentions <- nrow(nfta_mentions)

# 统计每位议员的提及情况及占比
final_stats <- nfta_mentions %>%
  group_by(congress_member, political_affiliation) %>%
  summarise(mention_count = n()) %>%
  mutate(
    congress_member_share_of_NAFTA_mentions = paste0(round((mention_count / total_nafta_mentions)*100, 1), "%")
  ) %>%
  arrange(desc(mention_count))

# 查看最终结果
print(final_stats)

小Tips提升效果

  • 如果默认模型识别议员姓名不准,可以用你手头的议会数据标注一批样本,训练一个自定义的spaCy实体识别模型,这样识别精度会更高。
  • 处理PDF文本时,先清理多余的空格和换行,能减少干扰:
pdf_texts_clean <- lapply(pdf_texts, str_squish) %>% unlist()

备注:内容来源于stack exchange,提问作者nesta1990

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 12:04:39