Coder Social home page Coder Social logo

storyteller's Introduction

Wisdomify - A BERT-based reverse-dictionary of Korean proverbs

Total alerts Language grade: Python

What is Wisdomify?

Wisdomify는 우리말 속담 역사전(Reverse-Dictionary of Korean Proverbs)입니다. 즉, 기존의 속담 사전이 "속담 → 정의, 용례" 의 검색을 도와준다면 Wisdomify는 "정의, 용례 → 속담" 검색을 도와줍니다.

예를 들어 아래와 같은 검색이 가능합니다
커피가 없으니 홍차라도 마시자!라는 문장에 꿩 대신 닭 (56%)을 추천
image
맛집에 간날 하필이면 휴무라니라는 문장에는 가는 날이 장날 (99%)을 추천
image

이러한 똑똑한 역사전을 만들어 낼 수 있다면 사람들의 능동적인 어휘학습을 효과적으로 도와줄 수 있을 것입니다. 이를 바탕으로 우리는 Wisdomify를 통해, 어휘학습의 미래는 똑똑한 검색엔진이다 라는 가치 제안을 하고자 합니다.

Related Work

기반이 되는 모델은 사전훈련된 BERT (Devlin et al., 2018)입니다. 사전학습된 모델로는 한국어 구어체를 사전학습한 KcBERT를(Junbum, 2020) 사용하고 있으며, 해당 모델을 reverse-dictionary task에 맞게 미세조정(Yan et al., 2020)을 진행하는 것이 목표입니다.

How did we end up with Wisdomify?

  1. Word2Vec: King = Queen - woman, 이런게 된다는게 너무 재미있고 신기하다. 이걸로 게임을 만들어볼 수 있지 않을까? - Toy 프로젝트: word-chemist
  2. 생각보다 잘 되는데? 그럼 Word2Vec로 reverse-dictionary도 구현할 수 있지 않을까? - 학사 졸업 프로젝트 - Idiomify
  3. Sum of Word2Vectors로 reverse-dictionary를 구현하기에는 분명한 한계가 보인다. 문장의 맥락을 이해하는 Language Model은 없는가? - 논문 리뷰: Attention is All you Need
  4. Attention의 목적이 Contextualised embedding을 얻기 위함임은 알겠다. 그런데 왜 각 파라미터를 Q, K, V라고 이름지었는가? 무엇에 비유를 하는 것인가?- What is Q, K, V? - Information Retrieval analogy
  5. Contextualised embedding을 활용한 사례에는 무엇이 있는가? - 논문 리뷰: Vokenization: Improving Language Understanding with Contextualized, Visual-Grounded Supervision
  6. Vokenisation 논문을 보니 BERT를 적극 활용하더라. BERT란 어떤 모델인가? - 집현전 중급 2조 BERT 논문리뷰
  7. 아, 혹시 사전훈련된 BERT를 활용한다면 적은 데이터를 가지고도 reverse-dictionary task를 구현할 수 있지 않을까? 누군가 이미 시도를 해보았을 것 같은데? - 논문리뷰: BERT for Monolingual and Cross-Lingual Reverse Dictionary
  8. 로스함수를 이해했다. 한번 BERT로 간단한 reverse-dictionary를 구현해보자 - Toy 프로젝트: fruitify - a reverse-dictionary of fruits!
  9. fruitify: 성공적인 첫 데모!
  10. BERT로 reverse-dictionary를 구현하는 방법을 이해했고, 실재로 구현도 해보았다. 이제 생각해보아야 하는 것은 reverse-dictionary로 풀만한 가치가 있는 문제를 찾는 것 - Wisdomify: 자기주도적으로 우리말 속담을 학습하는 것을 도와주는 reverse-dictionary.

Models

