Framework/스팸 필터링2009. 1. 12. 13:48

그러나 앞에서 말한대로 스팸은 종합적인 특성과 더불어 주관적이며 지역적이라고 언급한 바 있다. 패턴에 대해서 익숙한 사람은 이 경우 떠오르는 패텬은 전략Stretegy 패턴이다.

예컨대 각 판단들의 +- 값이 0보다 넘어야 스팸이라고 정의할수도 있고 혹은 일정 수치보다 커야 한다는 것도 있을 수 있다. 또는 어떤 Filter는 무조건 0보다 커야하고 어떤 Filter는 -5보다 커야한다는 조건을 넣을 수 도 있다. 혹은 전체 필터의 2/3 이상이 플러스여야 한다는 조건을 세울수도 있다.


결국 구현하고자 하는 시나리오는 다음과 같다. 

public void testComposite() throws Exception {
  Judgment judger = new JudgmentImpl () ;   // 주관적 혹은 지역적인 판단의 주체
  judger.addFilter(new DuplContentFilter()) ;  // 개벌적인 판단
  judger.addFilter(new EmptyContentFilter(-5, 0)) ; // 개벌적인 판단

  BlockSpamer bs = new BlockSpamer(judger) ;   // BlockSpamer는 일종의 Facade에 가깝다.

  ContentTest content = new ContentTest("title", "content") ;
  ContentTest empty = new ContentTest("another title", "") ;

  assertEquals(false, bs.isSpam(content)) ;
  assertEquals(true, bs.isSpam(content)) ;
  assertEquals(true, bs.isSpam(empty)) ;
}

첨부한 소스는 위의 내용들을 아주 간략화한 소스이다.

Filter에 가중치를 구현하는 개념도 빠져있다. 그리고 여기에는 진화하는 소프트웨어라는 개념이 빠져있다. 개인적으로 진화개념의 소프트웨어를 무척 좋아하기 때문에 언젠가 소개할 수 있기를..


스팸 처리에 대한 논의는 꽤 여러사람에 의해 꽤 오랫동안 이루어져 왔다. 그리고 스팸처리에에 대한 경제적 효과를 감안하면 이는 당연한 일이다. 다만 그동안의 스팸 처리를 보면 지극히 지엽적이다. 스팸에 대해 프로그래밍을 오랫동안 하지않은 풋내기 프로그래머의 지엽적이라는 표현이 거슬릴지 모르겠지만 스팸 판단에 있어서 대부분의 연구와 프로그래밍이 지나치게 단어에만 집착하는게 아닌가 싶다.

카오스적 세계에서 sex에 -1점의 포인트를 주는 방식은 전체 스팸에서 차지하는 비중은 아주 작을것이라고 생각한다. 왜냐하면 일단 맞춤법에 맞게 쓰리라는 보장이 없고 단어 매칭에 의해 스팸처리 공식이 적용된다는 것을 알면 이를 피할 방법은 초등학생도 생각할 방법이 무한이 많다. 게다가 여러번 언급한바와 같이 스팸은 지역적이며 주관적인 문제이다. 그래서 위 방법은 매우 다양한 방법을 고려하는 인터페이스를 설계하였다.

그렇다면 모든 방법은 의미가 없는게 아닐까? 라는 의견도 있을 수 있다. 스팸 처리에 대한 프로그래밍 방법이 알려진다면 그에 대한 해결책은 항상 존재하기 때문에 ...

그렇기 때문에 중요한 문제가 있다. 첫번째는 스팸 처리 프로그래밍은 진화적 성격을 가져야 한다는 것이다. 특정 아이피를 관리자가 등록해서 막겠다는건 쓰잘데기가 없다. 아이피를 변경하는 것은 간단하기 때문이다. 게다가 동적 아이피를 사용할 경우 엉뚱한 사용자가 피해를 보기 때문이다. 그래서 스팸 프로그래밍은 자체적으로 스팸의 적용범위를 조절할수 있어야 한다. 이를테면 개미의 페로몬의 문제처럼 향기만 강하게 할뿐 결코 확정지어서는 안되고 그 향기는 시간에 따라 변동이 가능하게 되어야 하며 서로 협업 필터링이(Collaborative Filtering)이 되어야 한다. - gmail이 스팸 필터링이 이와 같은 방식으로 되어 있지 않을까 추측해본다.

두번째로 그럼에도 불구하고 이론적으로 완벽히 스팸을 막을 수는 없다. 다만 처음 글에 언급하였다시피 귀찮게 만들수 있을 뿐이다. 이는 이론적은 아니지만 경제적으로는 충분히 효과가 있을 것이라고 생각한다. 첫번째 스팸을 쓰는 노력과 두번째 스팸을 쓰는 노력이 거의 비슷하다면 (즉 첫번째 글을 쓰고 두번째 글을 쓸때 스팸이라고 판단되어 글을 바꾸거나 등록자를 바꾸거나 아이피를 바꿔야 하는등의 추가적인 노력이 소모되어야 하는경우, 혹은 프로그래밍 계산 공식이 상당히 복합적이라 어느 하나의 쉬운 변동으로 목적을 달성하지 못할경우) 스팸 하나를 썼을때의 경제적 이득을 고려하면 원천적은 아니지만 상당히 많이 막을 수 있지 않을까 생각된다.




'Framework > 스팸 필터링' 카테고리의 다른 글

판단에 있어서..  (0) 2009.03.16
휴리스틱 알고리즘 + 복합 알고리즘  (0) 2009.03.12
판단의 기본 아이디어  (0) 2009.01.12
개요  (0) 2009.01.09
Posted by bleujin