방명록/질문게시판 (2009.10.11~)


방명록을 겸한 질문 게시판 용도의 글입니다.

아이추판다에게 하고 싶은 말이나 묻고 싶은 것이 있으면 공개/비공개 댓글로 달아주시기 바랍니다.

방명록/질문게시판 (2009.2.11~2009.10.11)
방명록/질문게시판 (2008.9.10~2009.2.10)


by 아이추판다 | 2010/10/11 13:40 | 트랙백 | 덧글(11)

지마켓의 신기한 자바스크립트 오류 해결법

겨울옷을 사러 갔다. 비싸! 인터넷으로 옷을 사면 싸다는 말을 듣고 지마켓에 가보았다. 싸!


주문을 했다. 안 와! 열흘이 지났다. 왔다. 그런데 작아! 반품을 하려고 들어가봤다.

깨알만하게 쓰여있는 취소/반품/교환안내 버튼. 오케이. 클릭. 팝업이 떴다.

반품신청 하러가기. 좋아. 클릭. 이거 뭐야. 안되잖아? 팝업창 아래를 보니 자바스크립트 에러. opener라는 객체가 없단다. 이게 뭔 소리야. 소스코드를 열어보았다. "반품신청 하러가기" 버튼을 클릭하면 아래 함수가 실행되도록 되어 있다.

function parentGo(){
     opener.document.location.href = "http://www.gmarket.co.kr/challenge/neo_my_gd/order_contract_edit_list.asp";
     self.close();
}

아마도 팝업창에서 "반품신청 하러가기"를 클릭하면 원래 창이 반품신청 하는 곳으로 이동하게 짜두었나 보다. 부모창 id가 opener겠지. 부모창으로 갔다. 소스코드 보기. 찾기. opener.

function eventDreamAuction(){
      opener.document.location.href="http://www.gmarket.co.kr/challenge/neo_auctio/auction_goods.asp?goodscode=&auc_no=&check_yn=Y";
      opener.document.focus();
}

이 놈의 opener는 도대체 뭐야. 찾기. eventDreamAuction. 검색결과 없음. 엥? 이놈의 opener는 도대체 뭐야?

고객센터로 전화.

나: 반품신청하려는데 버튼이 먹통이네요. 아마 자바스크립트 에러가 난 것 같은데..
상담원: 반품신청하려고 하신다고요? 주문번호가 어떻게 되시죠?
나: (아, 일단 반품신청부터 해야지) 블라블라

어찌어찌 반품신청을 했다. 배송료는 내가 내야 한단다. 좋아. 배송료를 내러 갔다. 배송료를 내는 방법은 세 가지. 카드 결제하는 건 없다. 환불액에서 차감할 수 있단다. 음. 이건가 보군. 선택. 결제 확인.

난데없이 5천원을 결제하란다.


다시 고객센터로 전화.

나: 배송료 카드 결제는 없고, 환불액에서 차감하는 걸 선택했는데 또 뭘 결제하라네요?
상담원: 고객님께서 카드로 결제하셨기 때문에 차감은 안되시고요, 배송료는 카드로 결제해주셔야 합니다.
나: 그러니까, 차감을 선택한 다음에 카드로 결제하라고요?

나: 그리고 반품신청 버튼도 자바스크립트 에러 나서 클릭이 안되는데..
상담원: 그건 고객님 컴퓨터 문제기 때문에 저희가 도와드릴 수 없습니다.

자바스크립트 에러 나는 게 왜 내 컴퓨터 문제야.

나: 아니, 그게 그럴 수가 없거든요? 혹시 기술부서랑 통화할 수 있나요?
상담원: 네.. 그럼 저희쪽에서 연락드리도록 하겠습니다. 언제 통화가능하신가요?
나: 4시쯤 해주세요.

오케이. 상담원한테 자바스크립트 얘기해봐야 소용없지. 시간은 흘러 오후 4시. 따르릉.