모델 설명 학습 지표 테스트 지표
RDAlpha:a 앞서 언급한 논문 (Yan et al., 2020)에서 제시한 reverse-dictionary task를 위한 loss를 사용
RDBeta:a RDAlpha와 같은 로스를 사용, 하지만 구조를 살짝 변경하여 속담을 단일 토큰으로 취급하는 경우도 고려
RDGamma:b_best image ... ...

Examples

  • 갈수록 어렵다
### desc: 갈수록 어렵다 ###
0: ('산넘어 산', 0.9999836683273315)
1: ('갈수록 태산', 1.6340261936420575e-05)
2: ('꿩 대신 닭', 4.177704404639826e-09)
3: ('핑계 없는 무덤 없다', 4.246608897862103e-10)
4: ('원숭이도 나무에서 떨어진다', 4.91051192763603e-11)
5: ('가는 날이 장날', 3.620301280982119e-11)
6: ('등잔 밑이 어둡다', 3.410518395474682e-12)
7: ('고래 싸움에 새우 등 터진다', 2.889838230366905e-14)
8: ('소문난 잔치에 먹을 것 없다', 2.270246673757772e-14)
9: ('서당개 삼 년이면 풍월을 읊는다', 2.424753148985129e-15)
  • 근처에 있을 것이라고는 전혀 예상하지 못했다
### desc: 근처에 있을 것이라고는 전혀 예상하지 못했다 ###
0: ('등잔 밑이 어둡다', 0.934296190738678)
1: ('원숭이도 나무에서 떨어진다', 0.04902056232094765)
2: ('산넘어 산', 0.010009311139583588)
3: ('가는 날이 장날', 0.005946608260273933)
4: ('소문난 잔치에 먹을 것 없다', 0.0002701274352148175)
5: ('고래 싸움에 새우 등 터진다', 0.0002532936632633209)
6: ('갈수록 태산', 0.00010314056999050081)
7: ('핑계 없는 무덤 없다', 9.196436440106481e-05)
8: ('꿩 대신 닭', 8.55061716720229e-06)
9: ('서당개 삼 년이면 풍월을 읊는다', 3.365390739418217e-07)
  • 너 때문에 관계없는 내가 피해봤잖아
### desc: 너 때문에 관계없는 내가 피해봤잖아 ###
0: ('고래 싸움에 새우 등 터진다', 0.9243378043174744)
1: ('가는 날이 장날', 0.028463557362556458)
2: ('핑계 없는 무덤 없다', 0.026872390881180763)
3: ('등잔 밑이 어둡다', 0.012348096817731857)
4: ('소문난 잔치에 먹을 것 없다', 0.003390798345208168)
5: ('산넘어 산', 0.0026215193793177605)
6: ('갈수록 태산', 0.0010220635449513793)
7: ('원숭이도 나무에서 떨어진다', 0.0004960462101735175)
8: ('꿩 대신 닭', 0.00044754118425771594)
9: ('서당개 삼 년이면 풍월을 읊는다', 6.364324889318596e-08)
  • 쓸데없는 변명은 그만 둬
### desc: 쓸데없는 변명은 그만둬 ###
0: ('핑계 없는 무덤 없다', 0.6701037287712097)
1: ('꿩 대신 닭', 0.17732197046279907)
2: ('산넘어 산', 0.1395266205072403)
3: ('갈수록 태산', 0.01272804755717516)
4: ('가는 날이 장날', 0.00020182589651085436)
5: ('원숭이도 나무에서 떨어진다', 0.0001034122469718568)
6: ('고래 싸움에 새우 등 터진다', 1.2503404832386877e-05)
7: ('등잔 밑이 어둡다', 1.5657816447856021e-06)
8: ('소문난 잔치에 먹을 것 없다', 2.735970952016942e-07)
9: ('서당개 삼 년이면 풍월을 읊는다', 3.986170074576911e-11)

속담의 용례를 입력으로 주어도 용례에 맞는 속담을 예측할 수 있을까? 각 속담의 사전적 정의만 훈련에 사용되었다는 것을 고려해보았을 때, 만약 이것이 가능하다면 사전학습된 weight를 십분활용하고 있다는 것의 방증이 될 것.

  • 커피가 없으니 홍차라도 마시자
