Building econ_news_kr corpus#

Prepare an environment#

# %config InlineBackend.figure_format='retina's
from ekorpkit import eKonf

eKonf.setLogger("WARNING")
print("version:", eKonf.__version__)
print("is notebook?", eKonf.is_notebook())
print("is colab?", eKonf.is_colab())
print("environment variables:")
eKonf.print(eKonf.env().dict())
version: 0.1.38+26.g3d56094
is notebook? True
is colab? False
environment variables:
{'CUDA_DEVICE_ORDER': None,
 'CUDA_VISIBLE_DEVICES': None,
 'EKORPKIT_CONFIG_DIR': '/workspace/projects/ekorpkit-book/config',
 'EKORPKIT_DATA_DIR': None,
 'EKORPKIT_LOG_LEVEL': 'WARNING',
 'EKORPKIT_PROJECT': 'ekorpkit-book',
 'EKORPKIT_WORKSPACE_ROOT': '/workspace',
 'KMP_DUPLICATE_LIB_OK': 'TRUE',
 'NUM_WORKERS': 230}

Build a corpus#

Hide code cell content
data_dir = "../data/econ_news_kr"
ekorpkit \
    project=esgml \
    dir.workspace=/workspace \
    verbose=true \
    print_config=false \
    num_workers=200 \
    cmd=fetch_builtin_corpus \
    +corpus/builtin=econ_news_kr \
    corpus.builtin.io.force.summarize=true \
    corpus.builtin.io.force.preprocess=true \
    corpus.builtin.io.force.build=true \
    corpus.builtin.io.force.download=false

Load a corpus#

corpus_cfg = eKonf.compose("corpus", overrides=["project=esgml"])
corpus_cfg.name = "econ_news_kr"
corpus_cfg.verbose = False
econ_news_kr = eKonf.instantiate(corpus_cfg)
print(econ_news_kr)
INFO:ekorpkit.base:Loaded .env from /workspace/projects/ekorpkit-book/config/.env
INFO:ekorpkit.base:setting environment variable CACHED_PATH_CACHE_ROOT to /workspace/.cache/cached_path
INFO:ekorpkit.base:setting environment variable KMP_DUPLICATE_LIB_OK to TRUE
Corpus : econ_news_kr
econ_news_kr.metadata
id date code category filename split
0 0 2020-11-01 06:01:24 02100101 None 02100101.20201101060124001.txt train
1 1 2020-11-01 08:27:23 02100101 None 02100101.20201101082723001.txt train
2 2 2020-11-01 09:01:50 02100101 None 02100101.20201101090150001.txt train
3 3 2020-11-01 09:05:15 02100101 None 02100101.20201101090515001.txt train
4 4 2020-11-01 09:26:41 02100101 None 02100101.20201101092641001.txt train
... ... ... ... ... ... ...
1090653 1090653 2022-02-28 18:49:28 02100851 None 02100851.20220228184928001.txt train
1090654 1090654 2022-02-28 19:04:38 02100851 None 02100851.20220228190438002.txt train
1090655 1090655 2022-02-28 19:37:36 02100851 None 02100851.20220228193736001.txt train
1090656 1090656 2022-02-28 20:51:36 02100851 None 02100851.20220228205136001.txt train
1090657 1090657 2022-02-28 22:33:23 02100851 None 02100851.20220228223323001.txt train

1090658 rows × 6 columns

