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