### desc: 커피가 없으니 홍차라도 마시자 ###
0: ('꿩 대신 닭', 0.5670634508132935)
1: ('가는 날이 장날', 0.15952838957309723)
2: ('산넘어 산', 0.14466965198516846)
3: ('등잔 밑이 어둡다', 0.10353685170412064)
4: ('소문난 잔치에 먹을 것 없다', 0.006912065204232931)
5: ('갈수록 태산', 0.00646367808803916)
6: ('서당개 삼 년이면 풍월을 읊는다', 0.006029943469911814)
7: ('원숭이도 나무에서 떨어진다', 0.004639457445591688)
8: ('핑계 없는 무덤 없다', 0.0011017059441655874)
9: ('고래 싸움에 새우 등 터진다', 5.46958799532149e-05)
  • 그 애가 도망쳐 버렸으면 아무나 대신 잡아넣어 숫자를 채워야 할 게 아니냐?
### desc: 그 애가 도망쳐 버렸으면 아무나 대신 잡아넣어 숫자를 채워야 할 게 아니냐? ###
0: ('꿩 대신 닭', 0.6022371649742126)
1: ('등잔 밑이 어둡다', 0.3207240402698517)
2: ('서당개 삼 년이면 풍월을 읊는다', 0.03545517101883888)
3: ('가는 날이 장날', 0.012123783119022846)
4: ('갈수록 태산', 0.011005728505551815)
5: ('원숭이도 나무에서 떨어진다', 0.010867268778383732)
6: ('핑계 없는 무덤 없다', 0.004052910953760147)
7: ('산넘어 산', 0.002024132991209626)
8: ('고래 싸움에 새우 등 터진다', 0.0013805769849568605)
9: ('소문난 잔치에 먹을 것 없다', 0.00012919674918521196)

  • 나는 어릴 적부터 카센터에서 잡일을 도맡아 하다 보니 이젠 혼자서 자동차 수리도 할수 있다.
### desc: 나는 어릴 적부터 카센터에서 잡일을 도맡아 하다 보니 이젠 혼자서 자동차 수리도 할수 있다. ###
0: ('서당개 삼 년이면 풍월을 읊는다', 0.5147183537483215)
1: ('등잔 밑이 어둡다', 0.34899067878723145)
2: ('가는 날이 장날', 0.12019266188144684)
3: ('원숭이도 나무에서 떨어진다', 0.011380248703062534)
4: ('산넘어 산', 0.002991838613525033)
5: ('갈수록 태산', 0.0007551977760158479)
6: ('꿩 대신 닭', 0.0004372508847154677)
7: ('소문난 잔치에 먹을 것 없다', 0.00040235655615106225)
8: ('고래 싸움에 새우 등 터진다', 7.436128362314776e-05)
9: ('핑계 없는 무덤 없다', 5.710194818675518e-05)
  • 맛집이라길래 일부러 먼길을 달려왔는데 막상 먹어보니 맛이 없더라
### desc: 맛집이라길래 일부러 먼길을 달려왔는데 막상 먹어보니 맛이 없더라 ###
0: ('소문난 잔치에 먹을 것 없다', 0.5269527435302734)
1: ('서당개 삼 년이면 풍월을 읊는다', 0.2070106714963913)
2: ('가는 날이 장날', 0.15454722940921783)
3: ('등잔 밑이 어둡다', 0.11061225831508636)
4: ('꿩 대신 닭', 0.0006726137944497168)
5: ('원숭이도 나무에서 떨어진다', 0.0001451421994715929)
6: ('산넘어 산', 3.2266420021187514e-05)
7: ('핑계 없는 무덤 없다', 1.288024850509828e-05)
8: ('갈수록 태산', 1.0781625860545319e-05)
9: ('고래 싸움에 새우 등 터진다', 3.4537756619101856e-06)

