Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

lmdata 태스크에 AIHub, 모두의 말뭉치 데이터셋도 사용이 가능하면 좋겠습니다. #191

Closed
hwiorn opened this issue Jan 18, 2021 · 14 comments

Comments

@hwiorn
Copy link
Contributor

hwiorn commented Jan 18, 2021

다운로드 가능한 데이터셋에 대해서만 lmdata를 통해 학습용 데이터셋을 출력하는 것으로 보입니다.

AIHUB나 모두의 코퍼스 셋은 로더 쪽도 준비가 다 된 것 같아, lmdata에 반영을 하면 될 것으로 보이는데, 혹시 작업 예정이신지 궁금합니다.

@lovit
Copy link
Member

lovit commented Jan 18, 2021

@hwiorn

며칠 사이 Korpora 의 많은 부분을 고쳐주셔서 감사합니다. (아직 업무중이라 끝나고 PR 살펴볼게요)

두 데이터 모두 lmdata task 에 유용한 데이터라 생각합니다. 당연히 반영할 계획이 있습니다.
두 데이터는 다운로드 기능이 제공되지 않으니, 두 데이터의 경우 데이터가 local 에 존재하지 않으면 각각 어떤 곳에가서 데이터를 받으면 되는지 안내메시지를 출력하는 가능을 추가하는 것까지가 spec 이었습니다.

하지만 아직 작업은 진행하지 않았습니다.

@lovit
Copy link
Member

lovit commented Jan 18, 2021

@hwiorn 님, 이 작업 진행하신다면 여기에 알려주세요. 저도 작업을 하게 된다면 여기에 커멘트와 labels 을 남기고 진행하겠습니다.

@lovit
Copy link
Member

lovit commented Jan 18, 2021

