'Framework/스팸 필터링'에 해당되는 글 5건

  1. 2009.03.16 판단에 있어서..
  2. 2009.03.12 휴리스틱 알고리즘 + 복합 알고리즘
  3. 2009.01.12 구현
  4. 2009.01.12 판단의 기본 아이디어
  5. 2009.01.09 개요
Framework/스팸 필터링2009. 3. 16. 07:36

단순히 하나의 글을 가지고 이 글이 스팸인가 아닌가를 판단하는 것은 무척 어렵다. 잘 알려진 폴 그레이엄의 베이지언 스팸 필터 알고리즘은 스팸글에서 특정 낱말의 스팸 점수을 구하고 이 데이타를 바탕으로 하나의 문장의 스팸 확률을 판단하는 것이다. 몇가지 수학공식이 있고 스팸 신고를 통해 스펨글의 베이스 데이타는 점점 늘어나기 때문에 이 판단은 좀더 예리해질 것이라는 것이 바탕이다.

그럴듯 해보지만 사실 개인적으로는 전형적인 공돌이 마인드라고 생각한다. 사회공학적인 생각을 해보자 지난 24시간동안 수(십)만개의 댓글중에 스팸글이 단 하나 올라왔다면 이는 사실 무시해도 상관없는 문제이다. (물론 1개 올라온 댓글이 스팸이라면 조금 슬프다-ㅅ-) 피해는 아주 미미할 것이고 청결 공포증을 가져야 할 필요는 없다.

스팸이 스팸이라고 불리는 이유는 단순히 댓글에 sexy 라는 단어가 있기 때문이 아니라 그 무작위적인 전파성과 양에 근거하는 바가 더 크다. 그래서 이런 필터를 만드는 걸 생각해 볼 수 있다. (물론 앞의 글에 적었듯이 필터 하나 하나는 점수를 줄뿐 하나의 필터를 위반하였다고 해서 바로 스팸이라고 판단하는 것이 아니다. 베이지언 알고리즘도 하나의 필터로 사용할 수 있다.)

Case 1)
지난 24시간에 같은 내용의 글이 - 이를테면 같은 내용의 글이 이미 x개 만큼 존재한다면 스팸일 확률이 높다.


그러나 24시간동안 수십만개의 댓글들이 등록된다면 수십만개의 글을 비교하는 시간이 만만찮다.
- >=와 !=를 판단하는데 있어 굳이 글 자체를 저장할 필요는 없다.  그래서 실제로는 글의 HashCode를 비교한다. 수십K의 글을 4byte 혹은 8byte로 저장할 수 있기 때문에 굳이 DB에 저장할 필요도 없다. 25만개의 댓글을 4byte int로 표현하면 고작 1M 정도이다. 4byte가 42억개의 경우의 수가 있지만 전혀 다른 글이 같은 숫자로 변할 수도 있는 가능성을 생각할 수도 잇지만 이는 단지 판단에 있어서의 하나의 가중치일뿐임을 기억하자.


그러나 스팸글을 올릴때 중간에 스페이스나 특수기호를 사용하여 이부분을 피하려고 시도한다.
-> 스팸글을 올릴때마다 스페이스나 특수기호를 바꿔야 한다면 이는 어느정도는 성공한것이다. 스패머를 귀찮게 만들면 이미어느정도 의미가 있다. 기대되는 이익보다 더욱 많은 수고를 해야 한다면 스패머는 줄 것이기 때문이다. 그건 그거고 앞의 HashCode를 저장할때 특수기호나 화이트 스페이스 문자등은 제거하여 저장하고 비교한다면 좀더 성공확률이 높다. 스패머는 단순히 점 하나 더 찍어주는 걸로 이런 비교를 피해갈 수 없기 때문에 문장 자체를 다시 만드는 수고를 해야 한다. 순서만 바꾼다면 맞춤법 필터에 걸릴 가능성이 높아진다.

만약에 저장공간에 좀더 여유가 있다면 화이트 스페이스나 특수문자들을 사용해서 정해진 규칙에 따라 몇개의 그룹으로 나누고 각각의 숫자들을 저장하는 방법을 쓸 수도 있다. 용량이 다소 늘어나겠지만 이제 스패머는 문장 자체를 재 구성해야 한다.