econ_news_kr.data
id text split ext
0 0 '사보'는 기업들의 소통수단이다. 계열사 정보 공유 측면도 있다. 또한 대외적으로 ... train txt
1 1 2030을 주축으로 한 이른바 '동학개미운동'이 계속되는 등 주식 투자 열풍이 사그... train txt
2 2 현대모비스가 사회적 거리두기 캠페인에 발맞춰 지난 2월부터 임시적으로 시행해오던 재... train txt
3 3 우리나라 수출이 한 달 만에 다시 감소세로 전환했다.\n산업통상자원부는 10월 수출... train txt
4 4 국내 외식업계에 '푸드테크(Food+Technology)' 바람이 불고 있다. 매년... train txt
... ... ... ... ...
1090653 1090653 서울 시내 대형마트 가공식품 판매대[사진=연합]\n\n\n 스팸과 리챔 등 캔햄 가... train txt
1090654 1090654 [로고=에치에프알]\n\n정보통신 기업 에치에프알(HFR)은 28일 일본 정보통신기... train txt
1090655 1090655 [사진=연합뉴스]\n\n\n 한국거래소는 상장적격성 실질심사 대상으로 결정된 오스템... train txt
1090656 1090656 [사진=유대길 기자 dbeorlf123@ajunews.com]\n\n고승범 금융위원... train txt
1090657 1090657 [사진=아주경제 DB]\n\n\n◆ [우크라 침공] 러·우크라 회담 개시… 회담 성... train txt

1090658 rows × 4 columns

cfg = eKonf.compose("pipeline", overrides=["project=esgml"])
cfg.data.corpus = corpus_cfg
cfg._pipeline_ = ["chunk", "explode_splits", "reset_index", "save_dataframe"]
cfg.chunk.len_func = "len_words"
cfg.chunk.chunk_size = 200
cfg.explode_splits.id_key = "id"
cfg.explode_splits.split_key = "chunk_id"
cfg.explode_splits.separator = "\n\n"
cfg.reset_index.drop_index = True
cfg.save_dataframe.output_dir = data_dir
cfg.save_dataframe.output_file = "econ_news_kr_chunks.parquet"
chunk_df = eKonf.instantiate(cfg)
chunk_df
INFO:ekorpkit.base:instantiating ekorpkit.pipelines.pipe.pipeline...
INFO:ekorpkit.base:instantiating ekorpkit.pipelines.data.Data...
INFO:ekorpkit.datasets.base:Loaded info file: /workspace/data/datasets/corpus/ekorpkit/econ_news_kr/info-econ_news_kr.yaml
INFO:ekorpkit.io.file:Processing [1] files from ['econ_news_kr-train.parquet']
INFO:ekorpkit.io.file:Loading 1 dataframes from ['/workspace/data/datasets/corpus/ekorpkit/econ_news_kr/econ_news_kr-train.parquet']
INFO:ekorpkit.io.file:Loading data from /workspace/data/datasets/corpus/ekorpkit/econ_news_kr/econ_news_kr-train.parquet
INFO:ekorpkit.info.column:index: index, index of data: None, columns: ['id', 'text', 'split', 'ext'], id: ['id']
INFO:ekorpkit.info.column:Adding id [split] to ['id']
INFO:ekorpkit.info.column:Added id [split], now ['id', 'split']
INFO:ekorpkit.info.column:Added a column [split] with value [train]
INFO:ekorpkit.io.file:Processing [1] files from ['meta-econ_news_kr-train.parquet']
INFO:ekorpkit.io.file:Loading 1 dataframes from ['/workspace/data/datasets/corpus/ekorpkit/econ_news_kr/meta-econ_news_kr-train.parquet']
INFO:ekorpkit.io.file:Loading data from /workspace/data/datasets/corpus/ekorpkit/econ_news_kr/meta-econ_news_kr-train.parquet
INFO:ekorpkit.info.column:Added a column [split] with value [train]
INFO:ekorpkit.info.column:No timestamp key found
INFO:ekorpkit.io.file:Concatenating 1 dataframes
INFO:ekorpkit.pipelines.pipe:Applying pipeline: OrderedDict([('chunk', 'chunk'), ('explode_splits', 'explode_splits'), ('reset_index', 'reset_index'), ('save_dataframe', 'save_dataframe')])
INFO:ekorpkit.base:Applying pipe: functools.partial(<function chunk at 0x7f0faefeb670>)
INFO:ekorpkit.pipelines.pipe:instantiating segmenter
INFO:ekorpkit.base:instantiating ekorpkit.preprocessors.segmenter.Segmenter...
INFO:ekorpkit.base:Using batcher with minibatch size: 1000
INFO:ekorpkit.utils.batch.batcher: backend: joblib  minibatch_size: 1000  procs: 230  input_split: False  merge_output: True  len(data): 1090658 len(args): 5
INFO:ekorpkit.pipelines.pipe: >> elapsed time to segment: 0:00:45.203924
INFO:ekorpkit.base:Applying pipe: functools.partial(<function explode_splits at 0x7f0faefeb040>)
INFO:ekorpkit.pipelines.pipe:Exploding column: {'_func_': {'_partial_': True, '_target_': 'ekorpkit.pipelines.pipe.explode_splits'}, 'apply_to': 'text', 'id_key': 'id', 'split_key': 'chunk_id', 'separator': '\n\n', 'verbose': True}
INFO:ekorpkit.pipelines.pipe:1090658 documents exploded into 1816019 documents
INFO:ekorpkit.base:Applying pipe: functools.partial(<function reset_index at 0x7f0faefeb160>)
INFO:ekorpkit.pipelines.pipe:Resetting index: {'_func_': {'_partial_': True, '_target_': 'ekorpkit.pipelines.pipe.reset_index'}, 'index_column_name': 'id', 'drop_index': True, 'verbose': True}
INFO:ekorpkit.base:Applying pipe: functools.partial(<function save_dataframe at 0x7f0faefebe50>)
INFO:ekorpkit.io.file:Saving dataframe to ../data/econ_news_kr/econ_news_kr_chunks.parquet
   id                                               text  split  ext  chunk_id
