From 8ef83679b10eca0fcde50a4daa9846782998b0c9 Mon Sep 17 00:00:00 2001 From: lovit Date: Sat, 10 Oct 2020 17:28:31 +0900 Subject: [PATCH 1/4] Implement ModuWebKorpus (#103, #113) --- Korpora/korpus_modu_web.py | 71 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 Korpora/korpus_modu_web.py diff --git a/Korpora/korpus_modu_web.py b/Korpora/korpus_modu_web.py new file mode 100644 index 0000000..2f0d5fc --- /dev/null +++ b/Korpora/korpus_modu_web.py @@ -0,0 +1,71 @@ +import json +import os +import re +from dataclasses import dataclass +from glob import glob +from tqdm import tqdm +from typing import List +from Korpora.korpora import Korpus, KorpusData + + +description = """ 모두의 말뭉치는 문화체육관광부 산하 국립국어원에서 제공하는 말뭉치로 + 총 13 개의 말뭉치로 이뤄져 있습니다. + 해당 말뭉치를 이용하기 위해서는 국립국어원 홈페이지에 가셔서 "회원가입 > 말뭉치 신청 > 승인"의 + 과정을 거치셔야 합니다. + https://corpus.korean.go.kr/#none + 모두의 말뭉치는 승인 후 다운로드 가능 기간 및 횟수 (3회) 에 제한이 있습니다. + 로그인 기능 및 Korpora 패키지에서의 다운로드 기능을 제공하려 하였지만, + 국립국어원에서 위의 이유로 이에 대한 기능은 제공이 불가함을 확인하였습니다. + Korpora==0.2.0 에서는 "개별 말뭉치 신청 > 승인"이 완료되었다고 가정, + 로컬에 다운로드 된 말뭉치를 손쉽게 로딩하는 기능만 제공할 예정입니다 + (Korpora 개발진 lovit@github, ratsgo@github)""" + +license = """ 모두의 말뭉치의 모든 저작권은 `문화체육관광부 국립국어원 + (National Institute of Korean Language)` 에 귀속됩니다. + 정확한 라이센스는 확인 중 입니다.""" + + +class ModuWebKorpus(Korpus): + def __init__(self, root_dir_or_paths, force_download=False): + super().__init__(description, license) + paths = find_corpus_paths(root_dir_or_paths) + self.train = KorpusData('모두의_웹_말뭉치.train', load_modu_web(paths)) + + +def find_corpus_paths(root_dir_or_paths): + prefix_pattern = re.compile('E[BPSR]RW') + def match(path): + prefix = path.split(os.path.sep)[-1][:4] + return prefix_pattern.match(prefix) + + # directory + wildcard + if isinstance(root_dir_or_paths, str): + paths = sorted(glob(f'{root_dir_or_paths}/*.json') + glob(root_dir_or_paths)) + else: + paths = root_dir_or_paths + + paths = [path for path in paths if match(path)] + if not paths: + raise ValueError('Not found corpus files. Check `root_dir_or_paths`') + return paths + + +def load_modu_web(paths): + texts = [] + for i_path, path in enumerate(tqdm(paths, desc='Loading ModuWeb', total=len(paths))): + with open(path, encoding='utf-8') as f: + data = json.load(f) + documents = data['document'] + texts += [document_to_text(document) for document in documents] + return texts + + +def document_to_text(document): + return '\n'.join([p['form'] for p in document['paragraph']]) + + +def fetch_modu(): + raise NotImplementedError( + "국립국어원에서 API 기능을 제공해 줄 수 없음을 확인하였습니다." + "\n이에 따라 모두의 말뭉치는 fetch 기능을 제공하지 않습니다" + ) \ No newline at end of file From 953497ab76eb540720e84fe4ea1ff1f4986dff44 Mon Sep 17 00:00:00 2001 From: lovit Date: Sat, 10 Oct 2020 17:31:31 +0900 Subject: [PATCH 2/4] Update web corpus usage (#103, #113) --- README.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/README.md b/README.md index 658dff6..1fd4c3a 100644 --- a/README.md +++ b/README.md @@ -557,3 +557,22 @@ corpus.train[0].speaker_id[:10] | original_form | 대화 원본 텍스트 | | speaker_id | 발화자 (숫자가 아님) | | time | `yyyymmdd hh:mm` 형식 | + +### 모두의 말뭉치: 웹 말뭉치 (loader) +- author: 국립국어원 +- repository: https://corpus.korean.go.kr/ +- example +```python +from Korpora.korpus_modu_web import ModuWebKorpus + +paths_or_dir = '/Users/hyunjoongkim/local/modu/National_Institute_Korean_Language/NIKL_WEB(v1.0)/' +paths_or_dir = '/Users/hyunjoongkim/local/modu/National_Institute_Korean_Language/NIKL_WEB(v1.0)/EBRW1903002753*.json' +corpus = ModuWebKorpus(paths_or_dir) + +corpus.train[0] +# 오메가3와 비타민C, 달맞이꽃종자유 등을 사려고 몇 시간을 검색하며 공부했다. 그 결과 오염되지 않은 ... +type(corpus.train[0]) +# str +for doc in corpus.train: + type(doc) # str +``` \ No newline at end of file From a7d7ff4c65eaa95a7fb38448d14e01a8355b80e0 Mon Sep 17 00:00:00 2001 From: lovit Date: Sat, 10 Oct 2020 17:32:53 +0900 Subject: [PATCH 3/4] Unify variable name `paths_or_dir` (#103, #113) --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 1fd4c3a..cceb400 100644 --- a/README.md +++ b/README.md @@ -491,18 +491,18 @@ koen_news.dev[0] ```python from Korpora.korpus_modu_news import ModuNewsKorpus -news_paths_or_news_dir = 'path/to/NIKL_NEWSPAPER(v1.0)/NPRW190000001*.json' # wildcard -news_paths_or_news_dir = 'path/to/NIKL_NEWSPAPER(v1.0)' +paths_or_dir = 'path/to/NIKL_NEWSPAPER(v1.0)/NPRW190000001*.json' # wildcard +paths_or_dir = 'path/to/NIKL_NEWSPAPER(v1.0)' # LOAD ONYL TITLE & PARAGRAPH -news_corpus = ModuNewsKorpus(news_paths_or_news_dir, load_light=True) +news_corpus = ModuNewsKorpus(paths_or_dir, load_light=True) news_corpus.train[0] # ModuNewsLight(document_id='NPRW1900000010.1', title='한국경제 2018년 기사', paragraph='"라니냐로 겨울 가뭄 온다"… ...') news_corpus.train[0].document_id # 'NPRW1900000010.1' # LOAD ALL ATTRIBUTES IN CORPUS -news_corpus = ModuNewsKorpus(news_paths_or_news_dir, load_light=False) +news_corpus = ModuNewsKorpus(paths_or_dir, load_light=False) news_corpus.train[0] # ModuNews(document_id='NPRW1900000010.1', title='한국경제 2018년 기사', author='김현석', publisher='한국경제신문사', date='20180101', topic='생활', original_topic='국제', paragraph=['"라니냐로 겨울 가뭄 온다"…', '...']) @@ -565,8 +565,8 @@ corpus.train[0].speaker_id[:10] ```python from Korpora.korpus_modu_web import ModuWebKorpus -paths_or_dir = '/Users/hyunjoongkim/local/modu/National_Institute_Korean_Language/NIKL_WEB(v1.0)/' -paths_or_dir = '/Users/hyunjoongkim/local/modu/National_Institute_Korean_Language/NIKL_WEB(v1.0)/EBRW1903002753*.json' +paths_or_dir = 'path/to//NIKL_WEB(v1.0)/' +paths_or_dir = 'path/to/NIKL_WEB(v1.0)/EBRW1903002753*.json' corpus = ModuWebKorpus(paths_or_dir) corpus.train[0] From a14acb692a2c2699c5c5a01db8a255c1c1e41911 Mon Sep 17 00:00:00 2001 From: "gichang.lee" Date: Sat, 10 Oct 2020 18:12:23 +0900 Subject: [PATCH 4/4] fix typo (#113) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cceb400..cae3432 100644 --- a/README.md +++ b/README.md @@ -565,7 +565,7 @@ corpus.train[0].speaker_id[:10] ```python from Korpora.korpus_modu_web import ModuWebKorpus -paths_or_dir = 'path/to//NIKL_WEB(v1.0)/' +paths_or_dir = 'path/to/NIKL_WEB(v1.0)/' paths_or_dir = 'path/to/NIKL_WEB(v1.0)/EBRW1903002753*.json' corpus = ModuWebKorpus(paths_or_dir)