그러나 예상치못한 사용자가 생길수도 잇다.
-> 단순히 글 내용으로만 판단한다면 짧은 내용의 글 - 특히 유행어일 경우는 -들은 겹칠 확률이 아주 높다. 하지만 꼭 글만 가지고 판단한 필요는 없다. 사용자로부터 알아낼 수 있는 정보는 글 내용 말고도 아이피나 Header에 포함되어 있는 브라우저, 시스템이 남기는 쿠키 등 아주 많다. 특히 프로그램을 이용한 스팸일 경우 header나 ip는 중요한 판단자료가 된다.


Case 2)
한명의 사용자가 지나차게 많은 글을 올린다면 이는 스팸일 확률이 높다.

그러나 회원 등록제가 아니다.
-> 요즘 댓글들은 대부분 회원제든 아니든 인증을 거치게 되어 있기 때문에 현재 큰 장애요소는 아니다. 그보다 한탕주의 처럼 새로운 회원 가입하고 한동안 스팸글을 올리고 잠적하는 것이 더 일반적이다. 이 때 중요하게 판단 할 수 있는 사실은 시간이다. 스패머가(혹은 스팸프로그램도 마찬가지) 한시간에 한개씩 스팸글을 올리지는 않을 것이다. 출퇴근 시간에 지하철 입구역 앞에서 집중적으로 광고 전단지를 돌리듯이 스팸은 특정 시간에 집중되어 있다. 짧은 시간에 집중으로 올라오는 아이피나 사용자가 있다면 스팸일 확률이 높다. 회원제라면 가입일수에 맞춰 log곡선으로 글의 허용량을 늘리는 방법을 생각해 볼수도 있다.

그러나 열성 사용자가 화를 낸다.
-> 서비스에 있어서 열성적인 사용자는 아주 중요하긴 하지만 그 수는 극히 적으므로 등록하여 이들은 추가적인 가중치를 부여하거나 제외 할수도 있다.



이렇게 사회공학을 접근하는 필터는 생각할 수 있는 여지가 아주 많이 있고 만들기도 그닥 어렵지 않기 때문에 실용적이다.

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

휴리스틱 알고리즘 + 복합 알고리즘  (0) 2009.03.12
구현  (0) 2009.01.12
판단의 기본 아이디어  (0) 2009.01.12
개요  (0) 2009.01.09
Posted by bleujin
Framework/스팸 필터링2009. 3. 12. 02:21

잘 알려져 있는 문제인
"n개의 도시가 있는데, 집에서 (1번 노드) 출발하여 모든 도시를 단 한번씩 거치며 집으로 돌아오는 최소 거리 경로를 찾아라." 길찾기 문제의 문제가 주어졌을 경우

아마도 깊이 우선이니, 너비우선이나 혹은 이기적 알고리즘(greedy algorithm) 같은 걸 떠올릴지 모른다. 알고리즘에 좀더 익숙하다면 분할 정복(devide and conquer), 동적 프로그래밍(dynamic programming), 한정 분기(branch and bound), 다익스트라 알고리즘 등을 사용할 수 도 있다. 이런 결정론 알고리즘은 정확한 해(전역 최적해)를 보장하지만 문제크기가 커지면 현실적인 시간 내에 풀이가 불가능 하거나 greedy algorithm처럼 지역 최적해로 수렴하게 된다.

개인적이지만 이 문제에 대해 가장 좋아하는 풀이방법은 메타 휴리스틱한 방법중 하나인 개미 군락 최적화(ant colony optimization)이다. 이 알고리즘은 자연에서 얻은 영감이 바탕이 된 개미의 군락생활에서 먹으를 집으로 이동하는 자업을 효율적으로 수행하기 위해
 - 이동 경로에 페로몬을 뿌림
 - 가한 페로몬의 경로를 선호
 - 시간에 따라 페로몬 증발 이라는 조건을 활용한다.

간단한 알고리즘을 구성하면
페로몬 값을 초기화 한다
repeat {
   해를 생성한다.  // 높은 페로몬 경로가 선택될 확률이 높다.
   페로몬을 갱신한다.
} until(멈춤 조건) ;
그동한 발생한 해중에 가장 좋은 것을 출력한다.

이 알고리즘을 좋아하는 이유는 첫번째는 처음에는 좋은 해를 찾지 못한다고 해도 시간이 지날수록 점점 더 좋은 해를 구할 가능성이 높고 두번째로 환경이 변해도(최적의 길이 변해도) 그에 대해 적응력을 발휘한다는 점이다. 여기서 프로그래밍 십계중 제 4계를 말할 수 있다. 만약 한번에 답을 찾는 것이 어려운 문제라면 연속성을 고려해라. 처음부터 옳은 답을 맞춰야 할 필요는 없다.

만약 소프트웨어가 단지 수학에 불과하다면 정확한 답과 순간적인- 측정 당시의 효율이 우선이 되겠지만 소프트웨어에서 일어나는 문제는 대부분 "잘~"에 관여한 문제이고 스팸판단도 이와 같은 문제라고 생각한다. 스팸판단에 있어 단어 사용등에 있어 수학모델을 사용하는 결정론적인 알고리즘보다 스팸일 가능성이 높은 순으로 정렬할 수 있고 변하는 환경에 대응할 수 있는 알고리즘 시스템이 나아보인다.


두번째로 생각할 것은 "여러개를 결합하면 가장 좋은 단일 알고리즘 보다 좋다"라는 Hybrid한 접근방식이다.

생체 인식에 있어 가장 많이 알려진 방법은 지문 인식이지만 역사가 오래되어서 정교한 만큼이나 그만큼 해킹 기술도 발달하였다. 지문인식이 대단한 정밀 기술로 보일지도 모르지만 아파트 현관문에 사용되는 정도의 지문 기술은 영화에 나오는 최신 기술따위를 사용하지 않아도 지문을 얻을 수 있다면 열쇠보다도 더 쉽게 뚫을 수 있다.(비록 열쇠를 가지고 다닐 필요가 없어서 편리는 하겠지만) 최근에는 지문인식은 -종이나 젤라틴 등에 - 복제된 지문데이타를 방지하기 위해 땀샘 인식을 하는 등의 좀더 복잡해졌지만 복잡해진 만큼이나 비싸지며 동일인임에도 불구하고 거부할 가능성도 높아진다.

생체인식의 분야에는 사실 영화등에서 소개된것만 해도 홍채, 열적외선, 목소리 등이 있고 발걸음이나 손등의 정맥등을 이용한 생체인식 방법도 사용되고 있다. 먼 미래에 언젠가 기술이 충분하게 성숙이 되면 가격도 싸고 인식의 오류 가능성도 극히 낮은 어떤 방법이 나올지도 모르겠지만 현재로서 프로그래밍 관점에서 생각해보면 가장 합리적인 방법은 이 여러가지 방법을 모두 적용한 하이브리드 모델이 나아보인다. 간단한 지문인식 시스템 정도는 뚫을 수 있겠지만 목소리도 비슷하고 홍채도 비슷하고 열적외선의 분포도 비슷하고 손등의 정맥위치도 비슷하고 발걸음도 비슷하게 할 수 있는 확률은 어느 한 분야의 최고의 기슬을 사용한 것보다 낮을 것이다.

단순히 계산을 빨리 해야 하는등의 문제가 아니라 좀더 "잘" 판단해야 하는 문제에 있어서는 베이지언 필터링 같은 하나의 알고리즘에 의존하기 보다는 이처럼 하이브리드 알고리즘이 더 많은 장점을 가질 수 있다.


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

판단에 있어서..  (0) 2009.03.16
구현  (0) 2009.01.12
판단의 기본 아이디어  (0) 2009.01.12
개요  (0) 2009.01.09
Posted by bleujin
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
Framework/스팸 필터링2009. 1. 12. 00:28


공통점을 발견할때까지 쪼개고 그 쪼갠 것들을 다시 각각의 Aspect관점으로 묶는다. 는
객체지향의 십계명을 적는다면 그 삼계 정도에 올라갈 정도로 아주 중요하다. 아마 별 5개를 받을만한 책이라면 무심히 지나쳐버릴 귀퉁이 한곳에 비슷한 구절이 있다.

스팸 판단은 종합적인 판단이라고 했는데...
쪼개고 쪼개면 하나 하나의 개벌적인 판단으로 나뉜다. 이를테면

   - 동일한 내용의 글이 얼마전에 올라왔다.
   - 비속어(금지어)가 많이 사용되었다.
   - 특수문자가 많이 사용되었다. (특수문자와 화이트 스페이스를 제외하고 동일한 글이 올라왔다.)
   - 동일한 사용자(아이피)로 글이 연속으로 올라온다.  
   - 맞춤법의 틀린 정도
   - 동일한 내용 혹은 아이피 혹은 사용자가 이전에 스팸 판단을 받은적이 있다. 등등등..