0   0  '사보'는 기업들의 소통수단이다. 계열사 정보 공유 측면도 있다. 또한 대외적으로 ...  train  txt         0
1   0  안병덕 코오롱그룹 부회장은 "사보를 통해 코오롱인은 하나가 되었고, 자긍심을 키워왔...  train  txt         1
2   0  코오롱 관계자는 "600호에 이르기까지 인쇄 사보를 중심으로 온라인, 모바일 환경 ...  train  txt         2
3   1  2030을 주축으로 한 이른바 '동학개미운동'이 계속되는 등 주식 투자 열풍이 사그...  train  txt         0
4   1  한국투자증권은 지난 8월 소액으로 투자 가능한 해외주식 모바일 앱 '미니스탁'을 선...  train  txt         1
INFO:ekorpkit.io.file: >> elapsed time to save data: 0:03:28.173666
id text split ext chunk_id
0 0 '사보'는 기업들의 소통수단이다. 계열사 정보 공유 측면도 있다. 또한 대외적으로 ... train txt 0
1 0 안병덕 코오롱그룹 부회장은 "사보를 통해 코오롱인은 하나가 되었고, 자긍심을 키워왔... train txt 1
2 0 코오롱 관계자는 "600호에 이르기까지 인쇄 사보를 중심으로 온라인, 모바일 환경 ... train txt 2
3 1 2030을 주축으로 한 이른바 '동학개미운동'이 계속되는 등 주식 투자 열풍이 사그... train txt 0
4 1 한국투자증권은 지난 8월 소액으로 투자 가능한 해외주식 모바일 앱 '미니스탁'을 선... train txt 1
... ... ... ... ... ...
1816014 1090655 [사진=연합뉴스]\n 한국거래소는 상장적격성 실질심사 대상으로 결정된 오스템임플란트... train txt 0
1816015 1090656 [사진=유대길 기자 dbeorlf123@ajunews.com]\n고승범 금융위원장이... train txt 0
1816016 1090657 [사진=아주경제 DB]\n◆ [우크라 침공] 러·우크라 회담 개시… 회담 성과는 미... train txt 0
1816017 1090657 서울시 등 각 지방자치단체에 따르면 이날 0시부터 오후 9시까지 전국 17개 시도에... train txt 1
1816018 1090657 청년희망적금은 정부가 청년층의 자산형성을 돕기 위해 내놓은 정책금융 상품이다. 직전... train txt 2