검색할 수 있는 속담이 모두 부정적인 속담이라서 그런지, 긍정적인 문장이 입력으로 들어오면 제대로 예측을 하지 못한다.

  • 결과가 좋아서 기쁘다
0: ('산넘어 산', 0.9329468011856079)
1: ('갈수록 태산', 0.05804209038615227)
2: ('꿩 대신 닭', 0.006065088324248791)
3: ('가는 날이 장날', 0.002668046159669757)
4: ('원숭이도 나무에서 떨어진다', 0.00024604308418929577)
5: ('핑계 없는 무덤 없다', 3.138219108222984e-05)
6: ('등잔 밑이 어둡다', 4.152606720708718e-07)
7: ('소문난 잔치에 먹을 것 없다', 2.1668449790013256e-07)
8: ('고래 싸움에 새우 등 터진다', 2.008734867331441e-08)
9: ('서당개 삼 년이면 풍월을 읊는다', 1.0531459260221254e-08)

"소문난 잔치에 먹을 것 없다"와 동일한 의미를 지님에도 불구하고, "실제로는 별거 없네"를 입력으로 받으면 "산 넘어 산"이 1등으로 출력. 하지만 훈련 셋에 포함된 샘플인 "소문과 실제가 일치하지 않는다"를 입력으로 받으면 정확하게 예측함. 즉 모델이 훈련셋에 오버피팅이 된 상태임을 확인할 수 있다

  • 실제로는 별거없네 (훈련 셋에 포함되지 않은 정의)
### desc: 실제로는 별거없네 ###
0: ('산넘어 산', 0.9976289868354797)
1: ('갈수록 태산', 0.002168289152905345)
2: ('꿩 대신 닭', 0.00020149812917225063)
3: ('핑계 없는 무덤 없다', 9.218800869348343e-07)
4: ('등잔 밑이 어둡다', 1.6546708536679944e-07)
5: ('가는 날이 장날', 1.0126942839860931e-07)
6: ('원숭이도 나무에서 떨어진다', 9.898108288552976e-08)
7: ('소문난 잔치에 먹을 것 없다', 6.846833322526891e-09)
8: ('고래 싸움에 새우 등 터진다', 4.417973487047533e-10)
9: ('서당개 삼 년이면 풍월을 읊는다', 8.048845877989264e-14)
  • 소문과 실제가 일치하지 않는다 (훈련 셋에 포함된 정의)
### desc: 소문과 실제가 일치하지 않는다. ###
0: ('소문난 잔치에 먹을 것 없다', 0.999997615814209)
1: ('등잔 밑이 어둡다', 1.7779053678168566e-06)
2: ('가는 날이 장날', 5.957719508842274e-07)
3: ('갈수록 태산', 9.973800452200976e-09)
4: ('핑계 없는 무덤 없다', 2.4250623731347787e-09)
5: ('고래 싸움에 새우 등 터진다', 5.40873457133273e-10)
6: ('산넘어 산', 4.573414147390764e-10)
7: ('원숭이도 나무에서 떨어진다', 2.8081562075676914e-10)
8: ('꿩 대신 닭', 2.690336287081152e-10)
9: ('서당개 삼 년이면 풍월을 읊는다', 3.8126671958460534e-11)
  • 소문이랑 다르네 ("소문"이라는 단어에는 민감하게 반응한다.)
### desc: 소문이랑 다르네 ###
0: ('산넘어 산', 0.9770968556404114)
1: ('소문난 잔치에 먹을 것 없다', 0.01917330175638199)
2: ('갈수록 태산', 0.0035712094977498055)
3: ('꿩 대신 닭', 8.989872731035575e-05)
4: ('가는 날이 장날', 6.370477785822004e-05)
5: ('핑계 없는 무덤 없다', 1.7765859183782595e-06)
6: ('원숭이도 나무에서 떨어진다', 1.6799665445432765e-06)
7: ('등잔 밑이 어둡다', 1.6705245116099832e-06)
8: ('고래 싸움에 새우 등 터진다', 3.0059517541758396e-08)
9: ('서당개 삼 년이면 풍월을 읊는다', 4.33282611178587e-11)

