如何在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
相关产品推荐
相关产品推荐