1816019 rows × 5 columns

chunk_df = eKonf.load_data("econ_news_kr_chunks.parquet", data_dir)
347 768
chunk_df.text[0]
'\'사보\'는 기업들의 소통수단이다. 계열사 정보 공유 측면도 있다. 또한 대외적으로 기업을 알리는 수단이다. 그런데 최근 사보를 중단하거나, 종이 대신 온라인 사보로 대체하는 기업들이 늘어나고 있다. 사보 대신 SNS 등을 통해 사내 소통에 나선 기업들도 많다. 종이 사보도 자취를 감춰가고 있는 중에도 책자 형태 사보를 고수하는 대기업이 있다. 최근 600호를 발행한 코오롱그룹이다.\n이웅열 코오롱그룹 명예회장은 600호 사보를 통해 "사보는 코오롱 가족 모두가 함께 걸어온 발자취이자 코오롱만의 희로애락이 담긴 일기장"이라며 "코오롱 사보가 과거 기록으로 그치지 않고 코오롱의 미래를 위한 소통의 역할을 해 나가길 바란다"고 밝혔다.\n코오롱 사보는 이원만 창업 회장 시절인 1967년 8월 창간됐다. 당시 이름은 코오롱뉴스였다. 1970년 6월 코오롱뉴스에서 코오롱사보로 제호를 변경했으며, 1976년 5월 문화공보부에 월간 정기간행물 등록을 했다. 그해 9월엔 100호 사보가 발행됐다. 1977년엔 이동찬 코오롱그룹 2대 회장이 취임했다.\n1980년대 해외진출이 본격화하면서, 1981년 10월엔 해외지사 탐방기사가 사보에 처음으로 등장했다. 85년 200호에 이어 94년 300호 사보가 나왔다. 1997년 5월엔 코오롱그룹 창립 40주년 특집호를 발행했다. IMF 외환위기는 사보에도 영향을 미쳤다. 월간으로 발행되던 사보는 1998년 1월부터 1999년 12월까지 격월간으로 발행됐다. 2000년 1월 다시 매월 발행되기 시작했으며, 2004년 2월 400호엔 이웅열 당시 회장 인터뷰도 수록됐다. 2012년 1월 모바일 사보가 등장했으며, 그해 6월 500호 사보가 나왔다. 이웅열 회장은 2018년 11월 퇴임을 발표했으며, 장남 이규호 전무는 코오롱인더스트리 FnC부문 COO(최고운영책임자)다.'
chunk_df.nunique()
id          1090658
text        1740421
split             1
ext               1
chunk_id         33
dtype: int64

Load company code info#

cfg = eKonf.compose("io/loader=plaintext_parser")
cfg.data_dir = "/workspace/data/tbts/archive/datasets/source/econ_news_kr"
cfg.data_sources = "20220905_company50.zip"
cfg.data.item = dict(filename="filename", codes="codes")
cfg.parser.split = True
cfg.parser.data_key = "codes"
cfg.parser.progress_per = None
code_info = eKonf.load_data(**cfg)
eKonf.save_data(code_info, "econ_news_code_info_20220905.parquet", data_dir)
Hide code cell output
{'filename': '20200101_20200115.txt', 'codes': '02100101.20200101040200001,000660,005930'}
code_info["len"] = code_info.codes.str.len()
code_info_available = code_info[code_info.len > 26]
code_info_available["filename"] = code_info_available.codes.str[:26] + ".txt"
code_info_available["codes"] = code_info_available.codes.str[27:]
code_info_available["codes"] = code_info_available.codes.str.split(",")
code_info_available["num_codes"] = code_info_available["codes"].apply(len)
code_info_available = code_info_available.explode("codes").reset_index(drop=True)