이 작업은 Korpora==0.3.0 (#187 ) 에 반영하도록 하겠습니다

@hwiorn
Copy link
Contributor Author

hwiorn commented Jan 19, 2021

@lovit 제가 이 프로젝트에 대해 잘 아는 것이 아니라서, 어떨지 문의합니다.

현재 AIHUB 번역 데이터셋과 모두의 말뭉치 데이터 셋에 대해서, task_lmdata.pyiterate* 함수를 만들어 train 파일로 나오는 것 까지는 확인(파일 깨짐 문제로 NIKL_NEWSPAPER를 제외 전부 확인)을 했습니다. 데이터셋 배포 특성상 fetch를 지원하지 않기 때문에, 코퍼스 파일 유무 검사 로직이 들어가야 합니다.

현재 Korpora에 local에 저장된 코퍼스를 검사하는 인터페이스가 없습니다. Korpora.check("kcbert") 또는 Korpora.exists("kcbert") 같은 인터페이스가 있으면 좋을 것 같은데요.(Korpora.loadKorpora.fetch와 비슷한 인터페이스) 이 부분을 추가하려면, loader.py 와 각 korpus_*.py 파일들에 추가해야 합니다.

좀 걸리는 부분이 아래와 같이 있습니다.

  • loader.pyKORPUS, KORPUS_DESCRIPTION, FETCH가 중복되는 구조가 발생하는데, CHECK 등의 구조가 또 추가되도 괜찮은지?
  • korpus_*.pycheck_*() 함수들이 1개씩 추가되도 괜찮은지?

@lovit
Copy link
Member

lovit commented Jan 19, 2021

local install 여부를 확인하는 인터페이스가 있으면 좋겠다는 의견에 저도 동의합니다. 그 형태도 Korpora.exists("corpus_name") 이면 직관적이어서 매우 좋을 것 같습니다.

local install 여부는 fetch 함수 안에 일부 구현되어 있는데, 그 때는 FETCH_INFORMATIONdestination 정보를 이용합니다. 예를 들어 korpus_chatbot_data.py 의 경우 아래의 정보가 있습니다.

KOREAN_CHATBOT_FETCH_INFORMATION = [
    {
        'url': 'https://raw.githubusercontent.com/songys/Chatbot_data/master/ChatbotData%20.csv',
        'destination': 'korean_chatbot_data/ChatbotData.csv',
        'method': 'download'
    }
]

위의 경우에는 곧바로 다운로드를 받는 형태이기 때문에 상관이 없지만, korpus_korean_parallel.py 처럼 다운로드 후 압축 해제를 하는 경우에는 압축된 후의 파일 을 FETCH_INFORMATION 에 추가 후, 해당 파일이 설치 되었는지를 확인하면 좋을 것 같습니다.

KOREAN_PARALLEL_KOEN_NEWS_FETCH_INFORMATION = [
    {
        'url': 'https://raw.githubusercontent.com/jungyeul/korean-parallel-corpora/master/korean-english-news-v1/korean-english-park.train.tar.gz',
        'destination': 'korean_parallel/korean-english-park.train.tar.gz',
        'method': 'download & untar'
    },
    {
        'url': 'https://raw.githubusercontent.com/jungyeul/korean-parallel-corpora/master/korean-english-news-v1/korean-english-park.dev.tar.gz',
        'destination': 'korean_parallel/korean-english-park.dev.tar.gz',
        'method': 'download & untar'
    },
    {
        'url': 'https://raw.githubusercontent.com/jungyeul/korean-parallel-corpora/master/korean-english-news-v1/korean-english-park.test.tar.gz',
        'destination': 'korean_parallel/korean-english-park.test.tar.gz',
        'method': 'download & untar'
    },
]

loader.py 의 Korpora class 에 다음의 기능을 구현하고, Korpora class를 상속하는 클래스들이 각각 exists 함수를 구현한다면, loader.pyCHECK 의 정보를 넣지 않고도 구현 가능할 것 같습니다. 아래와 같은 형식은 어떨까요?

(loader.py)

class Korpora:
    # ...
    @classmethod
    def exists(cls, corpus_name, root_dir=None):
        if isinstance(corpus_name, str):
            corpus_name = [corpus_name]
        if root_dir is None:
            root_dir = default_korpora_path
        for name in corpus_name:
            KORPUS[name].exists(root_dir=root_dir)

(korpus_chatbot_data.py)

class KoreanChatbotKorpus(Korpus):
    # ...
    @classmethod
    def exists(cls, root_dir):
        all_is_ok = True
        for information in KOREAN_CHATBOT_FETCH_INFORMATION:
            local_path = information['destination']
            if not os.path.exists(local_path):
                print(f'Not found {local_path}')
                all_is_ok = False
        if not all_is_ok:
            print('Install corpus using `Korpora.fetch("chatbot_data")`')
        return all_is_ok

@hwiorn
Copy link
Contributor Author

hwiorn commented Jan 19, 2021

네, 말씀하시는 부분이 좋을 것 같습니다. FETCH 구현을 따라 인터페이스를 외부로 빼는 것으로 고민했었습니다.

추가적으로 task_lmdata.py에서 local install 검사여부를 사용하기 위해서(1) Bool 타입을 return 받아야 할 것 같습니다.

def check_corpus(root_dir, corpus_names): # root_dir 추가
    if (corpus_names == 'all') or (corpus_names[0] == 'all'):
        corpus_names = list(ITERATE_TEXTS)
    if isinstance(corpus_names, str):
        corpus_names = [corpus_names]
    available = []
    for name in corpus_names:
        if name not in ITERATE_TEXTS:
            print(f'Not provide {name} corpus. Check the `corpus` argument')
            continue
        if Korpora.exists(name, root_dir): # local install 검사 (1)
            available.append(name)
    if not available:
        raise ValueError('Not found any proper corpus name. Check the `corpus` argument')
    return available

#... 생략 ...
ITERATE_TEXTS = {
#... 생략 ...
    'question_pair': iterate_question_pair,
    'modu_messenger': iterate_modu_messenger,
    'modu_morpheme': iterate_modu_morpheme,
    'modu_ne': iterate_modu_ne,
    'modu_news': iterate_modu_news,
    'modu_spoken': iterate_modu_spoken,
    'modu_web': iterate_modu_web,
    'modu_written': iterate_modu_written,
    'aihub_spoken_translation': iterate_aihub_spoken_translation,
    'aihub_conversation_translation': iterate_aihub_conversation_translation,
    'aihub_news_translation': iterate_aihub_news_translation,
    'aihub_korean_culture_translation': iterate_aihub_korean_culture_translation,
    'aihub_decree_translation': iterate_aihub_decree_translation,
    'aihub_government_website_translation': iterate_government_website_translation,
}

@lovit
Copy link
Member

lovit commented Jan 19, 2021

앗, 손코딩으로 답변 쓰다보니 return all_is_ok 를 빼먹었었네요. 네 저도 task_lmdata.py 에서 이용하시도록 Korpus 클래스를 상속하는 클래스들이 exists()all_is_ok을 return 하는 구조를 생각했습니다. 위의 예시 코드도 수정해두었습니다.

@hwiorn
Copy link
Contributor Author

hwiorn commented Jan 19, 2021

네 알겠습니다. Korpora.exists 직접 구현하실 건가요? 아님 제가 작업해서 추가 할까요?

@hwiorn
Copy link
Contributor Author

hwiorn commented Jan 19, 2021

@lovit
추가적으로 확인이 필요한 것은, 각 iterate_*() 함수에서는 Korpora.load(...)를 수행하고 이 부분에서, fetch 까지 수행하고 있기 때문에, Korpora.exists(...)를 사용하게 되면, 기존 lmdata 동작이 바뀌게 됩니다.

  • 바뀌기 전: lmdata 실행시, iterate 함수 실행을 통해, 코퍼스 자동 다운로드.
  • 바뀐 후: lmdata 실행시, 코퍼스 없을 경우, iterate 함수 실행 안함(fetch task 수행 필요)

@lovit
Copy link
Member

lovit commented Jan 19, 2021

@hwiorn 님께서 제안해주신만큼 hwiorn 님께서 작업하고 싶으시다면 저는 기다리려 합니다. 혹은 기능만 제안하고 싶으신거면 제가 작업하려 합니다.

Korpora.exists(...) 기능을 추가하고 lmdata 실행 시 이 기능을 이용하는 것이 목표이므로, 그 과정에서 필요한 것이 있다면 수정하는 것은 언제나 괜찮습니다.

@hwiorn
Copy link
Contributor Author

hwiorn commented Jan 19, 2021

네 알겠습니다.
WIP로 작업해서 PR 만들겠습니다 :)

@hwiorn
Copy link
Contributor Author

hwiorn commented Jan 20, 2021

On progress 레이블 달아주시면 좋을 것 같습니다.

@lovit
Copy link
Member

lovit commented Jan 20, 2021

On progress 레이블 달아주시면 좋을 것 같습니다.

넵!

@hwiorn
Copy link
Contributor Author

hwiorn commented Jan 28, 2021

반영이 완료되었으므로, 본 건은 닫도록 하겠습니다.

@hwiorn hwiorn closed this as completed Jan 28, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants