가까운 미래

Posted 2008/08/05 16:58
 지난 주말이 지나면서 이제 군생활도 200일이 채 남지 않게 되었다. 뒤돌아 보면 아주 짧은 시간 같지만 아직도 앞을보면 한숨만 나온다. 할일도 많고 하고싶은일도 많아서 나에게 고통과 시련(꼬이는 군생활)이 닥치지 않는다면 잘 지나갈 것 같다.

 의미없는 포스팅이 될 거 같은 기분이다. 어차피 찾아오는 사람도 별로 없기때문에 지극히 개인적인 공간으로 유지되고 있다. 가끔 나도 유명한 블로거를 꿈꾸지만 게으른 성격이나 지극히 좁은 지식을 가진터라 인기를 끈다는건 힘든일 같다.

 간단히 정리해보면 10월초에 교내 소공전이 있다. 일과중 오후시간에는 구현, 일과후 저녁시간에 두시간쯤 관련공부나 설계에 투자를 하고 있다. 8월말이면 거의 구현될 예정이고 9월에는 아이디어를 집약해서 퍼포먼스의 향상을 가져올 생각이다.

 또 중요한 것이 영어다. 영어공부는 나에게있어 꼭 해야할 일이며 재미를 붙히는 중이다. 일단 듣기와 어휘위주의 공부를 진행할 생각이다. 듣기 스크립트를 읽을때나 어휘에서 관련문장을 읽을때 어차피 독해감은 유지되는 것이고 전역후 학원도 다닐 생각이다.

 만약 가능하다면 12월에 삼성멤버쉽에 지원할 생각이다. 일단 복학후 잘곳이 될 수도 있으며 많은 것을 배울 수도 있을것이다. 작품은 현재 소공전 준비작품을 수정해서 제출할 생각이다. 지금으로서는 가장 간절한 항목이다.

 마지막으로는 학사논문을 작성하는 것이다. 졸업이 목표가 아니라 이력서에 한줄 남길것도 되고 석사과정을 할지말지 결정도 해주기 때문이다. 직접 교수님과 얘기도 해보고 일도해보면서 정말 할 만한 것인지 알수도 잇고 많은 것을 배울 수도 있을 것 같다.
이올린에 북마크하기(0) 이올린에 추천하기(0)

영어공부

Posted 2008/07/31 08:25
 난 깡시골촌놈이다. 남들은 초등학교때부터 영어공부 시작했지만 난 초등학교 4학년때 영어노래 하나를 한글로 고쳐서 강당에서 사람들 모아놓고 부른게 다다. 알파벳은 중학교 1학년 첫 영어시간 끝난뒤 숙제하면서 처음알기시작했고 그때부터 이제껏 학원한번 다닌적이 없다.

 처음영어공부를 시작한건 고등학교 1학년때 모의고사 이후이며 그당시 내기억으로는 80점만점에 50점정도 맞었던거 같다. 원래 몰아치는 공부를 좋아했던터라 세달동안 몰아쳤고 독해위주로 공부를해서 77점까지 올렸다. 영어를 잘한다는게 아니라 그만큼 수능영어가 독해위주였다는거다.

 그 이후로 모의고사때 70점 아래로 가는일은 없었고 공부의 필요성의 그렇게 느끼지 않았고 고2때 학교에서 돈대줘서 토익을 한번 친적이 있는데 토익이 뭔지도 모르고 쳤는지 사백점도 안나온 성적이었지만 그다지 영어에 대해서 고민한적이 없다. 고민했어야 했는데 말이다.

 아무튼 대학교와서 영어공부라고는 한번도 안한터라 그때 그실력이고 오히려 더 못할거다. 어휘는 고작 중학교수준도 될려나 모르겠고 듣기는 귀가 바보가 된지 오래다. 독해야 원래 중요시 했고 원서도 꾸준히 읽어서 어느정도 유지는 하고 있는데 평균이하다.

 나, 영어 어떡하지 !?
이올린에 북마크하기(0) 이올린에 추천하기(0)

D+ 500

Posted 2008/07/24 16:32

 2007년 3월 12일 14시. 눈물을 흘리는 어머니와 슬퍼하는 가족들을 뒤로한채 난 논산 육군훈련소 연병장으로 뛰기 시작했고 어느새 딱 500일이 지났다. 3학년 1학기 과정을 마친상태였기 때문에 `군대포멧` 이라는 말을 너무무서워서 훈련소에서 시간나면 `Hello World`를 찍어냈던 기억이다.
 
 아무튼 500일이 지났고 사회로의 압박도 그만큼 커지기 시작했다. 일단 가까운 교내소공전이 문제고 멀게는 취업이 문제다. 소공전 주제로 학사논문도 하나 썻으면 좋겠고 인맥과 경험을 위해 삼성 멤버쉽까지도 우려먹을 생각이다.

 문제는 영어인데 도저히 방법을 모르겠다. 주위에 영어잘한다는 사람이 많은데 전혀 도움은 되지 않고 절망감만 나에게 안겨줄 뿐이다. 일단 듣기와 어휘위주로 시작할 생각인데 잘 되려나 모르겠다. 끊임없는 생각과 놀라운 집중력이 필요한 시기같다.

이올린에 북마크하기(0) 이올린에 추천하기(0)

데이터 셋

Posted 2008/07/20 19:47

 악플판별 시스템을 만들면서 데이터셋의 중요성을 많이 느끼고 있다. 처음에는 구현하는 부분이 투자하는 시간의 80% 정도 될 줄 알았는데 막상 해보니 구현은 20% 고 데이터셋 을 가공하는 것이 80% 였다. 파이선 자체가 개발속도가 빠르기 때문일 수도 있지만 중요모듈의 구현이 끝난 지금에서 뒤돌아보면 데이터 셋을 가공하는게 80% 였다.

 만들기 시작하기전에 가장처음 생각했던데로 했을때 어큐러시가 65% 정도 나왔다. 찍어도 50 %인데 이방법이 틀렸나 고민도 많이 했었고 얼굴한번 뵌적도 없는 교수님한테 메일을 보내기도 했었다. 가장 일반적인 방법이기에 틀릴 것이 없을거라 생각했고 하루하루 지나면서 그 이유를 알기 시작했다. 데이터 셋에서 자질을 뽑아내는 방법이 너무 일반적이었다.

 그래서 단어의 빈도수 외에 다른 자질이 뭐가 있을까 생각해봤고 가장 처음 생각난게 확률 자질이었다. 각단어가 출현하였을 때 악플 혹은 선플일 확률도 쉽게 구할 수 있었고 빈도수 외에 자질로서 아무리 생각해도 좋았다. 빈도수에 확률을 곱하는 것으로 해보았고 현재 테스트 셋에서 어큐러시가 80.01% 가 나왔다.

 물론 데이터셋 자체가 인정받은 것도 아니고 내가 무작위로 선택한 것이기 때문에 믿을 수 없는 값이지만 자질 선택의 중요성을 나에게 일깨워 줬고 앞으로의 개발방향을 알려주었다. 또하나 생각난것이 트레인 셋을 자체를 만들때에도 정말 필요한 데이터만 뽑는 방법이 시스템의 향상을 가져올 것 같은데 이건 더 생각해봐야겠다.

이올린에 북마크하기(0) 이올린에 추천하기(0)
classifier.py

 설계부분의 classifier 모듈을 구현하였다. classifier 라는 클래스가 하나 있으며 그 클래스를 통해 댓글이 선플인지 악플인지 판단한다.  클래스 외부에서는 classify라는 멤버함수에 덧글을 넘겨 호출하면 숫자를 하나 리턴받는데 그 수가 양수면 선플이고 그렇지 않으면 악플이다.

def classify(self, comment):
  # build wordiddic -> { wordid:frequency, wordid:frequency, ... }
  worddic = getterms(comment)
  words = worddic.keys()
  wordiddic = {}

  for word in words:
    cur = self.con.execute("select rowid from wordlist where word = '%s'" % umbcs(word))
    res = cur.fetchone()
    if res == None: continue # ignore unadded words
    else: wordiddic[res[0]] = worddic[word]

  # build line -> "0 wordid:frequency worid:frequency ..." (wordid asc)
  line = "0 "
  for wordid, frequency in sorted(wordiddic.items(), key=lambda item:item[0]):
    line = line + str(wordid) + ":" + str(frequency) + " "

  return svmclassifier(line + "\n")

 getterms 은 댓글을 입력하면 명사와 그 댓글에서의 명사 출현회수를 담은 사전을 리턴하고 svmclassifier 는 댓글을 단어 출현횟수를 자질로 백터화해서 넘기면 악플 집단인지 선플집단인지 분류해준다.

analyzer.py

  설계부분의 analyzer 모듈을 구현하였다. analyzer 라는 클래스가 하나 있으며 그 클래스를 통해 데이터셋을 분석한다.  클래스 외부에서는 probability 라는 멤버함수에 단어를 넘겨 호출하면 문자열을 하나 리턴받는데 단어가 데이터셋에 없을 경우 "no data"를 그렇지 않을경우 단어가 악플에 포함되었을 확률이다.

def probability(self, term):
  # get wordid
  res = self.con.execute("select rowid from wordlist where word = '%s'" % umbcs(term)).fetchone()
  if res == None: return "no data"
  else: wordid = res[0]

  # get case -> [-1, 1, ...] (-1 : bad, 1 : good)
  case = []
  for commentid in self.con.execute("select commentid from wordlocation where wordid = %d" % wordid).fetchall():
    for status in self.con.execute("select status from commentlist where rowid = %d" % commentid[0]).fetchall():
      case.append(status[0])

  # return -> "no data" or "48%"
  return str(int((case.count(-1) / float(len(case))) * 100)) + "%"

 성능을 고려하지 않고 작성하였으며 댓글이 10만개가 넘어갈 경우 재작성 되어야 할 것이다. 아마 데이터 베이스를 갈아타거나 적절히 여러파일로 나눠서 처리해야 할 것이다. 데이터베이스에서 해당단어가 포함된 댓글을 가져와서 악플의 수를 모든댓글의 수로 나누었다.

result

 위 두함수를 이용해서 간단한 악플판별 웹페이지를 작성하였다. python 으로 작성하였고 django 프레임웍을 이용하였다. 국내호스팅중 django를 지원하는 호스팅이 없기때문에 안타깝게도 스크린샷을 으로 대체한다.

사용자 삽입 이미지

이올린에 북마크하기(0) 이올린에 추천하기(0)

 사실 Design 2번글에 넣었어야 하는 부분인데 깜박하고 넣지 않았다. 다음은 악플판별 시스템에서 사용할 데이터베이스 스키마다. DBMS로는 sqlite를 이용할 것이다. sqlite를 선택한 이유는 파이선에서 기본모듈로 pysqlite를 제공하고 있고 성능도 비교적 우수하고 설치도 간편하기 때문이다.

1. commentlist - text, status

  댓글의 내용과 상태를 관리하는 테이블이다. 더이상 설명이 필요하지는 않은 것 같다.

2. wordlist - word

 단어의 내용을 관리하는 테이블이다. 이것도 더이상 설명이 필요하지 않은 것 같다.

3. wordfrequency - commentid, wordid, frequency

 댓글에 포함된 단어들과 각단어가 댓글에 포함되는 횟수를 관리한다.

 참고로 sqlite는 테이블마다 인덱스를 유지하는데 commentid 는 commentlist 테이블의 text 인덱스, wordid 는 wordlist 테이블의 word 인덱스이다. 지금 당장은 단어의 출현횟수만 이용하기 때문에 이것만을 유지하는 테이블만 필요하다.

이올린에 북마크하기(0) 이올린에 추천하기(0)

내가 성장하는 방법

Posted 2008/07/15 10:32

 갑자기 드는 생각때문에 자판을 두들기기 시작한다. 성장하는 방법을 하나 알게 되었기 때문이다. 이미 나도 모르게 그렇게 하고 있었을 수도 있지만 나는 참 무협소설의 주인공 처럼 성장 한 것 같다. 무협소설의 주인공은 자신이 죽기직전의 극한의 상황에서 참고 견디며 다시 일어나고 눈부신 성장을 한다. 생각 해보면 내 삶에서도 그런 극한의 포인트가 있었던 것 같다. 그럴 때마다 성장한 것 같고 결과도 좋았던 것 같다. 그러면 이제부터,

나를 극한으로 내몰자 !

이올린에 북마크하기(0) 이올린에 추천하기(0)

 파이선으로 처음짜보는 프로그램이라 설계를 어떻게 해야할지 잘 모르겠다. 일단 내가 개판으로 짤때의 방법을 쓰기로 했다. 굵직굵직하는 모듈만 뽑아낸 다음 각 모듈별로 정확하게 구현하고 이 모듈들을 사용해서 프로그램을 완성시키는 것이다. C++나 자바로 프로그래밍 할 때 많이 썻었는데 파이선과도 잘 어울릴 것 같다.

 그럼 그 굵직굵직한 모듈들을 하나하나 살펴보자.

 1. classifier

 이 모듈은 임의의 댓글이 선플인지 악플인지 알려준다. 다른 모듈의 사용결과를 이용해서 빠르게 결과를 보여준다.

 2. trainer

 이 모듈은 사람에 의해 정확하게 선플인지 악플인지 판단된 댓글들을 가지고 svm 분류기를 학습한다.

 3. analyzer

 이 모듈은 데이터셋를 분석하여 사용자에게 보여준다.

 5분 정도 생각한거 치고는 잘 뽑아낸 것 같다. 원래는 복잡한 설계를 하고 적절한 구현을 하여 변경이 쉬운 유연한 프로그램을 짜려 하였으나 이런저런 변명 때문에 그리고 너무 간단한 프로그램이기 때문에 그런 노력은 가하지 않았다. 일단 어느정도 중규모의 데이터를 다룰 수 있어야 하기 때문에 생각하게 많을 것 같다.

