카테고리 보관물: 미분류

MeCab 메카브 형태소 분석기

은전한닢 메카브 형태소 분석기

MeCab 형태소분석기에 대해서 간단히 설명하려고 합니다.

MeCab은 이제 우리나라에서 상당히 유명한 형태소 분석기가 되었지만 Mecab(메카부)는 일본어 형태소 분석기입니다.

영어로는 “미캡”이라고 읽어야 하는 것이 맞겠지만 원래 프로젝트 페이지에 카타가나 일본어 표기로 “메카부”라고 되어 있고 일본인들도 대부분 메카부라고 읽기 때문에 “메카부”라고 읽는 것이 맞습니다. 사실 이건 그리 중요하지는 않습니다.

어쨌든 이 포스트에서도 메카부로 읽고 쓰겠습니다.

원래 NTT(일본 통신)에서 배포하는 오픈소스 일본어 형태소분석기이고 제작자는 구글로 이직한 것으로 알려져 있습니다.

상당히 좋은 성능으로 오랫동안 일본에서 가장 많이 쓰이는 오픈소스 형태소분석기 중 하나였습니다.

한국에는 변변한 오픈소스 형태소분석기가 없었던 시절 일본어와 문법체계가 비슷한 한국어를 위해 Mecab를 한국어 용으로 포팅한 은전한닢이라는 프로젝트가 생겨 Mecab를 한국어 용으로 사용하면서 한글 및 한국어 자연어처리 발전에 상당히 기여했습니다.

원본 Mecab를 한국어에서 사용할 수 있는가?

없습니다. 일본어는 한국어와 다르고 일본어에는 필요 없는 것과 한국어에만 있는 것을 적용하는 작업이 필요한데 그 작업을 해 놓은 것이 은전한닢입니다.

은전한닢의 학습 데이터는 어떤 것을 사용했는가?

세종계획 말뭉치와 다른 소스를 사용하고 있다고 알려져 있고 세종계획말뭉치로 학습을 해서 사용해보면 거의 같습니다.

메카부의 구성

메카부는 C++로 작성했습니다. C++만든 모듈은 대부분의 언어에 바인딩을 할 수 있기 때문에 대부분의 언어에서 지원이 가능합니다.

C++, Java, Python, R 등이고 모두 패키지가 있습니다. 물론 안되는 것도 많습니다.

기타 자료

현재는 여러곳에서 파생된 패키지와 소스를 받을 수 있습니다.

Mecab 위키피디아 설명

https://en.wikipedia.org/wiki/MeCab

Mecab 일본어 웹버전

https://fasiha.github.io/mecab-emscripten/

https://github.com/fasiha/mecab-emscripten#mecab-on-the-web

은전한닢 프로젝트 페이지

https://eunjeon.blogspot.com/

Go언어 cron 처럼 스케줄링 하기

cron과 같은 유형의 스케줄러는 데이터 처리를 할 때 반드시 필요합니다.

데이터과학자들은 주로 젠킨스(Jenkins)나 airflow를 사용하겠지만 Python이나 Go로 직접 작성해야 하는 경우도 종종 생깁니다.

패키지 “github.com/jasonlvhit/gocron” 를 사용하는 방법입니다.

package main

import (
	"fmt"
	"github.com/jasonlvhit/gocron"
	"time"
)

func task() {
	fmt.Println("태스크를 실행합니다.")
}

func taskWithParams(a int, b string) {
	fmt.Println(a, b)
}

func main() {
	// 파라미터 없이 잡을 실행
	gocron.Every(2).Seconds().Do(task)
	gocron.Every(1).Minute().Do(task)
	gocron.Every(2).Minutes().Do(task)
	gocron.Every(1).Hour().Do(task)
	gocron.Every(2).Hours().Do(task)
	gocron.Every(1).Day().Do(task)
	gocron.Every(2).Days().Do(task)
	gocron.Every(1).Week().Do(task)
	gocron.Every(2).Weeks().Do(task)

	// 파라미터를 지정해서 잡을 실행
	gocron.Every(1).Second().Do(taskWithParams, 1, "hello")

	// 지정한 요일에 잡을 실행
	gocron.Every(1).Monday().Do(task)
	gocron.Every(1).Thursday().Do(task)

	// 지정한 시각에 잡을 실행 - 'hour:min:sec' - seconds optional
	gocron.Every(1).Day().At("10:30").Do(task)
	gocron.Every(1).Monday().At("18:30").Do(task)
	gocron.Every(1).Tuesday().At("18:30:59").Do(task)

	// Begin job immediately upon start
	gocron.Every(1).Hour().From(gocron.NextTick()).Do(task)

	// Begin job at a specific date/time
	t := time.Date(2019, time.November, 10, 15, 0, 0, 0, time.Local)
	gocron.Every(1).Hour().From(&t).Do(task)

	// NextRun은 다음번 실행될 시간을 알려줌
	_, time := gocron.NextRun()
	fmt.Println(time)

	// 지정한 태스크 제거
	gocron.Remove(task)

	// 모든 스케줄 작업을 제거
	gocron.Clear()

	// 모든 펜딩잡을 시작
	<-gocron.Start()

	// 새 스케줄러를 생성해서 동시에 2개의 스케줄러를 실행
	s := gocron.NewScheduler()
	s.Every(3).Seconds().Do(task)
	<-s.Start()
}

