Giter Site home page Giter Site logo

final-project-level3-nlp-04's Introduction

리뷰, 직접 쓰지 말고 이제는 FooReview로!

1. Team

😎 팀원 소개

😎 팀원별 역할

  • 전상민 PM, Review Generation, Star Classification
  • 김신곤 Data Crawling, Retrieval
  • 김재영 Data Crawling, Preprocessing, Image Generation
  • 박세진 Data Preprocessing, Chatbot
  • 손희락 Retrieval, Image Generation, Recommendation
  • 심우창 Data Crawling, Text Style Transfer
  • 이상준 Review Generation, Star Classification, Text Style Transfer

2. FooReview

전체적인 구조입니다.

2.1 Data

서울의 2호선 지하철역 51개를 배달 장소로 선정하여 메뉴, 별점, 리뷰, 카테고리 등 의 주요 정보를 요기요 에서 크롤링 진행하여 AWS의 MySQL DB에 저장하도록 하였습니다.

2.2 Review Generation

2.2.1 Review Re-Tagging

EDA 진행 중, 별점과 리뷰가 상이한 경우를 확인하였습니다. 이에 따라, 유저가 준 별점은 신뢰도가 떨어지는 지표라고 판단했고, 리뷰에 대한 새로운 별점 지표를 마련하고자 했습니다. 별점(1~5점)별로 샘플링한 약 14000개의 데이터를 바탕으로 요리 관련 별점, 배달 관련 별점을 1, 3, 5 점으로 태깅 을 진행하였습니다.

2.2.2 Classification Model

Re-Tagging한 데이터들을 바탕으로 학습을 진행하였을 때, 각 모델은 f1 score에서 다음과 같은 차이를 보였습니다. 이에 따라, 별점 Re-Tagging을 위한 모델로는 RoBERTa-Large로 5-fold를 돌린 모델 을 사용하였습니다.

해당 모델로 크롤링한 60만개의 데이터의 점수를 다시 정의하였습니다. 이 데이터들은 Huggingface Dataset 으로 관리되었고, 이는 리뷰 생성과 키워드 검색의 학습 데이터로 사용 되었습니다.

2.2.3 Generation Model

리뷰 데이터에 대한 inference 결과, 모델의 크기 등을 고려하여 여러 모델들 중에서도 상대적으로 가볍고 inference 소요시간이 적게 걸리는 kogpt2-base-v2 모델 을 선택하였습니다.

2.2.4 Elastic Search

생성된 리뷰와 가장 유사한 기존 리뷰를 얻고, 기존 리뷰의 이미지를 사용하는 방법으로 Elastic Serach를 이용하여 사진 리뷰 기능을 제공 하고자 하였습니다.

2.2.5 Translation standard to dialect

GRU모델은 encoder, decoder로 이용한 seq2seq with attention 방식을 이용하였습니다. 하지만 리뷰 데이터를 input으로 넣어줬을 때 생각보다 잘 바뀌지 않아 최종적으로 KoBART 모델 을 사용하였습니다.

스크린샷 2021-12-22 오후 3 38 11

2.2.6 Additional Functions

  • 입력받은 키워드를 기반으로 식당 추천 후 식당 정보 제공
  • 크롤링 데이터를 분석하여 카테고리별 인기 식당 순위 제공
  • 자동화 적용하여 매일 오전 2시 요기요 리뷰 데이터 크롤링 진행

3. Run FooReview

3.1 git clone

git clone https://github.com/boostcampaitech2/final-project-level3-nlp-04.git
cd final-project-level3-nlp-04

3.2 Requirements Install

pip install -r requirements.txt
pip install git+https://github.com/SKT-AI/KoBART#egg=kobart

3.3 Run FooReview

cd chatbot
python3 discord_bot.py

3.4 What You Need Is

  • Discord Token
  • DB config file

4. Demo Video

  1. Review Generate
2.MP4
  1. Review based Restaurant Top3
2.MP4
  1. Keyword based Restaurant Top10
3.MP4

final-project-level3-nlp-04's People

Contributors

kimziont avatar pseeej avatar raki-1203 avatar sangjun-leee avatar sangmandu avatar singonkim avatar whatchang avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

final-project-level3-nlp-04's Issues

HuggingFace Dataset

Result

ID : samgin
PW : 없음

다음이 설치되어야 합니다.

pip install huggingface_hub

설치가 되었다면, 터미널에 다음과 같이 입력하면 다음과 같이 출력되어야 합니다.
이 때, 아이디와 비밀번호를 입력하면 됩니다.

$ huggingface-cli login

        _|    _|  _|    _|    _|_|_|    _|_|_|  _|_|_|  _|      _|    _|_|_|      _|_|_|_|    _|_|      _|_|_|  _|_|_|_|
        _|    _|  _|    _|  _|        _|          _|    _|_|    _|  _|            _|        _|    _|  _|        _|
        _|_|_|_|  _|    _|  _|  _|_|  _|  _|_|    _|    _|  _|  _|  _|  _|_|      _|_|_|    _|_|_|_|  _|        _|_|_|
        _|    _|  _|    _|  _|    _|  _|    _|    _|    _|    _|_|  _|    _|      _|        _|    _|  _|        _|
        _|    _|    _|_|      _|_|_|    _|_|_|  _|_|_|  _|      _|    _|_|_|      _|        _|    _|    _|_|_|  _|_|_|_|
        
Username: samgin
Password: 
Login successful
Your token has been saved to /opt/ml/.huggingface/token

다음과 같이 불러올 수 있습니다.

from datasets import load_dataset
dataset = load_dataset('samgin/star_tagging')
dataset

>>> DatasetDict({
          train: Dataset({
              features: ['restaurant', 'menu', 'total_star', 'review', 'annotator', 'food', 'delvice', 'label'],
              num_rows: 9812
          })
      })

현재, dataset은 두 종류이며, 차후에도 두 종류로 운영할 것 같습니다.

  • star_tagging : 별점 태깅을 위한 학습 데이터
  • Foo_Review : 디비에 있는 데이터를 불러와 별점 태깅 작업을 거친 데이터