이올린에 북마크하기(0) 이올린에 추천하기(0)

악플 데이터 셋을 만들면서

Posted 2008/07/11 14:18
 악플판별 시스템을 만들기 시작한지도 보름이 지났다. `진행됨에 일단 방향은 맞다` 라는 생각이 강하게 들기 시작했다. 지금 정확도가 75%-80% 을 왓다갓다 하는데 댓글데이터셋이 10개 미만의 주제를 바탕으로 만들어졌기때문에 높은편이고 예상하건데 지금의 방법으로는 70%을 넘기기 힘들 것 같다. 그래서 방향은 맞다라고 했던 것이다.

 하는 수 없이 일단은 데이터 셋이 정확해야 여러가지 방법을 적용시키면서 실험할 수 잇으므로 공인된 데이터 셋이 없으므로 내가 직접 정확한 데이터셋을 만들어야 한다. 막무가내로 내가 데이터 셋을 만들고 있고 (심지에 틀린 데이터도 있다), 6000개가 넘는 댓글을 분류하였다. 분류하기 쉽게 프로그램도 작성하였는데 본문과 댓글을 보여주고 내가 악플 혹은 선플 혹은 삭제를 선택하는 식이다.

 재미있으라고 처음 4000개정도는 네이트 톡에서 뽑았고 1만 5천개 정도는 어제 다음최다댓글 뉴스에서 뽑았다. 방금은 정치뉴스 몇개랑 연예뉴스 몇개를 하고 왔는데 문득 드는 생각이 악플이 이렇게 본인으로 하여금 힘들게 할 수 있구나 였다. 별의 별 악플을 달고 있었고 정말 본인이라면 참을 수 없을 정도의 인신공격을 하고 있었고 악플러들의 상상력은 무한하였다.

 내가 디시인사이드를 해서 (양호한 갤만 가지만) 악플의 현황을 잘 알거라고 생각했는데 전혀 아니었다. 또 악플들을 읽으면서 내가 수십수백만개의 댓글을 수집하더라도 악플의 패턴을 알 수 없지 않을까 하는 걱정도 되었다. 처음에 시작할때는 10만개정도면 대충 잘 분류하겠거니 했는데 지금은 100만개 정도로 늘어났다. 10배가 됨에 엄청난 시스템 변화가 일어날 것 같다.
이올린에 북마크하기(0) 이올린에 추천하기(0)

스크립트 언어

Posted 2008/07/11 08:28

 올해부터 1년에 1개의 프로그래밍 언어를 다루기로 했고 올해는 파이썬이다. 자꾸고민되지만 파이썬이라고 써야할지 파이선이라고 써야할지 고민된다. 아무래도 된소리를 싫어하는 나로서는 파이선이 나은 것 같다. 아무튼 파이선을 선택하게된 이유는 정보검색이나 머신러닝을 공부하기는데 문자열 처리가 강력해서 유리하다고 하였고 많은 정보검색이나 머신러닝 공부하는 사람들이 파이선을 사용하였기 때문이다.

 공부는 열혈강의 파이선에서 파트두개 정도 읽은게 다이고 집단지성 프로그래밍 책에서 실무자가 감칠맛 나게 구현한 코드를 본게 다이다. 그리고 악플판별 프로그램을 파이선으로 짜고있고 너무 지저분함에 뒤엎을까 고민중이다. 열혈강의 파이선 나머지파트 보는게 도움이 될수도 있겠다. 그리고 방금 든 생각인데 파이선 프로그래밍 문법도 정리할겸 블로그에 파이선 프로그래밍 연재을 해야겠다.

 아무튼 스크립트 언어를 공부하면서 정말 첫번째로 든생각은 개발자라면 스크립트언어 하나정도는 정말 필수라는 것이다. 개발자를 사진가에 비유하면 스크립트언어는 폴라로이드정도 될 것같다. 사진가는 사진을 찍기전에 물론 감으로 사진기의 상태를 수정할 수 있겟으나 폴라로이드로 직접 찍어봄으로써 감보다는 좀 더 정확하게 사진기의 상태를 수정할 수 있다.

 이와 마찬가지로 개발자는 이렇게 하면 될거야 라는 감으로 프로그래밍을 시작하기보다 개발속도가 훨씬 빠른 스크립트 언어로 구현해보고 아 이렇게 하면 되는구나라는 것을 안 뒤 프로그래밍을 시작하는게 좋다는 것이다. 그런 의미에서 개발속도가 C언어보다 10배빠르다는 파이선이라는 스크립트 언어가 나에게 큰 도움이 되었고 앞으로도 될 것같다.

이올린에 북마크하기(0) 이올린에 추천하기(0)