sudo에서 http_proxy 환경변수 적용받기su

일반 계정에서 http_proxy 환경변수를 설정해서 작업을 하다가 sudo를 사용해서 root 권한을 사용할 때 http_proxy 설정이 적용되지 않아 힘들때가 있습니다.

sudo visudo를 하거나 sudo vim /etc/sudoers을 해서 sudoers 파일에 다음의 줄을 추가해 주면 됩니다.

http_proxy 뿐만 아니라 다른 환경변수도 동일한 방법으로 넘겨주는 것이 가능합니다.

Defaults  env_keep +="http_proxy"
Defaults  env_keep +="https_proxy"
Defaults  env_keep +="HTTP_PROXY"
Defaults  env_keep +="HTTPS_PROXY"

혼동행렬 Confusion Matrix

기계학습 모델 평가지표

기계학습으로 생성한 분류 모델, 예측 모델에서 빠지지 않고 나오는 혼동 행렬 (confusion matrix) 입니다.

이름이 혼동행렬(Confusion matrix)인 이유?

기계가 얼마나 참과 거짓을 혼동하는지 확인하는데 사용하는 표이기 때문입니다.

간단하죠.

5개의 주요 성능 지표

혼동행렬에서는 특이도, 정확도, 민감도, 정밀도, 재현율 다섯개의 값은 외워야 합니다.

이중에서 가장 많이 쓰는 것은 정밀도(precision)재현율(recall)입니다.

기계학습 모델의 성능을 한 지표로만 설명하라고 할 때 쓰는 것은 정확도(Accuracy)와 혼동행렬에는 없지만 F1-measure (F1 값)이 있습니다.

F1값은 정밀도화 재현율의 조화평균입니다.

AUROC와 Precision-Recall 그래프

여기서 특이도와 민감도는 ROC 및 AUC 를 계산할 때 쓰고

정밀도와 재현율은 AP 와 Precision-Recall 그래프를 계산할 때 씁니다.

혼동행렬 confusion matrix

아래는 혼동행렬(Confusion Matrix)입니다. 표가 좀 안 이쁘지만 힘들게 그렸으니 알아서 잘 봐주세요.

예측값 Forecast
참 TRUE거짓 FALSE
실제값 Actual참 TRUETP (True Positive)FN (False Negative)
거짓 FALSE FP (False Positive)TN (True Negative)

지표 설명 및 계산법

각 지표값의 정의적 설명과 계산법입니다.

민감도 (Sensitivity)(TP / (TP + FN)) 양성 중 맞춘 양성의 수
특이도 (Specificity)(TN / (FP + TN)) 음성 중 맞춘 음성의 수
정밀도 (Precision)(TP / (TP + FP)) 양성이라고 판정 한 것 중에 실제 양성 수
재현율 (Recall)(TP / (TP + FN)) 전체 양성 수에서 검출 양성 수
정확도 (accuracy)((TP + TN) / (TP + FN + FP + TN)) 전체 개수 중에서 양성과 음성을 맞춘 수

풀어쓴 설명

민감도: 기계가 양성. 즉, positive를 얼마나 잘 꺼내서 맞췄는가를 봅니다.

특이도: 기계가 음성. 즉, Negative인 것을 양성이 아니라고 했는지를 봅니다.

민감도와 특이도는 보통 질병이나 의료에서 많이 쓰는 평가 지표입니다.

정밀도: 기계가 참이라고 했는데 실제 참인 것의 비율입니다. 기계가 얼마나 참을 순도 높게 찍어 내는지 보는 것입니다. 많이 맞추고 아니고는 별로 의미가 없이 기계가 참이라고 한 것 중에 참을 본 것이기 때문에 민감도와 헷갈리면 안됩니다.

재현율: 전체의 실제 참들 중에서 얼마나 기계가 참이라고 골라낸 비율입니다.

정확도: 전체 개수 중에서 기계가 실제 참을 참이라고 하고 실제 거짓을 거짓이라고 한 비율입니다.

습득 요령

처음에 보면 무척 헷갈리는데 외우는 것 보다는 이름과 계산법을 잘 기억하고 의미와 용도를 기억하는 것이 좋습니다. 기억이 안나면 그때 그때 찾아봐도 되지만 매우 빈번하게 쓰이는 것이므로 데이터과학을 공부한다면 그냥 암기해버리는 것이 효율적입니다.