본문 바로가기
추천 시스템 이론

카카오 아레나 Melon Playlist Continuation baseline github 분석 - (2)

by 블쭌 2020. 10. 20.
728x90

most_popular.py 실행순서에 따른 코드 분석

 

(1) import module

import fire
from tqdm import tqdm

from arena_util import load_json
from arena_util import write_json
from arena_util import remove_seen
from arena_util import most_popular

fire패키지에 대한 설명은 이전 자료를 참고하면 좋을 것 같습니다

여기서 remove_seen과 most_popular 함수가 추가되었는데 뒤에서 차차 설명하도록 하겠습니다


(2) main함수

if __name__ == "__main__":
    fire.Fire(MostPopular)

MostPopular는 class로 정의되어 있는데 하나의 클래스를 interpreter형식으로 인식시켜주게 만들어준다

python most_popular.py run \
 train_fname=arena_data/orig/train.json \
 question_fname=arena_data/questions/val.json

실제 최종 terminal에서 입력하는 값인데 해석해보면

most_popular.py 안에서 run method를 실행하는데 train_fname argument에는 train.json파일을 

question_fname argument에는 val.json을 넣어주면 된다.


(3) run함수

def run(self, train_fname, question_fname):
        print("Loading train file...")
        train = load_json(train_fname)

        print("Loading question file...")
        questions = load_json(question_fname)

        print("Writing answers...")
        answers = self._generate_answers(train, questions)  # -> (4)
        write_json(answers, "results/results.json")

train data불러오고 question data불러오고 답을 작성하는 것이다.


(4) generate_answers함수

def _generate_answers(self, train, questions):
        # 빈도수가 가장 높은 값 출력
        _, song_mp = most_popular(train, "songs", 200) # -> (5)
        _, tag_mp = most_popular(train, "tags", 100)   # -> (5)
        
        
        answers = []
        
        for q in tqdm(questions):
            answers.append({
                "id":q["id"],
                "songs":remove_seen(q["songs", song_mp])[:100], # -> (6)
                "tags": remove_seen(q["tags"], tag_mp)[:10],    # -> (6)
            })

        return answers

(5) most_popular함수

def most_popular(playlists, col, topk_count):
    # list 개수 세기
    c = Counter()
    
    # 각 playlist마다 song or tag 컬럼을 counter에 추가시켜서 업데이트
    for doc in playlists:
        c.update(doc[col])
    
    # 가장 많이 나타낸거 출력
    # topk는 반환형이 (song, 개수) tuple형태
    topk = c.most_common(topk_count)
    return c, [k for k, v in topk]

Counter를 통해 list안의 개수를 세고 가장 topk_count만큼 가장 많이 출력된 col을 불러온다.

_, song_mp = most_popular(train, "songs", 200)
_, tag_mp = most_popular(train, "tags", 100)

song_mp : train에서 상위 200개의 빈도수 song을 불러온다

tag_mp : train에서 상위 100개의 빈도수 tag를 불러온다


(6) remove_seen함수

def remove_seen(seen, l):
    # set자료구조를 통해 중복 제거
    seen = set(seen)
    
    # 실제 데이터에없는 song or tag만 불러오기
    return [x for x in l if not (x in seen)]
answers = []
        
        for q in tqdm(questions):
            answers.append({
                "id":q["id"],
                "songs":remove_seen(q["songs"], song_mp)[:100], # -> (6)
                "tags": remove_seen(q["tags"], tag_mp)[:10],    # -> (6)
            })

        return answers

answers

"id"      -> questions id

"songs" -> question에서 적혀져있는 노래를 제외한 나머지 상위 100개

"tags"   -> question에서 적혀져있는 tag를 제외한 나머지 상위 10개

 

반환되는 answers가 최종 답안이 된다.


출처

github.com/kakao-arena/melon-playlist-continuation

728x90

댓글