기술자: 고객님, 반품신청하는데 문제가 있으시다고요?
나: 아뇨. 반품신청은 전화로 했는데, 인터넷에서 그 버튼이 클릭이 안되더라고요? 제가 보니까 자바스크립트 에러가..
기술자: 고객님, 원격접속 해봐도 되겠습니까?
나: 아니 자바스크립트 에러가 나는데 왜 원격접속을 하나요?
기술자: 그게 고객님 PC 문제거든요.
나: 그럴리가 없을 것 같은데요?
기술자: 저희가 고객님 말고는 반송신청에 문제가 있다는 보고가 들어온 적이 없거든요. 저희 쪽 문제라면 전화가 쏟아지지 않겠습니까?

문득 스쳐지나간 원사운드 만화 한 편. 뭐. 일단 속는 셈치고 해보자. 지마켓 홈페이지의 고객센터로 들어가니 원격접속하는 프로그램을 다운 받을 수 있다. 이거 신기한 걸? 프로그램 실행.

기술자가 원격접속으로 들어오더니 컴퓨터에 설치된 보안 프로그램들을 열심히 지우기 시작한다. 오, 보안 프로그램 때문에 자바스크립트 에러가 뜰 수도 있구나 신기한데? 인터넷 임시 파일도 지우고, 익스플로러 설정도 초기화한다. 음. 역시 마이크로소프트 이 개노무 자식들 브라우저를 어떻게 만들었길래!

나: 자, 이제 다시 해볼까요?

"취소/반품/교환 안내" 클릭. "반품신청 하러가기" 클릭. 오..


안되잖아!!!!!!!


자바스크립트가 잘못되어 있는데 설마 보안 프로그램 지운다고 그게 되겠냐 말이지. 정말 전화가 쏟아지지 않는게 신기하군. 하여간 이 기술자를 닥달해봐야 역시 소용없는 일이라, QA팀이나 개발팀하고 연결해달라고 하니, 그건 무리고 전달은 해주겠단다. 물론 아주 길고 지루한 변명도 들었지만 그건 일일이 옮기기도 귀찮다.

오늘 덕분에 전화 통화만 다 합쳐서 한 시간을 했다. 상담원과 기술자야 무슨 잘못이 있겠냐. 링크 하나도 자바스크립트로 떡칠을 해놓고 그나마도 에러를 내서 아예 링크를 먹통으로 만들어놓은 개발팀. 이런 오류를 못 찾아낸 QA팀(있기는 있나?). 그리고 대형 인터넷 쇼핑몰을 운영하면서 상담원과 기술자에게 "자바스크립트 에러"라는 말이 무슨 뜻인지 알려주지 않은 경영진. 이거나 받아라.

내가 다시는 지마켓에서 뭘 사나 봐라.

by 아이추판다 | 2009/11/03 02:14 | 트랙백 | 핑백(1) | 덧글(23)

로고의 정체?

오늘 지나가다 본 간판에 있는 로고.


처음엔 "헉, 콘돔"했다가 다시 보니 아마도 젖병인 듯하다. 그런데..


.

.

.

.

.

.

.

.

.

.

.

.




동태찜하고 젖병이 무슨 상관이지?

by 아이추판다 | 2009/10/20 21:28 | 트랙백 | 덧글(8)

텍스트의 통계학: (3) 네 주제를 알라

텍스트의 통계학: (1) 구글신의 새 마음
텍스트의 통계학: (2) 셰익스피어의 영혼은 몇 그램?

지난 번에는 간단하게 단어의 순서, 즉 문법을 통계적으로 분석하는 방법을 알아보았다. 제대로 문법을 분석하려면 일단 문법 이론부터 설명해야하니까 그건 과감하게 넘어가겠다. 원래 이 연재가 좀 수박 겉핥기다.

이번에는 텍스트의 '주제'를 통계적으로 파악하는 방법을 다뤄보도록 하겠다. 일단 시작은 지난 번과 마찬가지로 유니그램(unigram) 모형이다.

지난번에는 까만 동그라미를 여러 개 그려놓았는데 이번에는 까만 동그라미 주변에 네모를 쳐놨다. 그래프 모형에서 네모는 그 안에 있는 기호들이 반복된다는 의미다. 즉, 하나의 텍스트에는 여러 개의 단어가 반복되고, 이것이 인터넷 전체에 반복된다는 뜻이다. 원래는 텍스트, 인터넷 자리에 반복되는 횟수, N이 들어가지만 편의상 표기법을 바꿨다.

