Buttercoco

메모의 힘

life2019. 11. 5. 14:53
반응형

이 글을 쓰는 이유는 내 개인적인 메모에 대한 생각을 블로그에 남기고자 쓴다.

글을 어찌해서 보게 된 분들에게 도움이 되었으면 좋겠다.

 

일단 내가 메모를 쓰는 이유는 이러하다.

인생을 살면서 생산되는 정보량은 엄청나고, 나는 그것들을 절대 다 이해하지 못할 뿐 더러

나에게 필요한 정보만 기억하기도 어렵다(당연히 계속 상기시키지 않는 이상 망각하기 때문에)

그래서 내 개인적인 생각으로는 암기가 필요하지 않으면서 중요도가 덜하고 응용이 필요하지 않은

단문 또는 장문의 데이터는 메모하는 것이 좋다고 생각한다.

 

2019년 11월 5일 현재 메모앱인 에버노트를 적극적으로 써온지가 3년이 지났다.

처음에는 대학생 시절인 2014년부터 2015년까지는 간편한 구글의 Keep을 사용하였으나

에버노트의 많은 기능에 반해서 현재 3년 넘게 사용하고 있는 중이다.

아무튼 메모의 장점은 이루말할 수 없을 정도로 많은 것 같다.

내가 생각하는 메모의 종류는 크게 두 종류라고 생각한다.

  1. 수기로 작성하는 아날로그 메모
  2. 컴퓨터나 디지털기기로 작성하는 디지털 메모

두 가지 방식의 메모는 서로의 단점을 보완해 주는 장점이 있고 하니 따라서 두가지 메모는 상황에 따라서

이용하는 것이 좋다고 생각한다.

 

  1. 수기로 작성하는 메모 – 일상 생활에서 아주 흔한 메모방식이긴 하나 쓰는 사람에 따라서 가독성에 차이가 있고, 내용이 장문이 될 경우 보기가 힘들어 진다. 따라서 저는 아날로그 메모를 할 때는 다른 사람의 이야기나 내용을 보고 핵심이 되는 키워드만 적어 놓고, 이해가 어려우면 간단한 모식도? 혹은 그림으로 표현을 하여 나중에 기억을 할 수 있도록 한다.
  2. 디지털 메모 – 내 개인적인 생각으로는 나는 세상이 한창 디지털화가 되어가는 좋은 시대에 태어났다고 생각한다. 만약 조선시대에 태어 났다면 나는 농사나 짓고 있을지도 모른다… 아무튼 디지털 메모의 장점은 단문이던 장문이던 그림이건 사진이건 그대로 저장할 수 있다는 점이다. 그리고 또 편리하기도 하다. 스크래핑을 해도 몇초가 걸리지 않는다. 이러한 디지털 메모의 장점은 거의 무한하다고 생각이 된다. 현재 우리 세계에서 전자기기의 저장용량은 엄청나다. 텍스트로 24시간 365일 평생 해도 자신의 컴퓨터 하드디스크를 절대로 다 채울 수 없을 것이다. 이러한 저장 공간의 장점 외에도 빠른 작성, 복사 붙여넣기 등이 있지만 제일 큰 장점이라고 생각하는 것은 색인 기능이다. 아날로그와 비교해서 수만 개의 메모에서 하나의 메모를 찾거나 혹은 몇개의 메모를 찾을 때 디지털 메모는 시간이 얼마 걸리지 않아 다 찾아 준다.

 

그래서 나는 메모하는 것을 추천한다. 특히 디지털 시대에 메모앱은 정말 좋은 것 같다.

 

메모앱 중에 알고 있는 것을 보자면

구글 Keep, – UX가 심플하고 간단한 내용들을 다루기에 좋다.

에버노트 – 많은 기능(웹스크래핑 기능은 정말 좋다고 생각)을 지원하고, 연동되는 앱들이 많다. 플랫폼 또한 넓어서 괜찬다고 생각한다.

 

딱 2가지 추천한다. 왜냐하면 이 두가지만 써보았다;;

나는 에버노트를 카테고리를 나누어 사용한다.

예를 들어 / 자기개발 / 아이디어 / 기록 / 업무 / 개인 /   이런식으로 카테고리를 나눈 뒤

카테고리에 맞게 메모를 하면서 사용을 하고 있다. 이렇게 하면 카테고리별로 메모를 볼 수도 있으며,

관리하기도 편하다~

반응형

안녕하세요. 이번에는 간단하게 nested json 포맷 데이터를 csv로 변환하는 코드를

여러분께 공유해 드리려고 합니다.

 

전체 코드부터 공유하겠습니다.

# -*- coding: utf-8 -*-

import json
import glob
from traceback import format_exc

from multiprocessing import Process

workers = 10

def iterdict(d, seq, fc):
    for k,v in d.items():
        if isinstance(v, dict):
            iterdict(v, seq + "/" + k, fc)
        elif isinstance(v, list):
            for e in v:
                iterdict(e, seq + "/" + k, fc)
        else:
            print(seq + "/" + k + ", " + str(v).replace("\n", '\\n'))
            fc.write(seq + "/" + k + ", " + str(v).replace("\n", '\\n') + "\n")