References

  • Devlin, J. Cheng, M. Lee, K. Toutanova, K. (2018). : Pre-training of Deep Bidirectional Transformers for Language Understanding.
  • Gururangan, S. Marasović, A. Swayamdipta, S. Lo, K. Beltagy, I. Downey, D. Smith, N. (2020). Don't Stop Pretraining: Adapt Language Models to Domains and Tasks
  • Hinton, G. Vinyals, O. Dean, J. (2015). Distilling the Knowledge in a Neural Network
  • Junbum, L. (2020). KcBERT: Korean Comments BERT
  • Yan, H. Li, X. Qiu, X. Deng, B. (2020). BERT for Monolingual and Cross-Lingual Reverse Dictionary

storyteller's People

Contributors

artemisdicotiar avatar eubinecto avatar teang1995 avatar

Stargazers

 avatar  avatar  avatar

Watchers

 avatar

storyteller's Issues

ai-hub 짝수번째 데이터 전처리 및 업로드

TL;DR

WHY?

왜 업로드 하는지?

  • ES에 올릴 데이터를 많이 긁어모아야 한다! ai-hub에는 "속담이 있을 법한" 데이터들이 여럿 보이는데, 이를 일단 모조리 올린 후 속담이 있는 데이터만 사용하려 함.

왜 전처리 해야하는지?

  • 우리가 사용하는 폼대로 모두 sentence에 한 문장만 있으면 좋지만.. 현실은 그리 녹록치 않더라. 각 데이터에 맞게 업로드 하는 방법을 명시해두어야 나중에 가져올 일이 있다면 편리하게 가져올 수 있을 듯 하다.

WHAT?

  • ai-hub의 자연어/음성 데이터에 짝수 번째 데이터 중, 속담이 있을 법한 데이터를 긁어 각 데이터에서 문장만 가져올 수 있는 방법을 정리한다.
  • 또한, 전처리한 데이터를 ES cloud에 bulk api를 이용하여 업로드한다.

TODOs

  • 고객 응대 음성
  • 공공행정문서 OCR
  • 도서자료 기계독해 - 8
  • 논문 자료 요약
  • 명령어 음성 - 노인 남녀
  • 명령어 음성 - 일반 남녀
  • 민원(콜센터) 질의 - 응답
  • 상담 음성
  • 소상공인 고객 주문 질의-응답 텍스트
  • 시각 정보 기반 질의응답
  • 일반 상식
  • 자유대화 음성(소아, 유아)
  • 전문 분야 한영 말뭉치
  • 차량 내 대화 및 명령어 음성
  • 한국어 SNS
  • 한국어 대화
  • 한국어 방언 발화(강원도)
  • 한국어 방언 발화(전라도)
  • 한국어 방언 발화(충청도)
  • 한국어-영어 번역 말뭉치 (기술과학)
  • 한국어-영어 번역(병렬) 말뭉치
  • 한국어-중국어 번역 말뭉치(기술 과학)
  • 한국인 대화 음성
  • 회의 음성

aihub data upload (홀수 번째)

TL;DR

aihub에 공개되어 있는 데이터 중에 홀수 번째 데이터의 업로드.

