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가 최종 답안이 된다.
출처
'추천 시스템 이론' 카테고리의 다른 글
Pytorch Recommend system github 작동 순서 (0) | 2021.04.23 |
---|---|
ALS 알고리즘 (1) | 2021.03.07 |
SGD를 사용한 Matrix Factorization 알고리즘 (1) | 2021.01.13 |
카카오 아레나 Melon Playlist Continuation baseline github 분석 - (3) (0) | 2020.10.26 |
카카오 아레나 Melon Playlist Continuation baseline github 분석 - (1) (0) | 2020.10.19 |
댓글