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

如何在R中从FDA药品标签XML文件提取独立句子?

解决DailyMed药品标签XML文本拼接导致句子无空格的问题

问题背景

我正在解析FDA药品标签(通过DailyMed API),需要在R语言中从数千份标签里定位特定关键词,并提取关键词所在的独立句子。当前做法是定位目标高层节点后用xml_text()提取文本,再通过str_split(chunk_of_text, pattern=boundary("sentence"))拆分句子,但存在句子间无空格的问题(例如"Sentence oneSentence two"或"Sentence one.Sentence two.")——这是因为xml_text()会直接拼接所有节点文本,而章节标题、段落前后常缺失空格。尝试将"."替换为". "会破坏带小数点的数字,跳过XML解析又无法准确定位特定标签。

需要实现的目标:从指定XML节点路径提取所有文本时,生成带空格分隔的内容,无需保留XML结构,只需得到独立句子/标题短语用于关键词检索。

解决方案

方法1:提取所有子文本节点并拼接(推荐)

通过XPath定位目标节点下的所有纯文本子节点(//text()),提取每个节点的内容后过滤空文本,再用空格拼接,避免原始文本片段直接粘连。

library(xml2)

# 读取XML文档(替换为你的API返回内容或本地XML路径)
xml_doc <- read_xml("your_target_xml.xml")

# 定位目标节点下的所有文本子节点(调整XPath匹配你的需求,比如//section//text())
target_text_nodes <- xml_find_all(xml_doc, "//section//text()")

# 过滤空文本并拼接成带空格的完整字符串
clean_text <- paste(
  xml_text(target_text_nodes)[xml_text(target_text_nodes) != ""],
  collapse = " "
)

# 拆分句子
list_of_sentences <- str_split(clean_text, pattern=boundary("sentence"))

方法2:智能修复缺失空格的句号

如果已经有拼接好的文本,可以用正则表达式精准替换需要补空格的句号,避开带小数点的数字。

library(stringr)

# 假设chunk_of_text是已提取的拼接文本
# 仅对"后面不是数字/已有空格、前面不是数字"的句号补空格
cleaned_chunk <- gsub(
  "(?<!\\d)\\.(?!\\d|\\s)", 
  ". ", 
  chunk_of_text, 
  perl = TRUE
)

# 拆分句子
list_of_sentences <- str_split(cleaned_chunk, pattern=boundary("sentence"))

正则说明:

  • (?<!\\d):负向后断言,确保句号前不是数字(避开小数点)
  • \\.(?!\\d|\\s):负向前断言,确保句号后不是数字或已有空格(只补缺失空格的情况)

方法3:按节点类型提取后合并

如果需要区分标题和段落,可以分别提取不同类型的节点文本,再用空格拼接,确保不同模块间的分隔:

library(xml2)
library(stringr)

xml_doc <- read_xml("your_target_xml.xml")

# 提取标题和段落文本
titles <- xml_text(xml_find_all(xml_doc, "//title"))
paragraphs <- xml_text(xml_find_all(xml_doc, "//paragraph"))

# 合并所有内容,每个模块间加空格
combined_text <- paste(c(titles, paragraphs), collapse = " ")

# 拆分句子
list_of_sentences <- str_split(combined_text, pattern=boundary("sentence"))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 12:25:30