Python 利用Entrez庫(kù)篩選下載PubMed文獻(xiàn)摘要的示例
作者:xiaolanLin
聲明 :本文版權(quán)歸作者和博客園共有,來(lái)源網(wǎng)址:https://www.cnblogs.com/xiaolan-Lin
一個(gè)不是學(xué)生物的孩子來(lái)搞生物,當(dāng)真是變成了一塊廢鐵啊,但也是讓我體會(huì)到了一把生物信息的力量。
廢話不多說(shuō),開(kāi)整!
任務(wù):快速高效從PubMed上下載滿足條件的文獻(xiàn)PMID、標(biāo)題(TI)、摘要(AB)。
PubMed官網(wǎng) https://pubmed.ncbi.nlm.nih.gov
此處有幾種選擇可以達(dá)到目的:
(1)官網(wǎng)上匹配篩選條件(注:匹配快速,但是下載下來(lái)的數(shù)量受到限制,每次只能下載10000條數(shù)據(jù),甚至更少。)
可以看到,我需要的數(shù)據(jù)是有三十多萬(wàn)條,但是每次只能下載10000條,那我豈不是要手動(dòng)n次。。很明顯,在大批量下載文獻(xiàn)的情況下,官網(wǎng)不是很友好。
(2)R語(yǔ)言有個(gè)R包,叫做easyPubMed,這里我也給大家貼上學(xué)習(xí)指南(https://cran.r-project.org/web/packages/easyPubMed/vignettes/getting_started_with_easyPubMed.html)
由于我不喜歡用R寫代碼,所以我寫一半還是換了Python,熟練R的小伙伴可以自行根據(jù)指南走通需求。
(3)重量級(jí)庫(kù)來(lái)了,Python自帶的Bio包中的Entrez檢索庫(kù),簡(jiǎn)直就是我的救星,以下是我的代碼:
注:Entrez在Bio包中,Bio的安裝請(qǐng)移步 https://www.cnblogs.com/xiaolan-Lin/p/14023147.html
import numpy as np from Bio import Medline, Entrez # 一般是通過(guò)BioPython的Bio.Entrez模塊訪問(wèn)Entrez from collections import Counter Entrez.email = '(此處寫你自己在官網(wǎng)注冊(cè)的郵箱賬號(hào))' # 應(yīng)用自己的賬號(hào)訪問(wèn)NCBI數(shù)據(jù)庫(kù) # 此處需將服務(wù)器協(xié)議指定為1.0,否則會(huì)出現(xiàn)報(bào)錯(cuò)。http.client.IncompleteRead: IncompleteRead(0 bytes read) # 服務(wù)器http協(xié)議1.0,而python的是1.1,解決辦法就是指定客戶端http協(xié)議版本 import http.client http.client.HTTPConnection._http_vsn = 10 http.client.HTTPConnection._http_vsn_str = ’HTTP/1.0’ ''' Entrez 是一個(gè)檢索系統(tǒng),可以用其訪問(wèn)NCBI數(shù)據(jù)庫(kù),比如說(shuō)PubMed,GenBank,GEO等。 獲得有關(guān) global PBDE 的所有文獻(xiàn)的PubMed IDs ''' # handle_0 = Entrez.esearch(db='pubmed', term='drug therapy[Subheading] AND adverse effects[Subheading] AND humans[MeSH Terms]', retmax=306431) handle_0 = Entrez.esearch(db='pubmed', term='drug therapy[MeSH Subheading] AND adverse effects[MeSH Subheading] AND humans[MeSH Terms] AND (2000/01/01[Date - Publication] : 2021/12/31[Date - Publication])', ptyp='Review', usehistory='y', retmax=306431) record = Entrez.read(handle_0) # 獲取檢索條件的所有文獻(xiàn) idlist = record['IdList'] # 提取出文獻(xiàn)id print ('Total: ', record['Count']) No_Papers = len(idlist) # 共306431篇文獻(xiàn) 2000-01-01:2021-12-31 webenv = record[’WebEnv’] query_key = record[’QueryKey’] total = No_Papers step = 1300 print('Result items:', total) with open('./Data_PubMed/PBDE1.txt', ’w’) as f: for start in range(0, total, step): print('Download record %i to %i' % (start + 1, int(start + step))) handle_1 = Entrez.efetch(db='pubmed', retstart=start, rettype='medline', retmode='text', retmax=step, webenv=webenv, query_key=query_key) # 獲取上述所有文獻(xiàn)的PubMed IDs records = Medline.parse(handle_1) records = list(records) # 將迭代器轉(zhuǎn)換至列表(list) for index in np.arange(len(records)): id = records[index].get('PMID', '?') title = records[index].get('TI', '?') title = title.replace(’[’, ’’).replace(’].’, ’’) # 若提取的標(biāo)題出現(xiàn)[].符號(hào),則去除 abstract = records[index].get('AB', '?') f.write(id) f.write('n') f.write(title) f.write('n') f.write(abstract) f.write('n')
話不多說(shuō),結(jié)果跑出來(lái)了我真的很快樂(lè)~
最后的結(jié)果是存放在txt文件中,大伙兒根據(jù)自己的需求改變代碼所需字段啊。
現(xiàn)在我來(lái)解釋一下,我貼上的這串代碼的實(shí)現(xiàn)原理,首先是通過(guò)Entrez檢索到符合我篩選條件的文獻(xiàn),里邊的限制條件包括了幾個(gè)詞匯匹配以及時(shí)間限制,時(shí)間我限制在了2000年1月1日到2021年的12月31日(這里的時(shí)間我選用的是Date - Publication,時(shí)間選取Date - Completion、Date - Modification還是Date - Publication其實(shí)還是有爭(zhēng)議的,大家自行考慮選取)。
Entrez.esearch的作用就是用來(lái)檢索的,里邊的參數(shù)db指向你要檢索的數(shù)據(jù)庫(kù),代碼中的注釋也寫了,Entrez作為一個(gè)接口檢索,除了能夠檢索PubMed中的文獻(xiàn),也能去到別的數(shù)據(jù)庫(kù)檢索文獻(xiàn);term是寫你的篩選語(yǔ)句,注意你寫的檢索語(yǔ)句不能帶有引號(hào),單引號(hào)也不行,否則會(huì)檢索不到,如果不知道檢索語(yǔ)句怎么寫,或者是不知道字段是否被定義,可以在官網(wǎng)的檢索那里https://pubmed.ncbi.nlm.nih.gov/advanced/選擇字段輸入內(nèi)容自動(dòng)生成query,但是生成的語(yǔ)句是不太智能的,會(huì)有很多括號(hào)是你不需要的,自己寫代碼的時(shí)候要適當(dāng)去掉;ptyp我這里用的是Review,usehistory是y,意思是后邊我的檢索要記住這個(gè)語(yǔ)句,根據(jù)歷史查詢來(lái)檢索;retmax如果不進(jìn)行設(shè)置的話,默認(rèn)給你的最大數(shù)據(jù)量好像是只有1000,我要的檢索內(nèi)容是超過(guò)這個(gè)值的,因此我需要自定義檢索的數(shù)量。
Entrez.read是對(duì)Entrez.esearch檢索到的內(nèi)容進(jìn)行讀取,里邊包含了9種元素,我們主要是想從中得到文獻(xiàn)的id號(hào),只有拿到了文獻(xiàn)的id號(hào),我們后面進(jìn)行摘要的提取才能準(zhǔn)確定位。
最后是循環(huán)當(dāng)中步長(zhǎng)的設(shè)置,這里就要根據(jù)自己的需求來(lái)定義了,包括內(nèi)容的提取,因?yàn)槲抑恍枰狿MID、標(biāo)題(TI)、摘要(AB),所以我就沒(méi)有加載別的內(nèi)容進(jìn)來(lái),這里也有一點(diǎn)要注意,標(biāo)題下載下來(lái)是大部分帶有[ ].的,方便操作我直接就在下載的時(shí)候給去除了,這也是上面replace代碼的由來(lái)。
附上我參考的鏈接,如果我這篇文章解決不了你的問(wèn)題,那么希望下面的渠道能夠幫助到你
https://zhuanlan.zhihu.com/p/54611852
https://zhuanlan.zhihu.com/p/262957260
以上就是Python 利用Entrez庫(kù)篩選下載PubMed文獻(xiàn)摘要的示例的詳細(xì)內(nèi)容,更多關(guān)于Python Entrez庫(kù)下載PubMed文獻(xiàn)的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. Android實(shí)現(xiàn)動(dòng)態(tài)改變shape.xml中圖形的顏色2. Android中的緩存3. Vue實(shí)現(xiàn)div滾輪放大縮小4. PHP擴(kuò)展之APC——Alternative PHP Cache(可選PHP緩存)5. APP啟動(dòng)慢怎么辦,Android官方這樣說(shuō)6. android RecycleView實(shí)現(xiàn)多級(jí)樹(shù)形列表7. Android基于OpenCV實(shí)現(xiàn)圖像修復(fù)8. 解決Android Studio日志太長(zhǎng)或滾動(dòng)太快問(wèn)題9. VUE實(shí)時(shí)監(jiān)聽(tīng)元素距離頂部高度的操作10. 如何從外部瀏覽開(kāi)啟Android App