결국 사람의 두뇌는 이러한 개별적인 판단들이 종합적으로 사고되어 이 글은 스팸이라고 판단하는 것이다. 여기서 어느 하나의 판단을 위반하였다고 해서 바로 그 글은 스팸이다라고 판단되는 것이 아니라는 사실이 중요하다. 단지 각각의 판단에 따라 가중치를 가질뿐이다. 그리고 중요한것은 이를테면 5번째 항목같은 시스템은 시간이 지날수록 자체적으로 발전하고 더 정교해져야 한다. 즉 과거의 정보에 따라 현재의 정보를 유추할 수 있어야 한다. 이는 스팸 판단뿐 아니라 모든 시스템이 갖춰야 할 중요한 비기능적 요구사항중의 하나이다.

어쨌든 각 판단은 +-의 포인트를 가지는 Filter라고 간주를 하면.

public class EmptyContentFilter implements IFilter {

 private int emptyPoint ;
 private int notEmptyPoint ;
 
 public EmptyContentFilter(int emptyPoint, int notEmptyPoint){
  this.emptyPoint = emptyPoint ;
  this.notEmptyPoint = notEmptyPoint ;
 }
 
 public Grade getGrade(IContent content) {
  return new Grade(StringUtil.isEmpty(content.getText()) ? emptyPoint : notEmptyPoint, "message.exception.empty_content") ;
 }

}
런식의 구현을 생각해 볼 수 있다.

모든 개별적인 판단들은 IFilter를 상속받아 getGrade를 구현할 책임을 가진다. getGrade는 해당 content에 Grade(포인트와 메시지)를 반환한다.


동일한 내용을 가지는 컨텐트는 아래와 같이 동일한 내용의 글의 수량을 판단하여 포인트를 매길수도 있다.

public class DuplContentFilter implements IFilter {

 private final List<IContent> RecentContent = new ArrayList<IContent>();

 public Grade getGrade(IContent content) {

  int foundCount = 0;
  for (IContent c : RecentContent) {
   if (c.getText().equals(content.getText())) {
    foundCount++;
   }
  }

  RecentContent.add(content);
  return new Grade(foundCount * -1, "message.exception.duplicate_content");
 }

}
(물론 위와 같이 모든 글의 정보를 List에 저장한다는 것은 바보같은 일이다. 최근 이를테면 몇백개 정도의 Cache형의 Weak나 Soft Map를 구성하거나 글의 내용의 길때는 단순히 Hash 값만 보관해도 충분하다. 기타 자잘한 동시성의 문제는 테스트코드이므로 생략하자-ㅅ-)

이런식으로 모든 개별적인 Filter들은 getGrade를 구현하므로서 content에 대해 point 즉 일종의 점수를 매긴다.

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

판단에 있어서..  (0) 2009.03.16
휴리스틱 알고리즘 + 복합 알고리즘  (0) 2009.03.12
구현  (0) 2009.01.12
개요  (0) 2009.01.09
Posted by bleujin

우리나라의 온라인 시스템에서 스팸 처리를 하는 방식은 아주 원시적이다 -ㅅ-
물론 티스토리 또한 예외가 아니다.

특정 단어나, 특정 아이피, 특정 아이디를 제외하는 방식이다.

1. 특정 단어를 제외하는 방식은 사실 아주 바보같은 방법이다. 예전에 여기저거 포탈등에 댓글에 '최진실'이라는 글자가 들어가면 금지어가 사용되었습니라고 댓글 등록이 안되던 시절이 있었다. (아마도 무능한 어떤 인간이 금지어로 등록하라고 지시를 내려서였겠지만 ) 시험삼아 진실이 누나라고 해보니 등록이 되었다. 단어 기반으로 막는걸 피하는건 아주 쉽다.

2, 그렇다고 관련 단어까지 모두 등록하면 되지 않을까 라고 하는것도 바보같은 생각이다. 피할 수 있는 관련단어는 금지어 등록으로 할 수 있는 것보다 훨씬 많고 사실 등록을 많이 하면 많이 할수록 프로그램으로 검사하는데 시간이 많이 소요된다. 즉 일종의 낭비가 발생한다.

3. 시스템이 빵빵하다로 우겨볼수 있지만 다른 문제가 더 있다. 관련 단어가 많이 등록 될수록 정상적인 글 쓰기 또한 방해된다는 것이다. '진실'이라는 단어는 아주 일반적인 단어이기 때문에 금칙어로 등록이 되면 글쓰기가 불편해진다.

4. 게다가 맘만 먹으면 굳이 일반적인 단어를 쓰지 않아도 된다. 진.실. 이라고 쓰면 그만이고 씨X~ 이라고만 써도 금칙어 따위는 얼마든지 피할수 있다.

