2011년 1월 31일 월요일

원소기호 모으기

매스매티카를 만든 울프램 사가 선보인 울프램알파는 여느 검색엔진과는 달리 계산 가능한 검색결과를 내놓는다. 즉, 연구에 필요한 자료를 쓰기 좋은 형태로 제공해 준다. 이점을 원소기호로 이루어진 가장 긴 단어를 찾는 파이썬 프로그램의 원소기호 목록을 울프램알파에서 받아오도록 바꿔보자.

울프램알파 API의 2.0 버전은 개인에 한해 무료로 공개되어 있다. 몇몇 제약이 있긴 하지만, 울프램알파 API를 체험해 보기엔 충분해 보인다. 울프램알파 API를 상용하려면 먼저 울프램알파에 계정을 만들고, AppID를 발급받아야 한다. 프로그램마다 별도의 AppID를 발급받아야 하며, 30개까지 발급받을 수 있다.

울프램알파 API는 파이썬, 자바 등 다양한 언어에 대한 바인딩도 제공하지만, 별도의 설치과정이 필요없는 웹서비스를 사용해보자. 울프램알파에서 검색에서 원소기호의 목록을 얻을 수 있는 검색어는 elements symbol이다.

울프램알파의 원소기호 검색 결과

몇몇 옵션으로 검색 결과에 제한을 두어 검색 결과를 더 간단하게 받을 수 있다. 먼저, 우리는 검색 결과를 웹브라우저를 통해 볼 것이 아니므로, html 형식으로 받을 필요가 없다. 또한 Input interpretation, Result, Table 등의 팟 중에서 Result만 필요하다. 이러한 옵션을 포함한 URL은 다음과 같다. xxx 부분에는 발급받은 AppID를 넣는다.

http://api.wolframalpha.com/v2/query?appid=xxx&input=elements%20symbol&format=plaintext&scanner=Identity&includepodid=Result

이 URL을 웹 브라우저에 한 번 넣어보자.

울프램알파 API를 이용한 원소기호 질의 결과

결과를 보면, 원하는 정보가 없다. 대신 recalculate라는 항목이 보인다. 이유를 알 수는 없지만, 울프램알파는 바로 원소기호를 알려주지 않고 별도의 파일에 결과를 기록한 후, 이 파일의 위치를 알려준다. 이 값을 다시 웹브라우저로 열어보자.

울프램알파 API를 이용한 원소기호 질의 결과

이제야 원하는 결과가 나왔다. plaintext 항목의 값이 우리가 원하는 원소기호이다. 이걸 이용하는 파이썬 코드는 아래와 같다.
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import urllib, sys
from xml.dom.minidom import parse

url = 'http://api.wolframalpha.com/v2/\
query?appid=xxx\
&input=elements%20symbol&format=plaintext&\
scanner=Identity&includepodid=Result'

try:
   f = urllib.urlopen(url)
   dom = parse(f)
   queryresult = dom.getElementsByTagName('queryresult')
   recalculate = queryresult[0].getAttribute('recalculate')
   
   f2 = urllib.urlopen(recalculate)
   dom2 = parse(f2)
   plaintext = dom2.getElementsByTagName('plaintext')[0]
   symbols = ''.join(plaintext.firstChild.data.split())
   pattern = r"^(" + symbols + ")+$"
except Exception, e:
   print e
   sys.exit(1)
이렇게 만든 정규식 패턴을 조승연씨의 파이썬 코드에 적용하면 가장 긴 단어를 찾을 수 있다.

댓글 없음:

댓글 쓰기