[자동 보팅 봇 만들기-3] 화이트 리스트, 블랙 리스트! 키워드로 필터링하기 with Python

안녕하세요, @tmkor 입니다. 좀 더 똑똑한 자동 보팅을 위해, 화이트 리스트와 블랙 리스트로 필터링하는 방법을 알아봅시다.

화이트 리스트란?

화이트 리스트는 행동을 취하기 위해 필요한 키워드의 집합입니다. 예를 들자면..



[평화를 불러오기 위해선 '마사' 한마디면 충분]

라던가,



[우주명작 바이오쇼크는 저 3단어로 조종당하는 사람의 일대기를 다룹죠. would you kindly vote?]

이런 것처럼, 특정한 키워드를 들었을 행동을 취하는 것들의 집합이 화이트 리스트 입니다.

블랙 리스트란?

화이트 리스트의 반대입니다. 특정한 키워드를 들었을 때, 아무런 행동을 취하지 않는 것 입니다. 혹은 음(negative)적인 행동을 하기도 하지요.

예를 들자면,



[설마했던 그런 일이 있었죠]

뭐.. 이런거겠죠..

코딩 타임~

1. 보팅 규칙 확장

먼저 보팅 규칙을 확장해봅시다. 우리에게 추가적으로 필요한 것은 화이트 리스트, 블랙 리스트 단어 집합입니다. 그리고 문서는 제목과, 본문으로 이루어져 있으므로 이들 각각에 대해서 받도록 합시다.

"rule":[
        {"id":"tmkor",
        "mode":"vote",
        "delay":5,
        "title_white":[],
        "title_black":[],
        "body_white":[],
        "body_black":[]}
    ],

예를 들어, @shiho 님의 [척] 시리즈를 보팅하고 싶다면 idshiho title_white["[척]"] 이렇게 입력받으면 되겠지요. 혹은 @twinbraid 님의 이더레이싱 혹은 이더 연예인 시리즈가 너무 슬퍼 빨리 빠져나오시게 보팅을 안하려고 한다면 idtwinbraid, body_black에 `["이더레이싱", "이더 연예인"] 이런식의 입력을 받게 됩니다.

2. 블랙리스트, 화이트리스트 처리 규칙

블랙리스트는 리스트에 포함된 어떠한 단어라도 1개 이상 나타나면 아웃입니다. 즉, 한정명제 중 존재명제(existential proposition)를 이용하면 됩니다. 반대로 화이트 리스트는 전칭명제(universal proposition)를 이용하면 됩니다.

이를 코드로 표현하면..

def universal(W, text):
    if len(W) == 0:
        return True # for whitelist check
    return reduce(lambda x,y:x&y,map(lambda w:w in text, W))

def existential(W, text):
    if (len(W) == 0):
        return False # for blacklist check
    return reduce(lambda x,y:x|y,map(lambda w:w in text, W))

def white_black_check(post,rule):
    t, b = get_title_body(post)
    white = universal(rule['title_white'],t) & universal(rule['body_white'],b)
    black = existential(rule['title_black'],t) | existential(rule['body_black'],b)
    return white and not black

이렇게 됩니다.

결론

화이트 리스트와 블랙 리스트를 이용하면 자동 보팅을 좀 더 똑똑하게 만들 수 있습니다. 물론, 사용자가 지정해놓은 키워드로 움직이니 제한적이긴 하지만, 만약에 마음에 드시는 작가님의 연재글이 있다고 하면 정기적인 후원이 가능해집니다.

참고자료

H2
H3
H4
3 columns
2 columns
1 column
Join the conversation now