TODOs

  • 감성 대화 말뭉치
  • 고서 한자 인식 OCR
  • 기계독해
  • 다양한 형태의 한글 문자 OCR
  • 도서자료 요약
  • 명령어 음성 (소아, 유아)
  • 문서요약 텍스트
  • 법률지식 베이스
  • 생활 및 거주환경 기반 VQA
  • 수어 영상
  • 야외 실제 촬영 한글 이미지
  • 자유대화 음성(노인 남녀)
  • 자유대화 음성(일반 남녀)
  • 전문분야 한영 말뭉치
  • 특허 지식베이스
  • 한국어 강의 음성
  • 한국어 대화 요약
  • 한국어 방언 발화 (경상도)
  • 한국어 방언 발화 (제주도)
  • 한국어 음성
  • 한국어-영어 번역 말뭉치 (사회과학)
  • 한국어-일본어 번역 말뭉치
  • 한국어 중국어-번역 말뭉치 (사회과학)
  • 한국인 외래어 발화

storyteller 검색용 플라스크 api 구축

What?

reverse search를 했을 때 속담의 정의와 다른 eg/source를 보여줄 검색 엔진을 위한 플라스크 api 구축.

Why?

속담을 검색했을 때 이 용례들이 어떻게 사용되는지 도 확인할 필요가 있다!

TODO

  • 검색 결과 중 몇 개를 보여줄 건지 정하기.
    • 모두 보여준다면, 한 페이지에 몇 개를 보여줄 건지 정하기.
  • 속담이 입력되면 용례 보여주는 flask api 작성.

preprocess 구현하기

What?

전처리 로직 구현하기. TODO 표기된 부분만 구현하면 된다!

def augment(df: pd.DataFrame) -> pd.DataFrame:
# TODO implement augmentation.
return df
def parse(df: pd.DataFrame) -> pd.DataFrame:
"""
parse <em> ...</em> to [WISDOM].
:param df:
:return:
"""
# TODO: implement parsing
return df
def normalise(df: pd.DataFrame) -> pd.DataFrame:
"""
1. normalise the emoticons.
2. normalise the spacings.
3. normalise grammatical errors.
:param df:
:return:
"""
# TODO: implement normalisation
return df
def upsample(df: pd.DataFrame) -> pd.DataFrame:
# TODO: implement upsampling
return df

Why?

...

To-do's

wandb all dataset structure change

TL;DR

current: train, validate, test

changed: train + validate → train.tsv / test → validate.tsv
test data is now called from ultimate test queries.

WHY?

ultimate test dataset is added to wandb. Now train + validate should be train set and test should be validate.

WHAT?

changed: train + validate → train.tsv / test → validate.tsv

TODOs

  • explore script to update all wandb dataset
  • init_wisdom2def-raw
  • init_wisdom2eg-raw
  • init_kuniv_wisdom2eg-raw
  • wikiquote_wisdom2def-raw
  • wikiquote_wisdom2eg-raw
  • namuwiki_wisdom2def-raw
  • namuwiki_wisdom2eg-raw
  • opendict_wisdom2def-raw
  • opendict_wisdom2eg-raw
  • init_kuniv-preprocess_wisdom_token
  • init_kuniv-preprocess_no_wisdom

wisdomify_test의 일부분을 validation으로 사용하는 것으로 변경하기

What?

  • wisdom2def, wisdom2eg -> raw, all로만 분할.
  • wisdomify_test -> raw, all, test, val로 분할.
  • 이렇게 하면, early stopping으로 에폭을 최적화하는 것이 가능하다.
  • validation set의 비율은 20%로 하자. 100개 중 20개를 validation에 사용한다.

Why?

최종적으로 풀고자하는 문제는 wisdom2test인데, validation셋을 wisdom2def의 일부분으로 사용해버리면, 최종문제에 대하여
언제 오버피팅이 되는지 확인할 수 있는 길이 없다.

To-do's - the tasks

  • wisdom2test -> wisdomify_test 이름 재변경
  • 이게 더 적절할듯 -> wisdomify_test - >wisdom2query
  • stratified_split 구현하기
  • wisdom2def, wisdom2eg -> raw, all로만 분할하기
  • wisdomify_test -> raw, all, val, test로만 분할하기