eKonf.save_data(code_info_available, "econ_news_code_info_available_20220905.parquet", data_dir)
code_info_available
filename codes len num_codes
0 02100101.20200101040200001.txt 000660 40 2
1 02100101.20200101040200001.txt 005930 40 2
2 02100101.20200101040200002.txt 005930 40 2
3 02100101.20200101040200002.txt 066570 40 2
4 02100101.20200101040202001.txt 000270 40 2
... ... ... ... ...
198598 02100851.20220531150108001.txt 032640 47 3
198599 02100851.20220531150108001.txt 017670 47 3
198600 02100851.20220531150108001.txt 030200 47 3
198601 02100851.20220531154303001.txt 006400 40 2
198602 02100851.20220531154303001.txt 051910 40 2

198603 rows × 4 columns

code_info_available.nunique()
filename     74614
codes           50
len             19
num_codes       19
dtype: int64
code_info_available.num_codes.hist(bins=50)
<AxesSubplot:>
../../../_images/0f3ec12d41c0149dc4811fbe8c50b96d33007c704614002f067ead389ae6e9da.png

Filter out data without code info#

filtered_data = chunk_df.merge(econ_news_kr.metadata, on="id").merge(
    code_info_available.drop_duplicates(subset=["filename"]), on="filename"
)
cols = ["id", "chunk_id", "text", "filename"]
filtered_data = filtered_data[cols]
eKonf.save_data(filtered_data, "econ_news_filtered_20220905.parquet", data_dir)

filtered_data
id chunk_id text filename
0 11 0 문재인 대통령이 지난해 전용차로 선택한 수소전기차 '넥쏘'가 중·장년층 남성들로부터... 02100101.20201101113442001.txt
1 11 1 넥쏘는 국내 뿐만 아니라 해외에서도 코로나19 확산 여파를 이겨내고 질주하고 있다.... 02100101.20201101113442001.txt
2 19 0 LG전자는 국내 최대 쇼핑 행사 ‘2020 코리아세일페스타’에 맞춰 11월 1일부터... 02100101.20201101125903001.txt
3 20 0 SK는 그룹 8개 관계사가 한국 최초로 ‘RE100’에 가입한다고 1일 밝혔다.\n... 02100101.20201101130118001.txt
4 20 1 SK 8개사가 신청서를 제출하면 더 클라이밋 그룹의 검토를 거친 후 가입이 최종 확... 02100101.20201101130118001.txt
... ... ... ... ...
160582 1090535 1 업종별로 하락한 업종은 운수창고(-1.22%), 운수장비(-1.12%), 전기전자(... 02100851.20220228093428001.txt
160583 1090566 0 [회사채 미매각 현황]\n회사채 시장에 미매각이 속출하고 있다. 현재 연 1.25%... 02100851.20220228103653001.txt
160584 1090566 1 하지만 가뜩이나 악화된 회사채 시장 분위기에 사고 소식까지 전해지면서 아무도 수요예... 02100851.20220228103653001.txt
160585 1090566 2 이에 채권시장에서 자금을 운용하는 각 증권사들의 부담이 커지고 있다. 대부분이 총액... 02100851.20220228103653001.txt
160586 1090615 0 [사진=아주경제 DB]\n우크라이나와 러시아가 협상 테이블을 마련한다는 소식에 국내... 02100851.20220228154344001.txt

160587 rows × 4 columns

print(filtered_data.info())
filtered_data.nunique()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 160587 entries, 0 to 160586
Data columns (total 4 columns):
 #   Column    Non-Null Count   Dtype 
---  ------    --------------   ----- 
 0   id        160587 non-null  int64 
 1   chunk_id  160587 non-null  int64 
 2   text      160587 non-null  object
 3   filename  160587 non-null  object
dtypes: int64(2), object(2)
memory usage: 6.1+ MB
None
id           75912
chunk_id        21
text        155838
filename     74614
dtype: int64