Penambangan data Pubmed dan Pubchem - database informasi medis dan biokimia

PubMed mewakili lebih dari 28 juta kutipan (abstrak dan judul) literatur biomedis dari jurnal sains kehidupan, buku online, dan MEDLINE. Kutipan juga dapat mencakup teks lengkap artikel. Permintaan khas pada senyawa alami diabetes tipe 2 yang dipublikasikan

Pubchem - database lebih dari 100 juta senyawa kimia dan 236 juta zat. Juga dalam database adalah hasil bioaktivitas dari 1,25 juta senyawa (misalnya, aktivitas senyawa melawan kanker atau penghambatan gen tertentu). Saat ini, sekitar 9 juta senyawa kimia organik (zat kompleks) diketahui. Bahan kimia anorganik bisa sangat banyak - mulai dari 10 ** 18

Pada artikel ini, saya akan memberikan contoh penyusunan daftar gen yang bertanggung jawab untuk prognosis buruk untuk kelangsungan hidup kanker dan kode pencarian untuk senyawa organik dan jumlah mereka di antara semua molekul kimia dari basis PubChem. Tidak akan ada pembelajaran mesin dalam artikel ini (pembelajaran mesin akan diperlukan dalam artikel berikutnya tentang biomarker diabetes, menentukan usia seseorang dengan ekspresi RNA, skrining untuk zat anti-kanker).

Untuk melanjutkan, kami akan menginstal paket python Biopython dan pubchempy yang diperlukan.

sudo conda install biopython pip install pubchempy 

PubMed


Kami akan menambang gen untuk ekspresi berlebih dan ekspresi kurang dalam kombinasi dengan prognosis kanker yang buruk - ini adalah seperti apa judul yang umum, permintaan untuk dipublikasikan dan gen target:

('Ekspresi DEK yang tinggi memprediksi prognosis adenokarsinoma lambung yang buruk.', 'Prognosis buruk DEK', 'DEK', 277, 15)

Mengapa ini diperlukan - efek farmakologis dari molekul dan kombinasinya pada target yang berhubungan dengan prognosis kanker yang buruk dapat dihitung dari gen. (Misalnya, berdasarkan pubchem atau LINCS).

Kami mengunggah file dengan nama gen (sekitar 12000): Github

 import csv genes=[]; with open('/Users/andrejeremcuk/Downloads/genes.txt', 'r') as fp : reader = csv.reader(fp, delimiter='\t') for i in range(20000): genes.append(reader.next()) import time import numpy as np genesq=np.genfromtxt('/Users/andrejeremcuk/Downloads/genesq.txt',dtype='str') 

Untuk permintaan ke pubmed, Anda harus menunjukkan email Anda:

 from Bio import Entrez from Bio import Medline MAX_COUNT = 100 Entrez.email = '*@yandex.ru' articles=[];genes_cancer_poor=[];genes_cancer_poor1=[]; 

Pertanyaan dan pemrosesan hasil:

 for u in range(0,len(genesq)): print u if u%100==0: np.savetxt('/Users/andrejeremcuk/Downloads/genes_cancer_poor.txt', genes_cancer_poor,fmt='%s'); np.savetxt('/Users/andrejeremcuk/Downloads/genes_cancer_poor1.txt', genes_cancer_poor1, fmt='%s') gene=genesq[u];genefullname=genes[u][2] TERM=gene+' '+'poor prognosis' try: h=Entrez.esearch(db='pubmed', retmax=MAX_COUNT, term=TERM) except: time.sleep(5);h=Entrez.esearch(db='pubmed', retmax=MAX_COUNT, term=TERM) result = Entrez.read(h) ids = result['IdList'] h = Entrez.efetch(db='pubmed', id=ids, rettype='medline', retmode='text') ret = Medline.parse(h) fer=[]; for re in ret: try: tr=re['TI']; except: tr='0'; fer.append(tr); 

