안녕하세요, @tmkor 입니다. 좀 더 똑똑한 자동 보팅을 위해, 화이트 리스트와 블랙 리스트로 필터링하는 방법을 알아봅시다.
화이트 리스트란?
화이트 리스트는 행동을 취하기 위해 필요한 키워드의 집합입니다. 예를 들자면..
[평화를 불러오기 위해선 '마사' 한마디면 충분]
라던가,
[우주명작 바이오쇼크는 저 3단어로 조종당하는 사람의 일대기를 다룹죠. would you kindly vote?]
이런 것처럼, 특정한 키워드를 들었을 행동을 취하는 것들의 집합이 화이트 리스트 입니다.
블랙 리스트란?
화이트 리스트의 반대입니다. 특정한 키워드를 들었을 때, 아무런 행동을 취하지 않는 것 입니다. 혹은 음(negative)적인 행동을 하기도 하지요.
예를 들자면,
[설마했던 그런 일이 있었죠]
뭐.. 이런거겠죠..
코딩 타임~
1. 보팅 규칙 확장
먼저 보팅 규칙을 확장해봅시다. 우리에게 추가적으로 필요한 것은 화이트 리스트, 블랙 리스트 단어 집합입니다. 그리고 문서는 제목과, 본문으로 이루어져 있으므로 이들 각각에 대해서 받도록 합시다.
"rule":[
{"id":"tmkor",
"mode":"vote",
"delay":5,
"title_white":[],
"title_black":[],
"body_white":[],
"body_black":[]}
],
예를 들어, @shiho 님의 [척] 시리즈를 보팅하고 싶다면 id
는 shiho
title_white
는 ["[척]"]
이렇게 입력받으면 되겠지요. 혹은 @twinbraid 님의 이더레이싱 혹은 이더 연예인 시리즈가 너무 슬퍼 빨리 빠져나오시게 보팅을 안하려고 한다면 id
에 twinbraid
, 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
이렇게 됩니다.
결론
화이트 리스트와 블랙 리스트를 이용하면 자동 보팅을 좀 더 똑똑하게 만들 수 있습니다. 물론, 사용자가 지정해놓은 키워드로 움직이니 제한적이긴 하지만, 만약에 마음에 드시는 작가님의 연재글이 있다고 하면 정기적인 후원이 가능해집니다.
참고자료
- 실행 가능한 소스코드는 https://github.com/taeminlee/steem.autovote 에서 확인 가능합니다. ^^
- 자동 보팅 딜레이 주기 with Python
- steem API로 자동 보팅 봇 만들어보기 with Python