当我们做细胞注释时,最头疼的就是细胞亚型注释。常见的几个亚型还好,但有的时候我们想知道这类细胞还有哪些别的亚型,或许这些亚型更符合自己目前的发现。结果我们在各种网站上搜,东凑凑西凑凑可能也凑不全,还花了不少时间精力。那有没有效率点的方法呢?
想要知道细胞亚型有哪些,我们当然还是看PubMed了。但问题在于,我们如果在PubMed中直接搜索相关关键词,比如:macrophage[tiab] AND (single cell[tiab] OR scRNA[tiab]) ,直接给你蹦出上万篇文献,这得看到猴年马月啊...那咋办呢?那肯定只能让机器来替你“读文献”呐。不过咱不用上LLM,有点杀鸡用牛刀的感觉了。直接写个简单的python脚本即可。
思路很简单,我们的需求是从PubMed中先检索相关信息,然后直接用正则表达式提取相关语句中的内容,进而得到最终的结果。我们想象一下如果我们自己从文献中获取相关的信息,我们是先打开这篇文献的摘要看看,然后直接看有没有xxx+ 细胞。这个操作让机器来做就是:1. 获取摘要;2. 通过你设置的正则表达式在摘要中搜索;3. 记录相关信息。知道这个操作了,代码就好写了:
from Bio import Entrez, Medline
import re
import pandas as pd
import time
from tqdm import tqdm
Entrez.email = "你的邮箱"
query = '"macrophage"[Title/Abstract] AND ("2020/01/01"[PDAT] : "2025/12/31"[PDAT]) AND (single cell[tiab] OR single-cell[tiab] OR scRNA[tiab])'
handle = Entrez.esearch(db="pubmed", term=query, retmax=10000)
record = Entrez.read(handle)
ids = record["IdList"]
print(f"共找到 {len(ids)} 篇含有macrophage的文献")
batch_size = 200
results = []
for i in tqdm(range(0, len(ids), batch_size)):
id_batch = ids[i:i + batch_size]
handle = Entrez.efetch(db="pubmed", id=",".join(id_batch),
rettype="medline", retmode="text")
records = Medline.parse(handle)
for rec in records:
pmid = rec.get("PMID", "")
title = rec.get("TI", "")
abstract = rec.get("AB", "")
text = f"{title}. {abstract}"
journal = rec.get("JT", "")
year = rec.get("DP", "").split(" ")[0]
# 按句切分
sentences = re.split(r'(?<=[.!?])\s+', text)
for sent in sentences:
matches = re.findall(r'\b([A-Z0-9\-]{2,10})\s*\+\s*macrophage', sent)
if matches:
for m in matches:
results.append({
"PMID": pmid,
"Year": year,
"Journal": journal,
"Title": title,
"Marker": m,
"Sentence": sent.strip()
})
handle.close()
time.sleep(0.5)
# 保存结果
df = pd.DataFrame(results)
df = df.drop_duplicates()
df.to_csv("macrophage_marker_sentences_2020_2025.csv", index=False)
print(f"共提取 {len(df)} 条句子,涉及 {df['Marker'].nunique()} 个不同marker。")
print(df.head(10))
以上这个示例代码非常通用,你还可以自己修改query搜索关键词内容进行更精细化的搜索。总之,只需几行 Python 代码,就能让 PubMed 自动帮你整理出所有被命名过的细胞亚型,既高效又系统。
苏公网安备 32050602011302号