To -do's - some simple refactoring

  • 각 artifact별로, 중요한 메타데이터 추가하기 (e.g. wisdomify_test의 경우 -> val_ratio, seed)
  • [ ] flatten out the data directory (data/corpora, data/wandb -> copora, wandb) - flat is better than nested 폴더가 알파벳 순서로 정렬... 오히려 더 지저분해짐. 그냥 냅두자.

wandb Tables 적용하기

What?

wandb Tables를 활용하여 builders.py 완성하기.

Why?

wandb에서 제공하는 Tables 객체를 활용하면, 굳이 로컬에다가 tsv파일을 저장하지 않아도, 바로 데이터를 wandb에 푸시할 수 있다. 접근을 하는 방법도 마찬가지. 굳이 path를 지정할 필요가 없어, 훨씬 더 간결해진다는 점이 장점.

To-do's

  • Tables 문서 리뷰하기
  • augment , parse 함수를 추가하기 - Wisdom2EgUploader의 경우에 한함!, normalise 함수 구현하기
  • elastic/utils.py -> elastic/crud.py
  • builders.py 추가

고려대 코퍼스로 수집한 데이터도 ES에 업로드하기

TL;DR

기존에 수집한 데이터도 활용해보자.

WHY?

기존에 수집한 자료도 유의미하다.

WHAT?

고로 막 버리지 말고 ES에 또다른 인덱스로 올리자

TODOs

  • 기존에 수집했던 데이터 다시 로컬에 모으기
  • tsv로드해서 json으로 변환하는 로직 넣기
  • tsv to json 스크립트로 기존 tsv를 elastic에 저장할 수 있는 form으로 변환하기
  • 변환된 json ES에 indexing하기

GCP storage download unzip feature

TL;DR

GCP storage에서 데이터 다운로드후 unzip까지 완료할 수 있게 하려고 함.

WHY?

지금 있는 클래스는 zip파일을 다운로드만 받는다.
이러면 zip파일을 unzip하는 프로세스를 반복적으로 작성하게 될 것 같다.

WHAT?

GCPStorage 클래스에 unzipping하는 메소드를 추가하자.

TODOs

  • unzipping 메소드 추가
  • zip 저장 위치 디렉토리 생성

뉴스에서 속담 데이터 수집 & 인덱스

What?

빅카인즈 api를 사용해서, wisdoms에 포함된 모든 속담의 용례를 가능한 다 찾아낸다.

Why?

보통 뉴스에 속담의 용례가 많이 포함되어 있어서.

To-do's

  • api 요청이 잘되는지 확인하기
  • 뉴스 데이터 수집하기 (구문 검색이 정확하지 않다면, 그냥 토큰으로 쪼개서, 불리언 검색 활용)
  • 그리고 News(Story) 구현
  • python3 -m storyteller.main.index --index=news_story 인덱싱까지 마무리하기!

GCP cloud에서 데이터 불러오는 support util 추가

TL;DR

GCP cloud에서 데이터 불러오는 support util 추가

WHY?

raw 데이터를 지속적으로 누군가가 계속 다운로드 받기보다는 GCP에 올라가있는 raw데이터를 다운받아 전처리하는 게 좋아 보인다.

WHAT?

GCP 클라우드에서 데이터 불러오고 zip파일 푼 뒤
해당 루트 디렉토리 이름, 디렉토리 구조, 파일 리스트 출력하는 함수 및 클래스 작성.

TODOs

  • TODO 1
  • TODO 2
  • TODO 3
  • TODO 4
  • TODO 5

preprocess.upsample 구현하기

What?

가장 데이터 개수가 많은 클래스에 맞춰서, 상대적으로 개수가 적은 클래스의 데이터를 upsample하는 함수

Refactoring the repository

0. Download the data and define the path

예를 들면, 이렇게;
image

1. defining the indices

다음의 Document class를 storyteller/elastic/docs.py 에 정의한다. 구현해야하는 것은 총 두가지:

  • sents외에 추가해야하는 필드
  • stream_from_corpus(): 말뭉치 데이터를 파싱하여 해당 Doc의 객체를 stream.
  • Index 메타 클래스.