def multi_proc(json_data_list, output_path):

    for json_name, json_data in json_data_list:
        save_path = output_path + "/" + json_name + ".csv"
        fc = open(save_path, "a")
        fc.write("key, value\n")
        iterdict(json_data, "data", fc)
        fc.close()


# 메인 메서드
def main_convert(input_json_path, output_path):

    # json 파일들이 존재하는 경로의 모든 파일을 가져옴
    json_path = glob.glob(input_json_path + "/*")

    json_data_list = []

    for each_path in json_path:

        each_json_name = each_path.split("/")[-1].split(".")[0]

        f = open(each_path, "r")
        json_data = {}
        try:
            json_data = json.loads(f.read())
        except:
            print(format_exc())

        f.close()
        json_data_list.append([each_json_name, json_data])

    proc_list = []
    for wk in range(workers):
        front = int(len(json_data_list) * (wk / workers))
        rear = int(len(json_data_list) * ((wk + 1) / workers))

        proc = Process(target=multi_proc, args=(json_data_list[front:rear], output_path,))
        proc_list.append(proc)

    for proc in proc_list:
        proc.start()

    for proc in proc_list:
        proc.join()

 

사용 방법을 먼저 소개하겠습니다

여러분이 사용하는 코드에 main_convert() 메서드를 호출합니다.

메서드안에 두개의 파라미터를 입력합니다.(json file path, csv output path)

그리고 실행시키면 됩니다.

 

그리고 간단하게 코드를 리뷰하겠습니다.

먼저 main_convert 메서드에서 glob 내장함수를 통해 지정한 경로내에서 모든 파일을 불러옵니다.

불러온 파일들을 모둘 읽어들여서 json_data_list에 할당합니다.

그리고 코드의 상단에서 지정한 workers의 수만큼 프로세스를 데이터를 태워서 다수의 json 파일이 csv로

프로세스 개수의 비례한 속도로 변환이 되게 됩니다.

 

multi_proc() 메서드는 iterdict()메서드에 각각의 json을 파싱시켜 csv로 저장시키는 역할을 합니다.

 

여기까지 간단한 코드 소개를 마치겠습니다.

반응형

안녕하세요 coconut입니다. 오랜만에 BERT에 관해 포스팅을 하게 되었습니다.

BERT(Bidirectional Encoder Representations from Transformers)는 구글에서 배포한 오픈 소스입니다.

BERT 전에는 NLP 알고리즘으로 높은 퍼포먼스를 자랑하던 ensemble 기법이 있었는데요.

BERT가 Release되고, 많은 분들이 시도를 해보시고 인기도 좋아서 저도 시도를 해보았는데요,

BERT를 한글 기준으로 돌릴 수 있도록 LG CNS에서 데이터를 제공하였는데요,  https://korquad.github.io/ 에서

데이터를 확인하실 수 있습니다.

 

우선 https://github.com/google-research/bert 에 접속하여 bert 오픈소스를 받아 줍니다. 혹은

git clone https://github.com/google-research/bert.git 으로 받으셔도 됩니다.

 

그리고 fine tuning이 제외된 초기 상태로 진행할 거라면 BERT-Base, Multilingual Cased (New, recommended) 파일도

받아줍니다.

 

받은 파일을 압축을 풀고 directory 하나를 생성하여 그 안에 넣어줍니다.(저는 pretrained 라고 하였습니다.)

 

그리고 위의 https://korquad.github.io/ 에 접속하여 Training set 과 Dev set 그리고 evaluating 하기 위해

Evaluation script를 받아 줍니다.

 

그럼 총 세 개의 파일을 받을 수 있는데요

KorQuAD_v1.0_train.json

KorQuAD_v1.0_dev.json

evaluate-v1.0.py

요 세개를 받으시면 됩니다.

 

아까 생성한 directory 에 이 파일들도 넣어주셔도 되고, 아니면 그냥 따로 다른 directory 에 넣어주셔도 됩니다.(korquad라고 설정하였습니다.)

이제 tensorflow_gpu 버전이 설치된 서버에서 training을 시켜줍니다.

python run_squad.py –bert_config_file=pretrained/bert_config.json –vocab_file=pretrained/vocab.txt –output_dir=output –do_train=True –train_file=korquad/KorQuAD_v1.0_train.json –do_predict=True –predict_file=korquad/KorQuAD_v1.0_dev.json –do_lower_case=false –num_train_epochs=3.0 –max_seq_length=128 –train_batch_size=32 –init_checkpoint=pretrained/bert_model.ckpt

위의 스크립트대로 실행하였으나 Out Of Memory 이슈로 실행을 하지 못하여 적당히 조절하면서 테스트를 진행하였습니다.

 

아래는 메모리가 12기가인 GPU 기준으로 max_seq_length와 train_batch_size를 정리하여 놓은 표입니다.

 

몇 시간 뒤에 training이 끝나면 output 디렉터리에 predictions.json 과 training model 파일들이 생성이 되어 있습니다.

python evaluate-v1.0.py KorQuAD_v1.0_dev.json predictions.json 을 하여 evaluating을 할 수 있습니다.

 

여기까지 마치겠습니다.