본문 바로가기
연구관련/Bioinfo류

Pubmed eUtils 사용하기

by adnoctum 2010. 7. 2.

URL 을 이용하여 Pubmed 검색 결과를 얻을 수 있는 방법이 eUtils를 이용하는 것이다. 이것을 이용하면 EndNote 에서 Pubmed 검색 결과를 가져 오는 것을 직접 구현할 수 있다. 자세한 내용은 eUtils 홈페이지에 잘 나와 있다. 여기서는 몇 가지 예를 살펴 보고, 실제로 내가 사용하는 파이썬 스크립트를 올려 놓는다.

다음과 같이 URL 뒤에 적절한 조건을 넣어서 요청을 하면 eUtils 서버에서 결과를 돌려 준다.

search_text = 'TAK1[Text]';
search_address = 'http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&retmax=1000&term='+search_text.replace(' ','%20');
result = urlretrieve(search_address, 'pub_search_with_term.txt');
search_pmid = get_pmid_list('pub_search_with_term.txt');

이 때 눈여겨 보아야 할 것이 [search_address] 변수에 설정하는 URL의 parameter 이다. db로는 pubmed를 사용하고, retmax로 반환되는 결과의 수를 제한하고 있다. term 에 직접 검색에 사용할 검색어를 입력한다. 이 때, URL로 encoding할 때 검색어 중 공백(space)은 '%20'으로 변환해 주어야 결과가 제대로 나온다. 저렇게 하면 title이나 abstract에 TAK1 이 포함된 article의 PMID[각주:1]가 반환된다. 즉, eUtils 는 1. 적절한 조건으로 PMID set을 반환받고, 2. 각각의 PMID에 대한 기록을 다시 요청하여 반환받는 식으로 되어 있다. 위 코드에서는 반환받은 검색결과 파일에서 PMID를 뽑아 가는 함수가 get_pmid_list 로 나와 있다. 그 함수는 다음과 같이 생겼다.

def get_pmid_list(pubmed_search_result_file):
    if os.path.exists(pubmed_search_result_file) == False: return [];
    f = open(pubmed_search_result_file);
    pmid_list = [];
    for line in f:
        m = re.search('<Id>(.*?)</Id>',line);
        if m:
            pmid = m.group(1);
            pmid_list.append(pmid);
            continue;
        m = re.search('</IdList>', line);
        if m:
            break;
   
    return pmid_list;

검색 결과 파일은 xml 형식으로 되어 있는데, 난 작거나 간단한 xml 파일은 DOM이나 SAX를 이용하기 보다는 위처럼 생짜 parsing 을 해서 사용한다. 여하튼 위와 같이 받은 PMID 각각을 이용하여, 각 PMID에 대한 기록, 즉, 저자, 제목, abstract 등의 정보를 얻어 오기 위해서는 다음과 같은 주소 형식을 이용한다.

def fetch_article_information(PMID, dest_file_name):
    PMIDLink = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&id=";
    PMIDLink += PMID;
    PMIDLink += "&retmode=xml";
    urlretrieve(PMIDLink, dest_file_name);
    return 1;

예를 들면,

http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&id=19895789&retmode=xml

위 주소를 따라 가면 PMID 19895789 에 대한 기록이 xml 파일로 반환된다[각주:2]. (저건 내 석사 논문 ㅋㅋ). 여러 개의 PMID도 한꺼번에 요청하고 결과를 반환받을 수 있으니 여러 개의 결과는 한꺼번에 요청/반환받자. 또한, 기억이 가물가물하기는 한데, 대략 500 개 였나, 여하튼 URL 로 쓸 수 있는 문자열 길이의 제한 때문에 너무 많은 PMID에 대한 결과를 한번에 요청할 수 없었던 것 같다. 그래서 나는 50개의 PMID였나, 하여튼 몇 개씩 잘라서 요청했었던 듯.

여러 개의 PMID를 넣어서 xml 형태로 결과를 반환 받고, 그 xml 파일을 parsing 하기 편한 flat file로 변환하는 파이썬 스크립트를 첨부한다.


(음... 윈도우즈에서는 C++로도 사용하는 것이 있는데, 이 부분은 차차 정리하여 나중에 추가한다. 좀 방대한 프로그램의 일부로 들어가 있는 것이라서...)
  1. 각 article에 부여된 고유 번호. Pubmed에 있는 모든 article은 PMID를 반드시 갖고 있다. [본문으로]
  2. 확인 결과, internet explorer에서만 xml 형식으로 display 되고 오페라/크롬/파이어폭스에서는 flatfile 처럼 display 되었다. 그러나 위처럼 urlretrieve나 Windows의 경우 URLDownloadToFile API로 저장을 하면 xml 파일이다. [본문으로]

'연구관련 > Bioinfo류' 카테고리의 다른 글

R로 q-value 구하기  (1) 2010.10.20
dense subgraph 찾아내기(MCODE)  (5) 2010.07.25
정규화(normalization)  (18) 2010.04.19
drug 관련 싸이트  (0) 2010.04.06
생물정보학(bioinformatics)에 대하여  (3) 2010.01.12