예를 들면, 감성대화의 경우 다음과 같이 정의:

class SC(Story):
    """
    감성 대화 인덱스
    """
    # --- additional fields for SC --- #
    profile_id = Keyword()
    talk_id = Keyword()

    @staticmethod
    def stream_from_corpus() -> Generator['SC', None, None]:
        train_json_path = os.path.join(SC_DIR, "Training", "감성대화말뭉치(최종데이터)_Training.json")
        val_json_path = os.path.join(SC_DIR, "Validation", "감성대화말뭉치(최종데이터)_Validation.json")

        for json_path in (train_json_path, val_json_path):
            with open(json_path, 'r') as fh:
                corpus_json = json.loads(fh.read())
                for sample in corpus_json:
                    yield SC(sents=" ".join(sample['talk']['content'].values()),
                             profile_id=sample['talk']['id']['profile-id'],
                             talk_id=sample['talk']['id']['talk-id'])

    class Index:
        # 해당 말뭉치의  인덱스 이름
        name = "sc_story"
        settings = Story.settings()

2. index

일단 1번을 끝내면, 인덱싱을 하는 것은 다음의 명령어로 바로 진행이 가능함.

python3 -m storyteller.main.index --index=gk_story  # indexing 일반상식 말뭉치
python3 -m storyteller.main.index --index=sc_story  # indexing  감성대화 말뭉치
python3 -m storyteller.main.index --index=mr_story # indexing  기계대화 말뭉치

3. search

이 부분은 아직 정확한 검색 로직은 미완성. 하지만 어느정도 검색은 가능함. 더 정확한 검색은 storyteller/elasitc/searcher.py 에 정의된 Searcher 클래스를 수정해야함.

python3 -m storyteller.main.search --wisdom="산 넘어 산"

4. build

storyteller가 관리하는 wandb artifacts는 다음과 같다:

  1. wisdoms
  2. wisdomify_test
  3. wisdom2def
  4. widom2eg

artifact를 wandb에 업로드 전, 먼저 각 artifact의 파일 및 디렉토리를 다음과 같이 로컬에 빌드한다:

data
├── corpora
└── wandb
    ├── artifacts
    │   ├── wisdom2def
    │   │   ├── wisdom2def.tsv
    │   │   ├── wisdom2def_raw.tsv
    │   │   ├── wisdom2def_train.tsv
    │   │   └── wisdom2def_val.tsv
    │   ├── wisdom2eg
    │   │   ├── wisdom2eg.tsv
    │   │   ├── wisdom2eg_raw.tsv
    │   │   ├── wisdom2eg_train.tsv
    │   │   └── wisdom2eg_val.tsv
    │   ├── wisdomify_test.tsv
    │   └── wisdoms.txt

이를 위한 스크립트는 다음과 같다:

python3 -m storyteller.main.build --artifact_name="wisdoms"
python3 -m storyteller.main.build --artifact_name="wisdomify_test"
python3 -m storyteller.main.build --artifact_name="wisdom2def"
python3 -m storyteller.main.build --artifact_name="wisdom2eg"

5. upload

일단 빌드가 마무리되면, 다음의 스크립트로 wandb에 업로드가 가능하다.

python3 -m storyteller.main.upload --artifact_name="wisdoms"
python3 -m storyteller.main.upload --artifact_name="wisdomify_test"
python3 -m storyteller.main.upload --artifact_name="wisdom2def"
python3 -m storyteller.main.upload --artifact_name="wisdom2eg"

Download??

말뭉치를 다운로드 하는 것은, 일단 보류. GCP 다운로더도 일단 제거했다. 물론 필요없다는 의미가 아니다. 지금 사용이 불가능해서, 잠시 제거 한 것 일 뿐. 추후에 다운로드 로직은 따로 추가가 필요할 듯.

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.