유니그램 모형에서 모든 단어는 무작위적으로 나타난다. 그런데 그건 사실이 아니다. 이걸 좀 더 그럴 듯하게 바꿔보자. 모든 텍스트에는 주제가 있다. 그리고 주제가 같은 글에는 단어들이 나타나는 패턴이 비슷하다. 예를 들어 정치에 관련된 글이라면 '국회'나 '선거' 같은 단어가 많이 나올 것이고, 경제에 관련된 글이라면 '고용'이나 '금융' 같은 단어가 많이 나올 것이다. 즉, 유니그램은 유니그램이지만 주제에 따라서 유니그램의 단어 분포가 달라지는 것이다. 이것이 유니그램 혼합 모형(Mixture of unigrams model)이다.


그런데 사실 우리는 어떤 글의 주제를 직접적으로 관찰할 수가 없다. 그래서 유니그램 혼합 모형에서 모든 텍스트는 여러 가지 주제가 확률적으로 중첩된 상태가 된다. 예를 들어 정치 관련 글에서 '국회'라는 단어가 나타날 확률이 1%, 경제 관련 글에서는 0.5%라고 해보자. 어떤 글이 정치 관련 글일 확률이 80%고, 경제 관련 글일 확률이 20%면 이 글에서 '국회'라는 단어가 나타날 확률은 80% × 1% + 20% × 0.5% = 0.9%가 된다.

이걸 두 가지로 생각할 수 있는데, 한 가지는 이 글은 경제 관련 글이거나 아니면 정치 관련 글인데 다만 우리가(정확히 말하면 컴퓨터가) 모를 뿐이다. 또 하나는 이 글의 주제 자체가 80%는 정치고 20%는 경제다. 사실 똑부러지게 어떤 주제에 속하는 글이란 없으므로 후자의 해석이 좀 더 마음에 든다. 그러면 아예 작심하고 이걸로 확장해보자.

마지막으로 소개할 모형은 그렇게 '작심하고 확장한' 모형으로, 잠재 디리클레 할당 모형(Latent Dirichlet Allocation model: 이하 LDA 모형)이라는 외계어로 된 이름을 가지고 있다. 재미로 덧붙이자면 LDA 모형을 만든 사람 중에 하나의 이름은 '마이클 조던(Michael I. Jordan)'이다.

LDA 모형에서 하나의 문서에는 여러 가지 주제가 혼합되어 있다. 그리고 단어 하나 하나는 이런 주제들 중에 하나를 반영한다. 예를 들어 "국회는 금융 관련 법안을.."이라는 문장이 있다면 '국회'와 '법안'은 정치적 주제를 반영하고, '금융'은 경제적 주제를 반영하는 식이다.

그림에서 α,β가 뭘 뜻하는지는 알 거 없고, '문서'라고 표시된 하얀 동그라미는 그렇게 혼합된 주제를 뜻하며 '주제'라고 표시된 하얀 동그라미는 문서가 가진 주제들 중에 각 단어가 반영하는 주제를 뜻한다. 유니그램 혼합 모형과 마찬가지로 문서의 혼합된 주제나 단어가 반영하는 주제나 모두 관찰되지 않기는 마찬가지이므로 이것들도 전부 중첩되어 있다. 독자들의 혼란을 막기 위해 자세한 설명은 생략한다.

아래 그림은 AP 말뭉치(corpus: 전산언어학 연구를 위해 실제 사용되는 말과 글을 대량으로 수집한 데이터베이스)에서 뽑아낸 한 문단을 LDA모형으로 분석한 것이다. 빨간색은 '예술', 초록색은 '예산', 파란색은 '아동', 자주색은 '교육'이라는 주제를 반영할 확률이 가장 높은 단어들이다.

잘보면 '오페라(opera)'나 '음악(music)' 같은 단어들은 '예술'을 반영할 확률이 가장 높고, '재단(foundation)'이나 '이사회(board)'는 예산, '젊은(young)'이나 '기회(opportunity)'는 아동, '학교(school)'이나 '가르치다(taught)'는 교육을 반영할 확률이 가장 높다고 분석된 것을 알 수 있다. 이것은 LDA 모형이 이 단어가 실제로 무슨 뜻인지도 전혀 모른채 오로지 통계적으로만 분석한 것이다.

LDA 모형의 재밌는 점은 동음이의어도 문맥에 따라 어떤 주제에 속하는지 지능적으로 분류한다는 것이다. 예를 들어 '은행'이라는 단어는 금융기관을 뜻하기도 하고, 나무 열매를 뜻하기도 한다. 글에 따라 LDA모형은 '은행'이라는 단어가 금융기관을 말하는 건지 나무 열매를 말하는 건지 자동적으로 분류할 수 있다.

완벽하진 않지만 텍스트의 주제를 통계적으로 처리할 수 있기 때문에 LDA 모형을 이용하면 재미있는 실험들을 할 수 있다. 그리피스와 스타이버는 PNAS라는 과학 잡지에 실린 논문 28,154편의 초록을 LDA 모형으로 분석해서 시간의 흐름에 따라 뜨는 주제와 가라앉는 주제를 찾아냈다.


그림 하단은 각 주제의 번호와 그 주제에서 특징적인 단어의 목록이다. 그림 상단의 그래프는 이 주제들의 논문들에서 차지하는 비중의 시간에 따른 변화를 나타낸 것이다. 대부분 생물학과 관련된 주제라서 뭔지는 정확히 모르겠는데 가라앉는 주제들 중에 37번 주제는 클로닝, 289는 분자생물학의 주제 중에 하나, 75번은 면역학의 주제 중에 하나인 것 같다. 그리고 뜨고 있는 주제 중에 2번은 지구 온난화, 134번은 유전자 녹아웃, 179번은 세포 사멸에 관한 것 같다.

나도 똑같은 기법을 이용해 이글루스 뉴스밸리의 글들을 LDA 모형으로 분석한 적이 있는데 그 결과는 이글루스 5월의 떡밥들에 정리되어 있다. 관련 대목만 다시 가져와보면 아래와 같다.

5월동안 이글루스 뉴스밸리에서 논의의 흐름을 위의 그래프만으로 정리해보자. 뉴스밸리는 5월초 주제49(경찰, 시위..)에 대한 이야기로 뜨거웠고 5월 중순에 들어서면서 주제26(북한, 미국..), 주제38(시장, 대우..), 주제44(황우석, 돼지..), 주제40(덕후위원회..), 주제17(서울, 한국, 전교조..) 등이 수면 위로 떠올랐다. 그리고 하순에는 주제8,9(교육, 감사, 한예종..), 주제34(집회, 노동..), 주제50(사건, 헌법..)에 대해 이야기가 쏟아져 나왔다. 그리고 23일. 노무현 전 대통령 서거로 애도의 글들이 쏟아져 나왔고(주제 4, 7, 19, 20, 32) 며칠 지나자 서거 당시 상황에 대한 의혹을 두고 여러 가지 글들이 올라왔다(주제 41, 48).

이런 방법론을 인문학이나 사회과학에서도 활용할 수 있을 것이다. 인문학이나 사회과학에서 텍스트를 분석하는 것은 대체로 질적 방법론에 속하는데, 사람마다 해석이 다른 건 둘째치고라도 방대한 문헌에서 나타나는 경향성을 일일이 사람이 살펴보는 것 자체가 상당한 노가다다.

그런데 LDA 모형 같은 것을 이용하면  조선왕조실록에 어떤 주제들이 있고, 시대에 따라 실록에 나타나는 기록의 주제들이 어떻게 변화하는지 살펴볼 수도 있겠고, 어떤 사건이 벌어졌을 때 언론사마다 다른 보도의 초점이나 시간에 따라 보도 방식의 변화같은 것을 알아볼 수도 있을 것이다. 이런 정량적 방법을 기존의 질적 방법론과 결합한다면 상당히 재미있는 연구가 여럿 가능할 것 같기도 하다.

(계속)

by 아이추판다 | 2009/10/14 12:05 | 트랙백 | 핑백(1) | 덧글(8)

텍스트의 통계학: (2) 셰익스피어의 영혼은 몇 그램?

텍스트의 통계학: (1) 구글신의 새 마음

텍스트는 문장으로, 문장은 단어로 이뤄져있다. 누군가 "철수는 영희를.."이라고 말하면 우리는 그 다음에 어떤 단어가 나올지 귀를 쫑긋 세우고 기다릴 것이다. 그 다음 자리에는 "사랑한다"가 나올 수도 있고 "미워한다"가 나올 수도 있다. 다시 말해 한 문장에서 어떤 단어가 나올지는 모두 확률적이다. 유니그램(unigram) 모형은 이것을 가장 간단하게 표현하는 것이다.

'유니(uni-)'는 '하나', '그램(gram)'은 '말'이라는 뜻이다. 유니그램 모형은 하나하나의 단어가 어떤 확률 분포에서 독립적으로 추출되었다고 가정한다. 쉽게 말해 한 면마다 단어가 쓰인 거대한 주사위를 던져서, 나온 단어들로 문장이 이뤄졌다고 보는 것이다. 물론 말이 안된다. 하지만 단순히 각 단어가 사용되는 빈도를 알고 싶다면 유니그램 모형으로 충분하다.

유니그램 모형을 가지고 텍스트를 생성할 수도 있다. 단어마다 문장에서 나타날 확률을 알고 있으므로, 거꾸로 단어들을 이 확률에 따라 랜덤하게 생성하는 것이다. 다음은 셰익스피어의 글들을 유니그램 모형에 학습시킨 다음에, 새로운 문장을 생성하게 한 것이다.

(a) To him swallowed confess hear both. Which. Of save on trail for are ay device and rote life have.
(b) Every enter now severally so, let.
(c) Hill he late speaks; or! a more to leg less first you enter.
(d) Will rash been and by I the me loves gentle me not slavish page, the and hour; ill let.
(e) Are where exeunt and sighs have rise excellency took of. Sleep knave we. near; vile like.

무슨 말인지 해석이 안되는 건 여러분이 영어를 못해서 그런게 아니라 유니그램 모형이 영어를 못해서 그렇다. "or!"라니 도대체 뭔소리야. 유니그램 모형은 그대로 쓸모가 있지만, 아무래도 이것만으로 할 수 있는 건 제한적이다. 그럼 유니그램 모형을 확장해서 좀 더 쓸모 있게 만들어보자.

그것이 바이그램(bigram) 모형이다. '바이(bi-)'는 '둘'이라는 뜻이다. 아래 그림처럼 한 단어가 나타날 확률이 앞 단어에 영향을 받는다고 가정하는 것이다.

그림으로 보는 통계: (1) 쥐와 사람의 관계에서도 설명했지만 관찰된 사건이 머리-대-꼬리로 연결하는 두 사건 사이에는 아무런 관련이 없다. 위의 그림에서 '사랑한다'가 나타날 확률은 '영희를'에만 영향을 받지, '철수는'에는 영향을 받지 않게 된다. 그래서 바이그램에서는 항상 바로 앞단어와 지금 단어, 두 단어의 관계만 문제가 된다. 그래서 '바이'그램인 것이다. 이 모형은 통계학에서 1차 마코프 연쇄(first-order Markov chain)라고 한다.

유니그램의 경우와 마찬가지로 바이그램에게 셰익스피어를 학습시켜서, 문장을 생성하게 해보았다.

(a) What means, sir. I confess she? then all sorts, he is trim, captain.
(b) Why dost stand forth thy canopy, forsooth; he is this palpable hit the King Henry. Live King. Follow.
(c) What we, hath got so she that I rest and sent to scold and nature bakrupt, nor the first gentleman?
(d) The world shall - my lord!

여전히 말은 안되지만 유니그램 모형보다 좀 더 문장 꼴을 한다. 물론 말이 안되기는 여전히 마찬가지다. 그럼 똑같은 방식으로 바이그램 모형을 확장해서 트라이그램(trigram) 모형을 만들 수도 있겠다. '트라이(tri-)'는 3이라는 뜻이므로 이번엔 한 단어가 나타날 확률이 바로 앞단어만이 아니라 그 앞단어에도 영향을 받는다. 숫자가 하나 더 늘었니까 통계학적 명칭으로는 2차 마코프 연쇄(second-order Markov chain)이 되겠다.