5. 아이피나 아이디를 막는 방법도 마찬가지이다. 아이피를 변경하거나 새로운 아이디를 얻는 방법은 너무나 쉽다.
    스팸을 써서 얻는 이득 > 아이피를 변경하거나 새로운 아이디를 얻기 위한 수고 + 스팸글을 쓰는 수고
    이 등식이 성립하는 한 아이피나 아이디로 막는 방법은 효과가 없다.

6. 스팸이라는건 아주 지역적이다. 시스템에 따라 어떤 글이 스팸인지에 대한 판단여부가 다르다는 뜻이다. 심하게는 글에 따라 다를수도 있다. 그에 따라 시스템마다 다른 스팸처리를 만든다면 지나치게 많은 제작 비용과 관리비용이 든다.

위와 같은 단점때문에 관리자가 직접 확인후에 삭제 하는 방법이 있겠지만 이는 관리비용이 너무 많이 든다는 약점이 있다. 24시간 수만개의 댓글등을 봐야하는 관리자의 비용은 유형이지만 스팸을 막음으로써 생기는 이득은 무형이므로 관리자 시스템이 제대로 운영되지 않는다. 



이제 코드를 작성 하기 전에 생각해 봐야 할것은
"스팸이란 무엇인가"에 대한 본질적 질문이다.

개인적으로 컴퓨터 코드를 짜는 방법은 간단한다. 쪼갤수 없을때까지 쪼갠다음 공통점을 찾아서 다시 합치면 된다. -ㅅ-
이를테면 세상을 분자 단위까지 쪼갠다. 일단 쪼갠후 관.점.에 따라 공통점을 가진 분자끼리 묶어보면 세상을 코딩을 할 수 있게 된다.

갑자기 웬 헛소리냐는 말을 하기전에
스팸에 대한 판단은 종합적이다. 즉 단순히 어떤 단어나 아이피의 문제가 아니고 단어와 아이피를 포함하고 문맥과 기타 여러 제반사항등을 모두 고려 대상이 되며 이러한 두뇌는 종합적인 판단으로 이 글은 스팸이군 이라는 결정을 내린다는 뜻이다.

두번째로 각각의 개별적인 판단은 단순히 or나 and 연산이 아니며 꽤 복잡한 연산을 하게된다. 그리고 여기서 연산은 다시 지역적이며 주관적 판단이 들어가게 된다. 단순히 몇몇 단어가 들어갔다고 해서 혹은 특정 아이피에서 쓰여졌다고 해서 스팸이 아니며 그렇다고 스팸이 아니라는 것도 아니다.

사실 위의 2단계는 어느 프로그래밍이나 마찬가지이다. 종합적인 측면을 고려하기 위해 쪼개는 과정은 객관적인 측면이 강하지만 그걸 다시 합치는 측면은 주관적이다. 예컨데 모든 물질을 분자단위로 쪼개는 것은 과학이지만 그걸 합쳤을때 책상으로 인식하는 것은 철학이다.


위의 생각이 너무 추상적이라면 좀 더 실질적인 얘기를 해보면 
  A 스팸을 써서 얻는 이득 < 스팸글을 쓰는 수고 * n개   이 수식만 유지해주면 된다. 
  B 그리고 이 수식을 유지하는데 늘어나는 정상적인 글쓰기의 수고를 최소한으로 유지하여야 한다.

기존 단순 매칭 방식의 스팸 처리방식은 그 방어막을 벗어나기가 너무나 쉽기 때문에 A를 위반한다. 일단 그 방법을 인식하면 스팸을 써서 얻는 이득 > 스팸글(0에 수렴한다) 올리는 수고 * n 개(n은 무한에 수렴) 도 참일 확률이 높다.

그래서 글을 쓸때마다 특정 그림에 뜬 문자를 입력하게 만드는 방식도 있다. 글쓰기마다 글자들은 랜덤으로 나타나기 때문에 스팸글을 올리는 수고는 0에 수렴하지 않으며 따라서 일면적으로는 아주 효율적이다. 그러나 이 방법은 따른 정상적인 글쓰기의 수고도 또한 늘린다. 간단한 댓글을 달기위해 잘 보이지 않는 숫자들 여러개를 입력하는건 아주 짜중이다-ㅅ-

사실 이 방법은 그림에 보이는 글자가 여러개일 필요는 없다. 3개정도면 해도 스팸을 올리기 귀찮을 정도로 충분한 갯수이므로 7개 이상을 유지하는 멍청한 짓은 제발 좀 하지말자-ㅅ- 스팸을 막고자 하는거지 정상적인 글쓰기까지 방해하자는 것은 아니니까 말이다.


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

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