使用 BioPython 从 PubMed 中提取摘要并写入 CSV

问题描述 投票:0回答:1

我对 python 很陌生,想使用 bio entrez 包从 pubmed 中提取摘要。我可以根据给定的 ID 列表获取摘要并写入 csv。 我的代码是:

papers = fetch_details(chunk)
  for i, paper in enumerate (papers['PubmedArticle']):
    title_list.append(paper['MedlineCitation']['Article']['ArticleTitle'])
    try:
      abstract_list.append(paper['MedlineCitation']['Article']['Abstract']['AbstractText'])
    except:
      abstract_list.append('No Abstract')

但是,如果摘要包含多个段落,例如“目的/目标、方法、结果、结论”,则摘要如下所示:

[StringElement('布鲁顿酪氨酸激酶 (BTK) 是 B 细胞受体信号传导,对细胞增殖至关重要。 Acalabrutinib 是一种选择性共价 BTK 抑制剂,最近获得 加速批准复发/难治性套细胞淋巴瘤。 该分析表征了群体药代动力学 (PK) acalabrutinib 及其代谢物 ACP-5862。', attribute={'Label': 'INTRODUCTION'}), StringElement('数据从六个阶段获得 成人 B 细胞恶性肿瘤患者的 I/II 试验和 7 项 I 期试验 在健康志愿者中进行的试验。汇总剂量浓度-时间数据 浓度范围从 15 到 400\xa0mg,使用非线性分析 混合效应建模。基础模型参数随身体缩放 重量并标准化为 70\xa0kg(固定指数:0.75 和 1 分别为间隙和体积)。完整的协变量方法是 用于评估剂量、健康群体/疾病的任何相关影响 状况、肝肾功能损害、使用酸还原剂、 种族和性别。', attribute={'Label': 'METHODS'}), StringElement('A 总共 11,196 个 acalabrutinib 和 1068 个 ACP-5862 浓度-时间 已有样品。两种分析物的 PK 都有很好的描述 使用两室处置模型。 Acalabrutinib 吸收率为 使用连续的零阶和一阶常数以及 时差。 acalabrutinib 的表观清除率 (CL/F) 为 169 L/h (95% CI 159-175)。相对于100\xa0mg剂量组,15和 400\xa0mg剂量组显示高1.44倍和低0.77倍 分别为 CL/F。 ACP-5862 的清除率为 21.9 L/h(95% CI 19.5-24.0)。代谢分数固定为 0.4。中央和外周分布容积为 33.1 L (95% CI 24.4-41.0) acalabrutinib 为 226 L (95% CI 149-305),38.5\xa0L (95% CI ACP-5862 为 31.6-49.2) 和 38.4 L (95% CI 32.3-47.9)。所研究的协变量均未导致临床上有意义的变化 ', attribute={'Label': 'RESULTS'}), StringElement('PK acalabrutinib 及其代谢物 ACP-5862 充分 特点。 Acalabrutinib CL/F 随着剂量的增加而降低,但 在 75-250\xa0mg 范围内趋势较小。无需调整剂量 对于内在或外在协变量是必要的。', 属性={'标签': '结论'})]

其格式为:

[StringElement('',attributes={'Label':'INTRODUCTION'})]

如何获取没有结构格式的文本?

谢谢, 婷

python abstract biopython pubmed
1个回答
0
投票

要从摘要中提取不带结构格式的文本,可以将 StringElement 对象转换为常规字符串。请务必将“[电子邮件受保护]”替换为您的 Entrez 实际电子邮件地址。您可以通过以下方式修改代码来实现此目的: 从 Bio 导入 Entrez 导入 csv

# Function to fetch abstracts from PubMed
def fetch_abstracts(id_list):
    Entrez.email = "[email protected]"  # Enter your email here
    handle = Entrez.efetch(db="pubmed", id=id_list, retmode="xml")
    records = Entrez.read(handle)
    return records

# Example ID list
id_list = ["12345678", "23456789"]  # Replace with your actual IDs

# Fetch abstracts
records = fetch_abstracts(id_list)

# Extract abstracts and write to CSV
with open("abstracts.csv", "w", newline="", encoding="utf-8") as csvfile:
    fieldnames = ["Title", "Abstract"]
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()

    for paper in records["PubmedArticle"]:
        title = paper["MedlineCitation"]["Article"]["ArticleTitle"]

        try:
            # Extract abstract text
            abstract_elements = paper["MedlineCitation"]["Article"]["Abstract"]["AbstractText"]
            if isinstance(abstract_elements, list):
                abstract = "\n".join([str(element) for element in abstract_elements])
            else:
                abstract = str(abstract_elements)
        except KeyError:
            abstract = "No Abstract"

        # Write to CSV
        writer.writerow({"Title": title, "Abstract": abstract})

print("Abstracts extracted and saved to abstracts.csv")
© www.soinside.com 2019 - 2024. All rights reserved.