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