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

Dev modu web#113 #117

Merged
merged 4 commits into from
Oct 10, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 71 additions & 0 deletions Korpora/korpus_modu_web.py
Original file line number Diff line number Diff line change
@@ -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 기능을 제공하지 않습니다"
)
27 changes: 23 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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=['"라니냐로 겨울 가뭄 온다"…', '...'])

Expand Down Expand Up @@ -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 = '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]
# 오메가3와 비타민C, 달맞이꽃종자유 등을 사려고 몇 시간을 검색하며 공부했다. 그 결과 오염되지 않은 ...
type(corpus.train[0])
# str
for doc in corpus.train:
type(doc) # str
```