추후에, 자동화로 관리할 때는 다음과 같이 하면 됩니다.

git clone https://huggingface.co/datasets/samgin/<dataset name>

cd <dataset name>

(파일 추가)

git add . && git commit -m "Update"

git push

주의할 점은, 해당 폴더가 현재 git으로 관리되는 final-project 내부에 있으면 안된다는 것입니다. 만약 내부에 존재하면, 부모 git repo 안에, 자식 git repo를 관리하게 되는데 이 때는 git submodule을 활용해야 하지만, 생소하므로 외부에 위치시켜 주세요.

또한 커밋시에 다음과 같은 오류가 발생할 수 있습니다.

*** Please tell me who you are.

Run

  git config --global user.email "[email protected]"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

이 때는, 다음을 수정하지 말고 그대로 입력하면 됩니다. (이메일과 이름을 바꾸지 마세요)

git config --global user.email "[email protected]"
git config --global user.name "Your Name"

Task

허킹페이스 데이터셋 등록

  • 상민

Modeling : Text Style Transfer

2021/12/13(월)

내용

Text Style Transfer - Kakao entertainment code

  • 스타일에 대한 pair 데이터를 모으기가 현실적으로 힘들기 때문에 unsupervised learning에 대한 기법 소개
스크린샷 2021-12-13 오후 11 43 32 - 위와 같이 unsupervised learning을 할 경우 1을 통해서 주어진 스타일에 알맞은 문장을 생성하도록 훈련하고 그 후 반전 스타일에 대해서 훈련하도록 설계함 - 위에서 1번의 경우 dis_model.py에 구현이 되어 있고 2는 gen_model.py에 구현이 되어있다.
  • dis_model.py

    • 2번에서 분류기의 역할을 하는 것 같다.
    • dis_model.py의 모델을 훈련시키는 train.py의 동작과정을 매우 단순화하면 아래와 같다.
      1. Target 문장에 대해서 gpt_tokenizer를 이용하여 encode한 후 tensor로 변환하여 unsqueeze를 해준다.
      1. dis_model에 있는 discriminator라는 메소드에 a에서 얻은 값을 input으로 집어넣어서 output을 얻는다.
      1. b에서 얻은 output을 cls_loss라는 메소드에 넣고 output을 얻는다.
      1. 역전파후 다시 학습시킨다.
  • gen_model.py

    • 2번에서 인코더와 디코더이며 분류기로부터 나오는 output에 대해서 스타일 손실함수를 계산하고 역전파까지 하는 모델
    • SST를 위한 main 모델이다.
    • gen_model.py의 모델을 훈련시키는 train.py의 동작과정을 단순화하면 아래와 같다.
      1. Target 문장에 대해서 gpt_tokenizer를 이용하여 encode한 후 tensor로 변환하여 unsqueeze를 해준다.
      1. 문장에서 스타일을 삭제하는 과정(<- 아직 제대로 이해하지 못함)
      • 아래와 같이 문장에서 스타일에 영향을 주는 단어라고 생각하는 문장을 찾고 삭제하는 과정
        image
      1. 내용 사진의 2번과 같이 문장이 encoder를 거치고 나온 값에 반전 스타일 요소를 추가하여 output을 얻어낸다.
      1. recon_loss를 구하는데 재구성 손실함수 같은데 정확하게 뭔지는 모르겠다.
      1. c에서 얻은 값을 분류기에 넣고 스타일 손실함수를 구해준다.
  • Text Style Transfer에 대해서 각자 공부하기
  • kakao entertainment의 gen_model.py 코드 분석하기 -> 진행중
    *만약 오늘 위의 두개를 다 끝냈다면 바로 코딩하면서 적용해보기
    *추가 참고 코드도 읽어보면서 모르는 것, 우리 task에 적용할 때 필요할 것 같은 정보 들을 생각에서 제작자에게 질문하기

*추가 참고 코드

  • 김성현 마스터님 코드
  • 진명훈님 코드

2021/12/14(화)

내용
  • 의논하고 싶은 내용
    • 사투리로 변한해주는 모델을 사투리별로 각각 만들 것인가 아니면 한 모델이 여러 사투리로 바꿔줄 수 있게 할 것인가?

=> 둘 다 해보자

  • 데이터 관련
    • 각 사투리 데이터에서 사투리가 포함된 문장에 대해서만 따로 뽑아서 사용해야 될 것 같다. -> kakao코드에서 데이터가 그런 형식이기 때문

정제한 데이터
*각 train, valid마다 표준어, 사투리 데이터가 있는데 아래 표는 표준어의 개수만 적었다. 대부분의 표준어와 사투리의 개수는 동일하다.

강원도 경상도 전라도 제주도 충천도
total 1,963,691 75,390 636,284 2,622,446 63,730
train(표준어) 921,204 36,327 300,961 1,175,141 28,857
valid(표준어) 60,641 1,368 17,181 136,081 3,008

*발생한 문제
강원도-train의 표준어와 사투리의 정제한 데이터 개수가 다르다. -> 사투리가 1개 더 많음
제주도-train의 표준어와 사투리의 정제한 데이터 개수가 다르다. -> 사투리가 2개 더 많음

상준님 idea

  • 정제한 데이터가 표준/사투리로 있으니 supervised learning을 사용할 수 있지 않을까? -> 가능할 것 같다.
  • 그러면 사투리 당 하나의 모델을 만들어야 되나? 왜냐하면 각 사투리 데이터마다의 표준 문장이 다르니까. -> 음... 모델 한개에게 여러 데이터를 섞어서 주면 한 모델에서 여러 사투리로 transfer 해줄것 같다.
  • 그러면 위에서 input은 문장 + <바꾸고 싶은 사투리 token> 으로 주고 label은, 0(강원),1(경상),2(전라),3(제주),4(충천) 해주면 되나? -> 음... 그러지 않을까? 싶다 ㅎㅎ;;;
  • 코드 분석하면서 모르는 것 서로 공유하기
  • kakao 코드 돌려보고 결과 한번 보기 <- 잘 돌아가는지, 결과가 어떻게 나오는지 궁금하기 때문
  • 데이터 정제하기
    *시간이 되면 SST 코드 작성(수정)하기

2021/12/15(수)

내용

데이터 관련 문제

  • 이전 코드에서 처리하지 못한 여러 패턴들이 존재
  1. 괄호 안에 내용이 없는 경우

스크린샷 2021-12-16 오전 3 58 24

  1. 사투리가 괄호 밖에 존재하는 경우
  2. 사투리와 표준어가 '/'로 구별되지 않는 경우
    스크린샷 2021-12-16 오전 3 55 22

위와 같은 데이터를 제외하기로 판단

기존 데이터 개수

강원도 경상도 전라도 제주도 충천도
total 1,963,691 75,390 636,284 2,622,446 63,730
train(표준어) 921,204 36,327 300,961 1,175,141 28,857
valid(표준어) 60,641 1,368 17,181 136,081 3,008

데이터 제외 후 개수

강원도 경상도 전라도 제주도 충천도
total 1,961,086 75,364 635,324 2,611,602 63,632
train(표준어) 919,963 36,314 300,508 1,170,315 28,810
valid(표준어) 60,580 13,68 17,154 135,486 3,006

제외된 데이터 개수

강원도 경상도 전라도 제주도 충천도
total 1,302 13 480 5,421 49
train(표준어) 1,241 13 453 4,826 47
valid(표준어) 61 0 27 595 2
  • 데이터 개수 mismatch 문제 해결하기 -> 새로운 코드 작성
  • supervised 방식으로 학습시키는 모델 코드 작성하기
  • kakao SST 방식으로 학습하는 모델 코드 작성하기 <- 하지 못함 ㅠㅠ

2021/12/16(목)

  • kakao SST 방식으로 학습하는 모델 코드 작성하기(우선 한 개의 사투리/표준어 데이터만 사용해보기)

2021/12/17(금)

2021/12/18 ~ 2021/12/19(주말)

2021/12/20(월)

내용

이전에는 text 파일로 패턴을 찾아서 데이터를 추출하였지만사투리/표준어가 잘 구분되어 있지 않았음. -> 그래서 json 파일을 다시 대상으로 다시 추출

결과적으로 다시 학습시켜야 되는 문제 발생!!!

  • SST 분류기
    데이터 : 경상도 train 30,000개를 가지고 학습
    batch size :1024

  • SST style model 학습
    데이터 : 경상도 train 10,000개를 가지고 학습
    batch size : 128
    (시간이 너무 걸림)

  • seq2seq 학습
    데이터 : 경상도 train 10,000개를 가지고 학습
    batch size : 1

  • 데이터 다시 추출(완료)
  • SST 분류기 학습 (완료)
  • SST style model 학습 (진행중)
  • seq2seq 학습 (진행중)

Modeling : Review Generation & Star Classification

작성 규칙

  • 금일 계획 수행
  • 회고
  • 금일 결과 작성 및 분석
  • 익일 계획 수립

주간 목표

  • 리뷰 생성 모델 : input format 평가
  • 리뷰 생성 모델 : 카카오 GPT
  • 리뷰 생성 모델 : GPT Trinity
  • 메뉴 구분 모델
  • 별점 분류 모델 : KLUE/Roberta
    • Pretraning
    • Finetuning
  • 별점 분류 모델 : KoElectra
    • Pretraning
    • Finetuning

21년 12월 12일 일

Task

총 정리

  1. 메뉴 구분 모델은 고난이도 태깅 작업과 가이드라인이 필요하므로 시간상 하지 않기로 했다.
  2. 리뷰 생성 모델은 GPT-2와 GPT-2 Trinity로 결정. 카카오 GPT는 너무 커서 학습이 되지 못한다.
  3. 별점 태깅 1만개가 끝났으며, 별점 분류 모델로 KLUE/Roberta-Large는 77점, KoElectra-v3는 75점을 달성했다. 추후에, hold out 방식으로 valid점수가 낮은 1~2인의 점수를 수정하려고 한다.

21년 12월 11일 토

Task

21년 12월 10일 금

Task

  • 메뉴 구분 모델
  • 리뷰 생성 모델

21년 12월 09일 목

Task

  • 메뉴 구분 모델

21년 12월 08일 수

Task

  • 별점 분류 모델
  • 리뷰를 받으면, 맛점수와 배달점수로 나누어서 output
  • KoElectra => pretraining & finetuning
  • 메뉴 구분 모델
  • ?
  • 리뷰 생성 모델
  • ?

21년 12월 07일 화

Task

  • 카카오 GPT
  • 세팅
  • 200epoch
  • 파일럿 데이터
  • 방법 1, 3
  • GPT-2 Trinity
  • 세팅
  • 200epoch
  • 파일럿 데이터
  • 방법 1, 3
  • 리뷰 생성 모델
  • 200epoch
  • 파일럿 데이터
  • 방법 1, 3
  • 별점 분류 모델
  • 리뷰를 받으면, 맛점수와 배달점수로 나누어서 output
  • KLUE/RoBerta => pretraining & finetuning

21년 12월 06일 월

결론

추후에 모델을 학습하고 나서 방법1과 방법3을 다시 적용해보도록 한다.

회고

image
image

  • 샤브샤브는 데이터에 없는 음식이다 보니 리뷰를 생성할 때, 최대한 샤브샤브를 지양하고 내뱉는 모습이다. 5점 리뷰중에 특정 음식에 대한 언급이 없는 리뷰가 많아서 가능한 것으로 보인다. 반면에 1점 리뷰의 경우에는 대부분 특정 음식을 언급하기 때문에 샤브샤브인데도 다른 음식에 대한 리뷰로 섞여나오는 것으로 보인다.

image

  • 문장이 좀 더 길어야 될 것 같음. 또한 epoch 50번을 한다고 모델이 잘 학습하는 것은 아닌 것 같음. epoch를 좀 더 길게해보자.

image

  • 찌개에 대해 상당히 구체적인 리뷰라서 놀랐음. 다만, 길이가 길수록 굉장히 특정 경험적인 리뷰가 생성되어서 너무 긴 글자수 역시 제한을 해야하나 싶은 고민이 들었음

Task

SKT-GPT Finetuning 발전

  • 점수 종합하기

종합 (상민 + 상준)

모델 1 : 80 + 89 = 169
모델 2 : 72 + 78 = 150
모델 3 : 86 + 86 = 172
모델 4 : 82 + 84 = 166

상민

2 3 3 2 10
3 3 2 2 10
3 3 2 4 12
2 2 2 2 8

4 4 2 4 14
4 3 3 3 13
4 3 4 4 15
4 3 3 3 13

3 3 2 1 9
1 1 3 3 8
3 3 3 2 11
3 4 1 3 11

1 1 1 3 6
1 1 1 1 4
1 1 1 1 4
2 1 3 1 7

4 1 4 4 13
1 3 3 3 10
4 3 3 3 13
3 4 1 4 12

1 1 4 4 10
1 1 1 4 7
4 4 4 1 13
4 1 4 3 12

3 1 1 1 5
3 3 3 3 12
3 3 3 3 12
1 3 4 3 11

1 4 4 4 13
1 1 3 3 8
1 3 1 1 6
1 1 3 3 8

상준

1-1 : 2/3/3/2 10
1-2 : 3/3/2/2 10
1-3 : 3/3/2/4 12
1-4 : 2/2/2/2 8

2-1 : 4/4/2/4 14
2-2 : 4/3/3/3 13
2-3 : 4/3/4/4 15
2-4 : 4/3/4/3 14

3-1 : 4/4/1/4 13
3-2 : 2/1/3/2 8
3-3 : 3/1/4/1 9
3-4 : 3/4/2/3 12

4-1 : 2/2/2/4 10
4-2 : 2/1/2/2 7
4-3 : 2/3/1/2 8
4-4 : 2/2/4/1 9

5-1 : 4/1/4/4 12
5-2 : 1/3/3/3 10
5-3 : 4/3/3/3 13
5-4 : 3/4/1/4 12

6-1 : 2/2/4/4 12
6-2 : 1/1/1/4 7
6-3 : 4/4/4/1 13
6-4 : 4/1/4/3 12

7-1 : 3/1/2/2 8
7-2 : 3/3/3/3 12
7-3 : 3/3/2/2 10
7-4 : 4/3/1/3 11

8-1 : 1/1/4/4 10
8-2 : 2/2/3/4 11
8-3 : 2/1/1/2 6
8-4 : 1/1/3/1 6

  • 문장 평가하기
  • 별점 기준과 문장 선별 기준은 Week 1 참조

있는 가게와 있는 메뉴

직화신불닭&국물닭발-강북, 찜, 5점

  • 방법 1
    image
  • 방법 2
    image
  • 방법 3
    image
  • 방법 4
    image

BBQ-대구수성점, 치킨, 1점

  • 방법 1
    image
  • 방법 2
    image
  • 방법 3
    image
  • 방법 4
    image

있는 가게와 없는 메뉴

야미가-대구경북대점, 샤브샤브, 5점

  • 방법 1
    image
  • 방법 2
    image
  • 방법 3
    image
  • 방법 4
    image

선녀와나무꾼한식분식, 간장게장, 1점

  • 방법 1
    image
  • 방법 2
    image
  • 방법 3
    image
  • 방법 4
    image

없는 가게(메뉴 유추 가능)와 있는 메뉴

원조상준분식, 김밥, 5점

  • 방법 1
  • image
  • 방법 2
    image
  • 방법 3
    image
  • 방법 4
    image

고급상민한식당, 찌개, 1점

  • 방법 1
    image
  • 방법 2
    image
  • 방법 3
    image
  • 방법 4
    image

없는 가게(메뉴 유추 불가)와 없는 메뉴

상상플러스, 랍스타, 5점

  • 방법 1
    image
  • 방법 2
    image
  • 방법 3
    image
  • 방법 4
    image

핫식스, 버섯전골, 1점

  • 방법 1
    image
  • 방법 2
    image
  • 방법 3
    image
  • 방법 4
    image

Timeline

4시 시작

Star Classification Tagging & Re-Tagging

메인 태깅

9개의 클래스를 분류하는 모델을 구현했다. 추후에 1개의 클래스(객관적 표현)를 추가할 것이다. RoBerta와 Electra는 다음과 같은 성능을 가진다.
image

f1 점수가 80점이 넘지를 못한다. 그 이유는 다음과 같이 추측한다.

  • 가이드라인이 애매해서 각자의 태깅이 동일한 분포를 형성하지 못했다
  • 사람이라 실수를 할 수(또는 가이드라인을 오해할 수) 있는데, 각 문제당 한명의 사람이 태깅해서 검수를 하지 못했다.

해결책은, 좀 더 엄밀한 가이드라인을 세우는 것과 한 문제에 대해 여러 사람이 붙는 것.

  • 그렇지만 가이드라인은 꽤 잘 세운편이다. 완벽하지는 않지만 큰 틀을 잘 정했다.
  • 한 문제에 대해 여러 사람이 붙을 시간이 없다. 제한된 시간 내에서 프로젝트를 수행하려면 완벽하게 태깅하기란 어렵다. 1인당 2천개 가까이 되는 데이터를 태깅했는데, 또, 2천개, 4천개를 돌아가면서 보는 것은 굉장히 힘들다.

그렇지만, 성능을 높이기 위한 최고의 방법은 어떠한 테크닉을 적용하는 것이 아닌 데이터를 정제하는 것이다. 따라서 많은 데이터 중 효율적으로 이상치 데이터를 재태깅 해야한다.

재태깅

여기서는, 다음과 같이 정의한다. 1명의 태깅에 대해, 6명의 분포와 일치하지 않은 문제들을 이상치로 정의한다. 따라서 6명의 데이터를 Train dataset으로, 1명의 데이터를 Vali dataset으로 설정한 뒤 이를 인원 수 만큼 반복해, 개인의 태깅에 대해 집단 분포와 다른 문제들을 추린다. 이들을 다시한번 검수함으로써, 효율적으로 재태깅을 해 성능을 높이고자 한다.

image

이후, 해당 문제들을 이전의 태깅과 모델의 예측을 고려해서 다시 태깅한다. 개인당 200개 정도의 태깅을 했다.

image

성능이 약 6점 정도 상승했다!

12월 2일(목) - 12월 5일(일)

Task

2호선 Pilot 끝내기

  • 우창, 신곤
  • 2호선 전체 크롤링 데이터
  • 중복 유부 확인하면서 크롤링

DB 연동

  • 희락, 세진
  • 크롤링 데이터를 디비로 관리
  • 버전관리
  • 중복제거

모델링

  • 상민, 상준
  • KoGPT-SKT output
  • KoGPT-Kakao setting

파일럿 결과 이후 관찰할 것

  1. 전체리뷰의 별점분포
  2. 사진리뷰의 별점분포
  3. 1점과 3점의 리뷰 내용
  4. 2점과 4점을 어떻게할지
  5. 배달평점이 없었을 때의 분포

Data Crawling

작성 규칙

  • 금일 계획 수행
  • 회고
  • 금일 결과 작성 및 분석
  • 익일 계획 수립

21년 12월 06일 월

Crawling time 시간 줄이기

Webdriver.until 로 기존 크롤링 시간 대비 30% 정도 줄였다.

사용한 곳

  • review 더보기 후 기다리는 부분
  • 식당 클릭한 후 정보 기달리는 부분
  • 식당에서 크롤링한 후 뒤로 가는 부분

page crush

서버에서 해당 크롤링 파일을 실행시 발생하는 에러 <- 아직까지 해결하지 못함
공유 메모리 관한 에러인 것 같다. -> 해결 방법에 대한 코드는 현재 우리 코드 안에 포함되어 있다. 그러나 여전히 오류는 발생한다.

현재 파악한 정보

  • local에서 돌리면 해당 이슈가 발생하지 않고 잘 동작한다.
  • 서버의 프로세스 당 사용할 수 있는 공유메모리의 최대 크기에는 전혀 문제가 없었다.
  • Docker와 관련된 문제이지 않을까 추측

문제를 해결하기 위한 방안

  • EC2 서버에서 해당 파일을 실행하기
  • 각 카테고리마다 크롬의 쿠기 혹은 캐쉬 정보를 제거할 수 있다면 제거해주고 실행하기

진행 상황

  • 현재 각 카테고리 별로 chrome driver를 종료하고 다시 실행시키는 방향으로 문제를 해결하려고 함, 코드는 작성완료 했고 현재 테스트 중

21년 12월 07일 화

Task

21년 12월 08일 수

Task

21년 12월 09일 목

Task

21년 12월 10일 금

Task

Timeline

4시 시작

Modeling : Retrieval & Recommended

12월 22일 수요일

희락

  • elastic search 결과와 dense retrieval model 결과로 inference 하는 부분 추가

12월 21일 화요일

희락

  • 새로 추출한 키워드 & 리뷰 데이터를 토대로 Elastic Search Index 저장
  • Dense Retrieval Model 학습

12월 20일 월요일

희락

  • 리뷰 길이가 20 이상인 데이터 사용
  • query text 정제 방법
    • 영어로 번역(Pororo)
    • 한국어로 번역(Pororo)
    • 리뷰 전처리
    • TFIDF 를 이용한 리뷰의 키워드 분리 후 embedding vector 저장
    • SentenceTransformer 를 이용한 문장 embedding vector 저장
    • 리뷰의 키워드를 리뷰와 유사도비교해 가장 유사한 10개의 키워드 추출
text_list = df.preprocessed_review_context.tolist()

mt = Pororo(task="translation", lang="multi")

back_translation_list = []
pbar = tqdm(text_list)
for i, text in enumerate(pbar):
    # print(f'{i}th text:', text)
    en_text = mt(text, src="ko", tgt="en")
    ko_text = mt(en_text, src="en", tgt="ko")
    back_translation_list.append(ko_text)
    description = f"{i+1}th ko_text: {' '.join(ko_text)}"
    pbar.set_description(description)
    # print(f'{i}th keyword:', ' '.join(temp))

df['back_translation'] = back_translation_list

text_list = df.apply(lambda x: x['preprocessed_review_context'] + x['back_translation'], axis=1).tolist()

# 리뷰하나씩 키워드로 분리(tfidf-vectorizer)
token_review_list = []

for text in text_list:
    try:
        review_vectorized = TfidfVectorizer(ngram_range=n_gram_range).fit([text])
        token_review = review_vectorized.get_feature_names()  

        token_review_list.append(token_review)
    except Exception as e:
        # print(text)
        token_review_list.append([])
df['review_tfidf'] = token_review_list

model = SentenceTransformer('distiluse-base-multilingual-cased-v2')

# 키워드 임베딩

review_embedded_list = []
count_embedded_list = []

for text in tqdm(text_list):
    embedding_review = model.encode([text])
    review_embedded_list.append(embedding_review)

for i in tqdm(df['review_count']):
    embedding_count = model.encode(i)

count_embedded_list.append(embedding_count)

top_n = 10

distances = []
keywords = []

for i in tqdm(range(len(review_embedded_list))):
    try:
        distance = cosine_similarity(review_embedded_list[i], count_embedded_list[i])
        keyword = ['#' + df['review_count'][i][index] for index in distance.argsort()[0][-top_n:]]

        distances.append(distance)
        keywords.append(keyword)
    except:
        distances.append([])
        keywords.append([])

df['keyword'] = keywords

12월 18일 토요일

희락

  • 리뷰 길이가 20 이상인 데이터 사용
  • query text 정제 방법
    • 리뷰 문장 요약(Pororo)
    • 영어로 번역(Pororo)
    • 한국어로 번역(Pororo)
    • 형태소 분석기(Mecab)로 조사 관련 제거

mecab = Mecab()

sample_df = df.sample(3000)
text_list = sample_df.preprocessed_review_context.tolist()

summ = Pororo(task="summarization", model="bullet", lang="ko")
mt = Pororo(task="translation", lang="multi")

keyword_list = []
pbar = tqdm(text_list)
for i, text in enumerate(pbar):
    # print(f'{i}th text:', text)
    summ_text = summ(text)[0]
    en_text = mt(summ_text, src="ko", tgt="en")
    ko_text = mt(en_text, src="en", tgt="ko")
    temp = []
    temp_set = set()
    for pos in mecab.pos(ko_text):
        if pos[1] not in ('NR', 'MM', 'JKS', 'JKC', 'JKG', 'JKO', 'JKB', 
                          'JKV', 'JKQ', 'JX', 'JC', 'EP', 'EF', 'ETN', 'ETM', 'SF', 'SE',
                          'SSO', 'SSC', 'SC', 'SY', 'SL', 'SH', 'SN'):
            if pos[0] not in temp_set:
                temp.append(pos[0])
                temp_set.add(pos[0])
    keyword = ' '.join(temp)
    keyword_list.append(keyword)
    description = f"{i+1}th keyword: {' '.join(temp)}"
    pbar.set_description(description)
    # print(f'{i}th keyword:', ' '.join(temp))

sample_df['keyword'] = keyword_list
  • 모델 저장
    • klue/roberta-small
    • klue/bert-base

12월 17일 금요일

12월 16일 목요일

희락

  • Dense Retriever 구현
    • 추천시스템 - 사용자 검색과 리뷰들을 유사도 기반 매장 추천
    • ODQA 에서는 question - context 쌍이 있었는데 이걸 어떻게 만들까?
    • elastic 에서는 index 에 리뷰들을 다 저장해놓고 유사한 리뷰 뽑아내고 그에 맞는 가게이름을 매칭하면 될 것 같은데
      • 왜? 어차피 search() 함수를 통해서 키워드가 들어오면 그에 맞는 데이터를 가져올테니까
      • 그렇지만 이것도 문제인게 validation 할게 없어서 elastic 이 얼마나 잘 가져오는지 확인할 방법이 현재로서는 없음
    • dense 에서는 학습을 위한 바삭한 - 튀김이 바삭한게 너무 맛있네요 이런 형용사 - 리뷰 쌍의 데이터가 필요할 것 같음
    • 그런데 이걸 어떻게 만들까?

12월 15일 수요일

추천시스템 공부 자료 검색

  • 세진

Elastic Search 구현

  • 신곤

Chat Bot : Discord

12월 18일 토요일

12월 17일 금요일

12월 16일 목요일

12월 15일 수요일

디스코드 챗봇-구현

  • 세진
    • 카테고리 별로 베스트 5 추천하기

12월 14일 화요일

디스코드 챗봇-리뷰생성 파이프 라인 구성

  • 상민

디스코드 챗봇-구현

  • 상민

    • 초기화면 : 옵션제공
  • 상민, 신곤

    • [1] 리뷰 생성 클릭 시 임의의 주문내역 또는 직접입력 할 수 있도록 구현
    • 입력된 데이터를 파이썬으로 전송하며, 이를 임의로 처리해서 챗봇으로 반환하기
  • 세진

    • [2] BEST 음식점 클릭 시 출력할 수 있도록 구현
    • 음식점 별 평균 별점 구하기

프로젝트 계획

12월 2일(목) - 12월 5일(일)

2호선 Pilot 끝내기

  • 우창, 신곤
  • 2호선 전체 크롤링 데이터
  • 중복 유부 확인하면서 크롤링

DB 연동

  • 희락, 세진
  • 크롤링 데이터를 디비로 관리
  • 버전관리
  • 중복제거

모델링

  • 상민, 상준
  • KoGPT-SKT output
  • KoGPT-Kakao setting

12월 6일(월) - 12월 12일(일)

전처리, 자동화

  • 우창, 신곤, 희락, 세진

모델링

  • 상준, 상민

태깅

  • 전체 참여
  • 태깅 준비 :

챗봇

12월 13일(월) - 12월 19일(일)

12월 20일(월) - 12월 26일(일)

우선순위

태깅 - 별점 1,3,5 태깅

매장평가 - 별점으로 해당 매장 평가

태깅 - 음식 중분류 태깅

리뷰 생성 - 단순 리뷰

토글형 챗봇

  • 토글형 룰베이스(필수) : 카카오 API 이용
  • 카테고리 추천(단순 조건)
  • 매장평가를 통한 추천(단순 조건)
  • 동일한 카테고리에서 해당 매장의 순위(단순 조건)
  • 월별 매장 추천(단순 조건)

추천시스템 - 사용자 검색과 리뷰들을 유사도 기반 매장 추천

추천시스템 - 사용자 리뷰 분석후 추천

리뷰생성 - 사진 리뷰 : DALL-E pytorch

리뷰생성 - Style Transfer(사투리, 반말-존댓말)

12월 13일(월) - 12월 19일(일)

수목금 계획

수요일

상민

  • re-tagging csv 준비(7시) - (10시) => star classification model learning -> db data -> huggingface Foo review
  • gpt generation re-coding -> main push

재영, 희락

  • 데이터 증강
  • 리뷰 제외하고 메뉴만 넣기
  • 대표사진 reference

우창, 상준

  • 데이터 문제 해결
  • 모델 5개 돌려보기 (접근 방향은 데이터셋 많은거 1, 적은거 1)

신곤

  • Elastic 구현
  • 1search 1question

세진

  • discord 2번 기능 구현
  • airflow 알아보기

db.sqlhelper => "preprocessed_review"

목요일

상민

금요일

토요일

일요일

챗봇

  • 신곤, 상민, 세진
  • 토글형 Rule Based
    • 1. 리뷰 생성 버튼
    • 2. 지난달 베스트 매장
    • 3. 카테고리 별 베스트 매장

사진 리뷰 생성

  • 재영, 희락

  • 리뷰를 주면 이에 해당하는 이미지 생성

  • url로 저장한 이미지 학습

  • DALL:E Pytorch

  • 12월 13일(월)

    • DALLE-pytorch github 탐색
    • 코드적용? 가능하다면...

Style Transfer

  • 우창, 상준

추천 시스템

  • 상민, 상준
  • 시간 되면

12월 6일(월) - 12월 12일(일)

크롤링, DB연동, 전처리, 자동화

  • 우창, 신곤
  • 시간 이슈 : time.sleep 개선하기
  • 터미널 cpu 사용량 파악 후 여러 terminal 사용하기, 또는 팀원의 터미널 빌리기
  • 일별 Task 계획 세우기
  • 주별 Task 계획 세우기
  • 희락, 세진, 재영
  • DB 테스트
  • 일일 크롤링 코드 추가 + 자동화
  • 전처리 추가 + 자동화
  • 일별 Task 계획 세우기
  • 주별 Task 계획 세우기

모델링

  • 상준, 상민
  • 별점 구분 모델
  • 메뉴 구분 모델
  • 추천시스템 모델
  • 일별 Task 계획 세우기
  • 주별 Task 계획 세우기

태깅

  • 전체 참여
  • 태깅 준비 : 희락, 재영

별점 태깅 - 희락

  • 파일럿 : 1~5점 40개씩 총 200개
  • 메인 : 10000개
  • 월요일 준비
  • 화요일 파일럿 태깅
  • 수요일 메인 태깅

금토일 역할

  • 전체 : 금요일까지 태깅 완료
  • 재영 : DALL:E
  • 상준, 상민 : 리뷰 생성, 별점 분류
  • 우창, 희락 : 크롤링-자동화
  • 신곤 : 챗봇 API

Data Tagging

태깅

  • 전체 참여
  • 태깅 준비 : 희락, 재영

별점 태깅 - 희락

  • 파일럿 : 1~5점 40개씩 총 200개
  • 월요일 준비

  • 화요일 파일럿 태깅

    머리카락, 이물질 이 들어있다고 한 리뷰가 생성되면 문제가 되므로 후처리가 필요
    평범한 거 + 좋은거 = 5
    평범한 거 + 나쁜거 = 1
    괜찮은데 = 3
    뭐라 드릴말이 없습니다 = 1
    오배송, 미배송 = 배달 서비스 문제
    영어는 전처리로 제외
    면이 불었다면 = 배달 서비스 문제
    배달비의 대한 안좋은 표현 = 배달 서비스 문제

  • 수요일 메인 태깅

    • 메인 : 10000개 준비

중분류 태깅 - 재영
* 파일럿 : 매우 다양하게 500개
* 메인 : 10000개
- [ ] 목요일 파일럿 태깅
- [ ] 금요일 메인 태깅

Data Preprocessing

TODO List

  • 희락, 세진, 재영
  • DB 테스트
  • 일일 크롤링 코드 추가 + 자동화
  • 전처리 추가 + 자동화
  • 일별 Task 계획 세우기
  • 주별 Task 계획 세우기

21년 12월 06일 월

Task

  • 세진, 재영
  • 리뷰 전처리 중복되는거
  • 맞춤법
  • 희락
  • review text 에 이모티콘 변경없이 저장되도록 작업
    • EC2 서버의 mysql 설정을 utf8mb4 로 바꿔줘서 해결! 👍
  • DB 테스트

사용방법
0. chmod 777 main_crawling_{맡은번호}.sh crawling_{맡은번호}.sh 실행권한부터 주세요!

  1. 각자 폴더의 위치와 폴더명이 다를 수 있으므로 그 부분을 수정해준다.
    - bash 폴더에 있는 crawling_{맡은번호}.sh 를 들어가보면 아래와 같이 나올거에요
    image
    - 저는 /opt/ml/final_project 이 위치에 new_review_crawling.py 파일이 있어서 cd 를 통해서 폴더위치로 이동했어요
    - 실행할때의 현재 위치에 따라서 폴더를 찾고 못찾고 할 수 있으니 꼭 변경해주셔야 합니다.
    - 그 다음은 python3 하고 뒤에 실행하는 부분에서도 폴더위치 동일하게 수정해주세요!
  2. 각자 맡은 번호의 main_crawling_{맡은번호}.sh 파일을 수정한다.
    image
    - 여기도 mkdir 부분이나 밑에 echo 하고 "" 안에 적힌 부분 모두 폴더명 자기의 셋팅환경에 맞춰서 수정해주세요
  3. 마지막으로 main_crawling_{맡은번호}.sh 실행해주세요
    ex) 1번이 맡은 번호라면 bash main_crawling_1.sh
  4. crontab -l 을 실행해서 잘 등록됐는지 확인해주세요
    image

이렇게 하고 나면 새벽 2시에 자동으로 크롤링이 실행될거에요 그리고 log 파일이 쌓일건데 다음날 안쌓인 분은 얘기해주세요

Modeling : Review Generation & Star Classification

12월 18일 토요일

12월 17일 금요일

12월 16일 목요일

태깅 데이터 1.2만개 학습

  • ??

파라미터 서치

  • ???

12월 15일 수요일

재태깅 csv 제작

  • 상민

12월 14일 화요일

Result

Hold-out으로 Valid 점수 낮은 2인 선정

Task

태깅 데이터 1만개 전처리

  • 상민

태깅 데이터 1만개 학습

  • 상민 : Roberta-Large
  • 상준 : Electra

Hold-out으로 Valid 점수 낮은 2인 선정

  • 상민
  • 점수에 따라, 인원은 변동될 수 있음

학습한 별점 분류 모델로 전체 데이터 Inference

  • 상준

전체 데이터로 GPT-2 학습

  • 상민

전체 데이터로 GPT-2 Trinity 학습

  • 상준

Modeling : Image Generation with DALLE

사진 리뷰 생성

  • 재영, 희락

  • 리뷰를 주면 이에 해당하는 이미지 생성

  • url로 저장한 이미지 학습

  • DALL:E Pytorch

  • 12월 13일(월)

    • DALLE-pytorch github 탐색
  • 12월 14일(화)

    • 크롤링 데이터 셋으로 pre-training
    • 리뷰를 입력으로 했을 때 생성된 이미지 얻기
      • 이슈: 이미지가 괴상하다
        짜장면
        치킨
        떡볶이
        (짜장면, 치킨, 떡볶이)
      • 리뷰가 예를 들어 '맛있게 잘 먹었어요'가 많음 -> 음식을 묘사한 리뷰 텍스트가 부족
    • 개선 사항
        1. 텍스트를 리뷰가 아닌 메뉴로 타협한다
        1. 텍스트를 메뉴 + 리뷰로 concat한다
  • 12월 15일(수)
    -개선 사항

    • 데이터 수 증가 해본다.
    • 텍스트 그냥 딱 메뉴만?
    • 대표 이미지를 inference 입력으로 넣어본다
  • 12월 16일(목)

    • minDALL-E transfer learning 시도

Presentation Scenario

발표 시나리오

다음과 같은 순서로 진행

유저가 할 수 있는 기능들

  1. 음식점 추천
  • 별점 태깅 설명
    • 기존 별점으로 할 때 보다 기준이 있고 모델적 성능도 증가함을 보여줘야 함
    • 기존 별점에서 어떤 문제가 있는지를 보여줘야 함
    • 시간이 부족한 상황에서 모델의 성능을 올리기 위해 개개인의 validation을 측정하고 해당 개인을 재태깅하는 방식 채택
  1. 리뷰 생성
  2. 검색
  3. 리뷰 기반 추천

데이터 태깅

  1. 별점 태깅

주차 별 역할 분담

  • 각 인물 캐릭터가 각 파트를 맡는 모습을 시각적으로 표현하기.
  • 구성원 별로 가장 인상깊은, 또는 말하고 싶은 문제와 해결방법

Modeling : Review Generation

작성 규칙

  • 금일 계획 수행
  • 회고
  • 금일 결과 작성 및 분석
  • 익일 계획 수립

21년 12월 05일 일

Timeline

10시(늦으면 10시 30분) - 12시(또는 그 이상)

  • generator.py 수정
  • Kakao KoGPT2 model GPU에 올리는 법 찾기

Task

generator.py 수정

21년 12월 04일 토

Timeline

17시 30분 시작

Task

SKT-GPT Finetuning 발전

  • 모델 학습
  • 🍖 메뉴"+"별점[SEP]리뷰
    • word = "도넛+5<sep>예전부터"
  • 🍖 가게이름"+"메뉴"+"별점[SEP]리뷰
    • word = "던킨+도넛+5<sep>예전부터"
  • 🍖 "메뉴는 "메뉴" 별점은 "별점[SEP]리뷰
    • word = "메뉴는 도넛 별점은 5점<sep>예전부터"
  • 🍖 "메뉴는"메뉴"별점은"별점"인 리뷰를 만들어줘"[SEP]리뷰
    • word = "메뉴는 도넛 별점을 5점인 리뷰를 만들어줘<sep>예전부터"

자체 평가 기준 수립

  • 4가지 기준을 가진 8개의 INPUT을 정해놓고 상민과 상준이 1~4점을 부여해서 모델 성능 평가(필요시 팀원 평가 추가)
  • 별점

    • 5 : 진짜 사람이 쓴 것 같은 리뷰
    • 4 : 문장이 자연스럽고, 유저가 원하는 리뷰 EX) 예전부터 시켜먹어요 적당히 매콤하니 맛있었어요!
    • 3 : 문장이 자연스럽지만, 유저가 원하지는 않는 리뷰 EX) 메뉴는 도넛 별점은 5점예전부터 시켜먹었는데 진짜 매콤한 파스타랑 같이 먹었는데 진짜 맛있어요. 앞으로 자주 시켜먹을게요
    • 2 : 문장구조가 자연스럽지 않고, 문맥은 이해할 수 있는 리뷰 EX) 메뉴는 도넛 별점은 5점예전부터이라는데. 양많고 맛있어요
    • 1 : 문장구조가 자연스럽지 않고 문맥도 이해할 수 없는 리뷰 EX) 메뉴는 도넛 별점은 5점예전부터 쭉 생각나면 무조건 여기선 안찾을수있어요 근데 모처럼 버섯이나 아 같은데 그대로 남겼는데 그래도 맛이 나네요 ㅠㅠ
  • 있는 가게와 있는 메뉴

    • 직화신불닭&국물닭발-강북, 찜, 5점
    • BBQ-대구수성점, 치킨, 1점
  • 있는 가게와 없는 메뉴

    • 야미가-대구경북대점, 샤브샤브, 5점
    • 선녀와나무꾼한식분식, 간장게장, 1점
  • 없는 가게(메뉴 유추 가능)와 있는 메뉴

    • 원조상준분식, 김밥, 5점
    • 고급상민한식당, 찌개, 1점
  • 없는 가게(메뉴 유추 불가)와 없는 메뉴

    • 상상플러스, 랍스타, 5점
    • 핫식스, 버섯전골, 1점

ignore 관리

  • checkpoint/ 추가, samples/ 추가

runs 파일 관리
-tensorboard summary 삭제
image 폴더 삭제

21년 12월 03일 금

Task

SKT-GPT Finetuning 기본 구현 끝

  • 구현

SKT-GPT Finetuning 발전

  • INPUT 구현!
  • 🍖 메뉴"+"별점[SEP]리뷰
  • 🍖 가게이름"+"메뉴"+"별점[SEP]리뷰
  • 🍖 "메뉴는"메뉴"별점은"별점[SEP]리뷰
  • 🍖 "메뉴는"메뉴"별점은"별점"인 리뷰를 만들어줘"[SEP]리뷰

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.