基于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
相关产品推荐
相关产品推荐