역시 트라이그램으로 생성한 문장.

(a) Sweet prince, Falstaff shall die. Harry of Monmouth's grave.
(b) This shall forbid it should be branded, if renown made it empty.
(c) What is't that cried?
(d) Indeed the duke; and had a very good friend.
(e) The seet! How many then shall posthumus end his miseries.

여전히 말이 안되긴 마찬가지지만 "had a very good firend"처럼 멀쩡한 소리도 한다. 유니그램, 바이그램, 트라이그램 같은 모형을 모두 합쳐서 N그램이라고 부르는데 N을 늘리면 늘릴 수록 점점 더 말같은 소릴 하는 모형을 만들 수 있다. 마지막으로 테트라그램(tetragram) 모형, 3차 마코프 연쇄로 생성한 문장을 보자. 예상했겠지만 테트라(tetra-)는 '넷'이란 뜻이다.

(a) King Henry. What! I will go seek the traitor Gloucester. Exeunt some of the watch. Agreat banquet serv'd in;
(b) Will you not tell me who I am?
(c) It cannot be but so.
(d) Indeed the short and the long. Marry, 'tis a noble Lepidus.
(e) They say all lovers sear more performance than they are wont to keep obliged faith unforfeited!

이 간단한 N그램 모형이 N을 늘리면 늘릴 수록 점점 더 셰익스피어처럼 글을 쓴다. 하지만 N그램만으로는 완전한 문장을 쓸 수가 없다. 일단 N그램 모형은 의미론적인 부분을 처리하는 부분이 전혀 없기 때문에 아무리 N이 늘어나도 자기가 무슨 소릴 하고 있는지 모르는데다가, 구문론적인 관계를 전혀 포착하지 못하기 때문이다. 예를 들어 "철수가 영희를 사랑했을 때, 영희는 철수를 미워했다."라는 문장이 있다면 앞 절의 동사가 '과거'이므로 뒷 절의 동사도 '과거'여야 한다. 이런 부분은 단순히 N을 늘려서 포착할 수 있는 게 아니다.

그래도 N그램 모형은 간단한 텍스트 처리를 할 때는 요긴하다. 예를 들어 "눈이 아파"라는 문장이 있다면 이 '눈'은 펄펄 내리는 눈(雪)이 아니라 사람의 몸에 있는 눈(目)일 확률이 높다는 것 정도는 N그램 모형으로 식별할 수 있다. 따라서 검색엔진 같은데서 활용하면 동음이의어를 더 잘 구별할 수 있게 만들 수 있다.

또, 오자 교정에도 활용할 수 있다. "바람이 푼다"라는 문장이 있다면 '바람'도 '푼다'도 모두 사전에 있는 말이니까 일반적인 워드프로세서는 오타라고 감지를 하지 못한다. 그런데 N그램 모형을 이용하면 ㅂ을 ㅍ으로 잘못 칠 확률과 '바람이'라는 말 뒤에 '푼다'가 나올 확률을 비교해서 앞의 확률이 높으면 오타라고 판단하고, 뒤의 확률이 높으면 오타가 아니라고 판단하게 만들 수 있다. 간단한 모형만 가지고도 좀 더 영리한 오자 교정 프로그램을 만들 수 있는 것이다. 물론 의도적으로 독특한 표현을 쓸 때는 걸리적거릴 수도 있다.

N그램은 그 자체로도 쓸모가 있지만 이것을 N을 늘리는 방법 말고 다른 방식으로 계속 확장해보면 아주 재미있는 모형들을 많이 만들 수 있다. 글이 길어졌으므로, 그건 또 나중에.

(계속)

후주. 본문의 N그램으로 생성한 문장 예제는 모두 Jurafsky, D., & Martin, J. H. (2000). Speach and Language Processing. New Jersey:Prentice Hall.에서 인용한 것이다.

by 아이추판다 | 2009/10/09 17:45 | 트랙백 | 핑백(1) | 덧글(4)

◀ 이전 페이지          다음 페이지 ▶