Menemukan kata kunci dalam teks judul:

  for i in range(len(fer)): gene1=fer[i].find(gene) gene2=fer[i].find(genefullname) ##### inc=fer[i].find("Increased") highe=fer[i].find("High expression") high=fer[i].find("High") expr=fer[i].find("expression") Overe=fer[i].find("Overexpression") overe=fer[i].find("overexpression") up1=fer[i].find("Up-regulation") el1=fer[i].find("Elevated expression") expr1=fer[i].find("Expression of ") #### decr=fer[i].find("Decreased") loss=fer[i].find("Loss") low1=fer[i].find("Low expression") low2=fer[i].find("Low levels") down1=fer[i].find("Down-regulated") down2=fer[i].find("Down-regulated") down3=fer[i].find("Downregulation") ##### acc=fer[i].find("accelerates") poor=fer[i].find("poor patient prognosis") poor1=fer[i].find("poor prognosis") poor2=fer[i].find("unfavorable clinical outcomes") poor3=fer[i].find("unfavorable prognosis") poor4=fer[i].find("poor outcome") poor5=fer[i].find("poor survival") poor6=fer[i].find("poor patient survival") poor7=fer[i].find("progression and prognosis") ### canc=fer[i].find("cancer") canc1=fer[i].find("carcinoma") 

yang kami periksa urutannya dalam judul dan untuk kehadiran frasa yang paling umum.

  if (gene1!=-1)or(gene2!=-1): #<poor1,poor,poor2,poor3,poor4,poor5,poor6,poor7 if (canc1!=-1)or(canc!=-1): if (poor!=-1)or(poor1!=-1)or(poor2!=-1)or(poor3!=-1)or(poor4!=-1)or(poor5!=-1)or(poor6!=-1)or(poor7!=-1): # genel=-1; if (gene1!=-1): genel=gene1; if (gene2!=-1): genel=gene2; gene1=genel; if (expr!=-1): #<poor1,poor,poor2,poor3,poor4,poor5,poor6,poor7 if (gene1<expr): articles.append((fer[i],TERM,gene,u,i));genes_cancer_poor.append((gene,u,i,1)) if (low1!=-1)and(gene1!=-1): if (low1<gene1): articles.append((fer[i],TERM,gene,u,i));genes_cancer_poor.append((gene,u,i,2)) if (el1!=-1)and(gene1!=-1): if (el1<gene1): articles.append((fer[i],TERM,gene,u,i));genes_cancer_poor.append((gene,u,i,3)) if (Overe!=-1)and(gene1!=-1): if (Overe<gene1): articles.append((fer[i],TERM,gene,u,i));genes_cancer_poor.append((gene,u,i,4)) if (overe!=-1)and(gene1!=-1): articles.append((fer[i],TERM,gene,u,i));genes_cancer_poor.append((gene,u,i,5)) if (expr1!=-1)and(gene1!=-1): if (expr1<gene1): articles.append((fer[i],TERM,gene,u,i));genes_cancer_poor.append((gene,u,i,6)) if (up1!=-1)and(gene1!=-1): if (up1<gene1): articles.append((fer[i],TERM,gene,u,i));genes_cancer_poor.append((gene,u,i,7)) if (highe!=-1)and(gene1!=-1): if (highe<gene1): articles.append((fer[i],TERM,gene,u,i));genes_cancer_poor.append((gene,u,i,8)) if (high!=-1)and(gene1!=-1)and(expr!=-1): if (high<gene1<expr): articles.append((fer[i],TERM,gene,u,i));genes_cancer_poor.append((gene,u,i,9)) if (gene1!=-1)and(expr1!=-1): if (expr1<gene1): articles.append((fer[i],TERM,gene,u,i));genes_cancer_poor.append((gene,u,i,10)) if (gene1!=-1)and(inc!=-1): if (inc<gene1): articles.append((fer[i],TERM,gene,u,i));genes_cancer_poor.append((gene,u,i,11)) ########### if (gene1!=-1)and(decr!=-1): if (decr<gene1): articles.append((fer[i],TERM,gene,u,i,'low'));genes_cancer_poor1.append((gene,u,i,12)) if (gene1!=-1)and(loss!=-1): if (loss<gene1): articles.append((fer[i],TERM,gene,u,i,'low'));genes_cancer_poor1.append((gene,u,i,13)) if (gene1!=-1)and(low1!=-1): if (low1<gene1): articles.append((fer[i],TERM,gene,u,i,'low'));genes_cancer_poor1.append((gene,u,i,14)) if (gene1!=-1)and(low2!=-1): if (low2<gene1): articles.append((fer[i],TERM,gene,u,i,'low'));genes_cancer_poor1.append((gene,u,i,15)) if (gene1!=-1)and(down1!=-1): if (down1<gene1): articles.append((fer[i],TERM,gene,u,i,'low'));genes_cancer_poor1.append((gene,u,i,16)) if (gene1!=-1)and(down2!=-1): if (down2<gene1): articles.append((fer[i],TERM,gene,u,i,'low'));genes_cancer_poor1.append((gene,u,i,17)) if (gene1!=-1)and(down3!=-1): if (down3<gene1): articles.append((fer[i],TERM,gene,u,i,'low'));genes_cancer_poor1.append((gene,u,i,18)) 

Hasilnya, kami mendapatkan beberapa daftar: gen dengan ekspresi rendah dan tinggi dengan prognosis kanker yang buruk.

Secara total, ada 913 artikel dengan entri kata kunci dan frasa target.

PubChem


Basis data ini menyediakan dua cara untuk mengakses informasinya: melalui REST API dalam format json di mana permintaannya terlihat seperti ini:

https://pubchem.ncbi.nlm.nih.gov/rest/pug/compound/cid/2516/description/json

Adalah penting bahwa permintaan melalui jalur ini tidak boleh lebih dari 5 per detik, tetapi sejauh ini saya belum memeriksa batasnya, mereka harus menyimpan proxy.

Dan melalui perpustakaan pubchempy:

 import pubchempy as pcp c = pcp.Compound.from_cid(5090) c.canonical_smiles 

Paket API PUG REST yang diperlukan:

 import re import urllib, json, time import numpy as np 

Fungsi yang menghapus teks dari tag HTML:

 def cleanhtml(raw_html): cleanr = re.compile('<.*?>') cleantext = re.sub(cleanr, '', raw_html) return cleantext 

Dalam kode berikut, kami akan membuka deskripsi molekul dalam bahasa Inggris dari 1 hingga 100.000 angka di pubchem dan mencari petunjuk bahwa molekul ini bersifat organik (dari tanaman hewan atau sebagai bagian dari minuman), sementara itu tidak beracun atau karsinogenik.

 natural=[]; for i in range(1,100000): url = "https://pubchem.ncbi.nlm.nih.gov/rest/pug/compound/cid/"+str(i)+"/description/json" time.sleep(0.2) try: response = urllib.urlopen(url) except: time.sleep(12);response = urllib.urlopen(url) data = json.loads(response.read()) op=0;ol=0;ot=0; try: for u in range(1,len(data['InformationList']['Information'])): soup=str(data['InformationList']['Information'][u]['Description']) soup1=cleanhtml(soup) if (soup1.find('carcinogen')!=-1)or(soup1.find('death')!=-1)or(soup1.find('damage')!=-1): break; if (soup1.find('toxic')!=-1): break; if (soup1.find(' plant')!=-1)and(op!=9)and(soup1.find('planting')==-1): natural.append((i,'plant',str(data['InformationList']['Information'][0]['Title'])));op=9; if (soup1.find(' beverages')!=-1)and(ot!=9): natural.append((i,'beverages',str(data['InformationList']['Information'][0]['Title'])));ot=9; if (soup1.find(' animal')!=-1)and(ol!=9): natural.append((i,'animal',str(data['InformationList']['Information'][0]['Title'])));ol=9; except: ii=0; if i%100==0: print i;np.savetxt('/Users/andrejeremcuk/Downloads/natural.txt', natural,fmt='%s', delimiter='<') 

Untuk mencari referensi dalam teks instalasi, gunakan .find ('plant'). Pada akhirnya, simpan file dengan senyawa organik yang dihasilkan dan jumlahnya di PubChem.

β†’ Github

Source: https://habr.com/ru/post/id424271/


All Articles