파이썬 한글 자모 분리 패키지

한글 자모분리를 하는 것은 오타처리, 스팸 감지, 욕설, 성적 표현을 주는 키워드 감지 같은 것을 하기 위해서 사용합니다. 몇 번 해보면 재밌지만 자모분리는 정작 뭐 좀 해보려고 하면 쓸데가 별로 없습니다.

Python에서 사용할 수 있는 한글자모분리 패키지 또는 코드 모음입니다.

파이썬 한글 자모분리 패키지 목록

– 한글툴킷: https://github.com/bluedisk/hangul-toolkit

– 한글유틸: https://github.com/kaniblu/hangul-utils

– 한글파이: https://github.com/rhobot/Hangulpy

– 파이썬 자모: https://github.com/JDongian/python-jamo

– 한글 자음/모음 분해 (코드): https://frhyme.github.io/python/python_korean_englished/

– 한글 유니코드 자모분리: https://nunucompany.tistory.com/28

대부분 주요 기능들은 모두 제공하고 있고 사용법도 쉽고 작동도 잘 됩니다.

원하는 것을 선택해서 쓰면 됩니다.

우분투에 Mecab 형태소분석기 설치 – Install Mecab in Ubuntu

우분투에 Mecab(은전한닢) 형태소 분석기를 설치하는 방법입니다.

Mecab 메카브 간략 설명

Mecab를 간단히 설명하면

  • Mecab은 C++로 만든 일본어 형태소분석기입니다.
  • Mecab-ko는 Mecab를 고쳐서 만든 한국어형태소분기이며 “은전한닢”라고 부릅니다.

예전 포스트가 있니 참고하세요.

MeCab 형태소 분석기, 형태소분석기란 무엇인가? 워드세그멘터와 형태소분석기

설치방법

Mecab-Ko는 Mecab 코어 모듈과 Mecab-ko-dic을 먼저 설치해야 하는데 번거롭습니다.

konlpy에 있는 간략 스크립트를 쓰면 쉽게 설치가능합니다.

sudo apt-get install curl git
$ bash <(curl -s https://raw.githubusercontent.com/konlpy/konlpy/master/scripts/mecab.sh)

Mecab만으로는 형태소분석을 테스트하거나 활용하기 어려우니 Python 모듈도 설치해줍니다.

# python3.10은 아직 문제가 있으니 안전하게 조금 오래된 버전으로 간다.
# python3.10 -m pip install mecab-python3
python3.8 -m pip install mecab-python3

파이썬을 실행해서 테스트 해봅니다.

mecab = Mecab()
' '.join(mecab.morphs("무궁화꽃이피었습니다."))
# '무궁화 꽃 이 피 었 습니다 .'

E: Unmet dependencies. Try ‘apt-get -f install’ with no packages (or specify a solution).

우분투에서 패키지를 설치하다가 의존성이 깨지거나 하게 되면 그 뒤로 apt를 실행할 때 마다 에러가 발생합니다. 여간해서는 해결이 잘 안되는데요.

E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).

이렇게 하면 됩니다.

sudo apt-get -o Dpkg::Options::="--force-overwrite" install --fix-broken

출처: https://askubuntu.com/questions/1044817/failed-installation-of-package-breaks-apt-get

[Jenkins] Could not initialize class org.eclipse.jgit.internal.storage.file.FileSnapshot

젠킨스로 git repository를 polling해서 코드가 푸시되었는지 확인한 후에 자동 빌드하는 프로세스를 만들면 로그에 이런 에러가 나면서 실패하는 경우가 있습니다.

Could not initialize class org.eclipse.jgit.internal.storage.file.FileSnapshot

젠킨스의 jgit 관련 클래스가 잘못된 것인데 이건 해결방법이 마땅치 않습니다.

그냥 Jenkins를 LTS가 아닌 최신버전이나 다른 버전으로 바꿔서 설치해야 합니다.

jenkins install Certificate verification failed: The certificate is NOT trusted. The certificate chain uses expired certificate. Could not handshake: Error in the certificate verification.

젠킨스를 설치하는데 지런 에러가 날 수 있습니다.

sudo apt update
sudo apt install jenkins

에러는 이렇습니다.

jenkins install Certificate verification failed: The certificate is NOT trusted. The certificate chain uses expired certificate. Could not handshake: Error in the certificate verification.

certification을 재설치해줘야 해결이 됩니다.

sudo apt install ca-certificates
sudo apt update
sudo apt install jenkins

우분투에서 R 설치하기

2022년 최신판입니다.

늘 똑같은데 최근에 설치하는 방법이 좀 바뀌었군요.

우분투 리눅스에 R을 설치하는 법은 거의 바뀌지 않기 때문에 https://cloud.r-project.org/ 에 방문해서 코드를 복사한 후에 같은 방법을 쓰면 늘 되지만 가끔 방식이 바뀌므로 방문해서 바뀐 것을 확인해봐야 합니다.

빠른 설치 방법

설명을 생략한 코드 복붙이 필요하면 아래의 순서대로 하시면 됩니다.

sudo apt update -qq
sudo apt install --no-install-recommends software-properties-common dirmngr
wget -qO- https://cloud.r-project.org/bin/linux/ubuntu/marutter_pubkey.asc | sudo tee -a /etc/apt/trusted.gpg.d/cran_ubuntu_key.asc
sudo add-apt-repository "deb https://cloud.r-project.org/bin/linux/ubuntu $(lsb_release -cs)-cran40/"
sudo apt install --no-install-recommends r-base
R --version

한줄씩 따라가며 설치하기

복붙만 하다가는 바보가 됩니다. 어떤 순서로 설치하는지 알아둘 필요가 있습니다. 그래야 설치하다 문제가 생기면 어느 부분이 문제인지 알고 처리하는 법을 배울 수 있습니다.

시간이 없고 하기도 싫으면 굳이 지금 할 필요는 없습니다.

# 패키지 인덱스를 업데이트합니다.

sudo apt update -qq

# 헬퍼 패키지 2개를 설치합니다.

sudo apt install --no-install-recommends software-properties-common dirmngr

# 레파지토리 키를 설치합니다.

wget -qO- https://cloud.r-project.org/bin/linux/ubuntu/marutter_pubkey.asc | sudo tee -a /etc/apt/trusted.gpg.d/cran_ubuntu_key.asc

#  R 4.0 레파지토리를 등록합니다.

sudo add-apt-repository "deb https://cloud.r-project.org/bin/linux/ubuntu $(lsb_release -cs)-cran40/"

# 설치합니다.

sudo apt install --no-install-recommends r-base

# 버전을 확인합니다.

$ R --version
R version 4.1.3 (2022-03-10) -- "One Push-Up"
Copyright (C) 2022 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under the terms of the
GNU General Public License versions 2 or 3.
For more information about these matters see
https://www.gnu.org/licenses/.

현재 시점에서는 R 4.1.3이 최신 버전이고 곧 새버전이 출시된답니다.

관련 포스트

우분투 18.04에 R 설치하기 – Install R on Ubuntu 18.04

우분투 18.04에 자바11 설치하기 – Install Java 11 onto Ubuntu 18.04

우분투 18.04에 자바11 설치하는 방법입니다.

18.04가 이제는 구버전이기도 하고 Java가 너무 구버전이 설치되어 있어서 업그레이드가 필요할 때가 많습니다. 보통 Java로 만들어진 애플리케이션들이 비교적 최근 버전의 자바를 요구하는 경우입니다.

설치하기

오픈JDK구버전을 제거합니다.

sudo apt-get remove openjdk*

오라클JDK도 제거합니다.

sudo apt-get remove oracle*

깔끔하게 청소해줍니다.

sudo apt-get autoremove --purge
sudo apt-get autoclean

openjdk 설치해야 하는데 커스텀 레파지토리를 추가하고 설치합니다.

sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt install openjdk-11-jdk

버전을 확인해서 11.x.xx 가 보여야 합니다.

java --version
openjdk 11.0.11 2021-04-20
OpenJDK Runtime Environment (build 11.0.11+9-Ubuntu-0ubuntu2.18.04)
OpenJDK 64-Bit Server VM (build 11.0.11+9-Ubuntu-0ubuntu2.18.04, mixed mode, sharing)

파이썬으로 131072개 이상의 컬럼을 가진 CSV 읽기 – Python CSV – field large than field limit (131072) read csv

Pandas로 큰 CSV파일을 읽다보면 이런 에러가 나올 수 있습니다.
field larger than field limit (131072) read csv

즉 131072개의 컬럼까지만 읽을 수 있다는 것입니다. CSV의 컬럼이 131072개 이상이 있다는 것은 특이한 경우이긴 하지만 차원이 매우 높은 벡터 데이터가 있다거나 할 수 있기 때문에 실제로 이런 CSV파일이 없는 것도 아닙니다.

해결방법은 매우 간단합니다. csv.field_size_limit 함수로 시스템 최대치까지 늘려주시면 됩니다.

csv의 필드 크기 제한을 시스템 한계까지 늘려주면 해결할 수 있습니다.

import sys
import csv

csv.field_size_limit(sys.maxsize)

쉘스크립트 – 시작날짜와 끝날짜 사이의 모든 날짜출력

셀스크립트로 시작날짜부터 끝날짜까지 모든 날짜를 출력하는 코드입니다.

이런게 왜 필요할까 싶겠지만 생각보다 꽤 많이 필요하고 알아두면 편할 때가 많습니다.

보통 날짜별로 데이터를 프로세싱하거나 날짜별로 어떤 일을 처리하는 스크립트를 구간내의 모든 날짜에 대해서 실행하고 싶을 때 쓰거나 합니다.

예를 들면 일별로 배치프로세싱을 만들어서 집계를 하거나 예측이나 최적화 등을 처리하는 어떤 프로세스가 있다고 할때 이런 프로세스를 몇일분을 구간을 줘서 각각 일별로 처리하거나 할 때 말입니다. 이 코드를 알아두면 일별로 실행하는 배치프로세스를 수정하지 않고도 일별로 실행이 가능합니다.

쉘스크립트로 이런 것을 작성하기 어려운 편인데 사실 패턴을 알고 나면 그렇게 어렵지 않습니다.

핵심은 while 구문과 date 코맨드를 잘 사용하는 것입니다.

#!/bin/bash

begin_date="20220209"
end_date="20220410"

while ! [[ $begin_date > $end_date ]]; do
    echo $begin_date
    bash ./daily-batch-processing.sh $begin_date
    begin_date=$(date -d "$begin_date + 1 day" +%Y%m%d)
done

CUDA_ERROR_OUT_OF_MEMORY 에러

CUDA_ERROR_OUT_OF_MEMORY 에러

Tensorflow 작업을 하다보면 이런 에러가 보일 때가 있습니다.

보통 Jupyter notebook을 사용하는 서버 환경에 이런 에러가 보이는데

원인은 GPU를 사용하면서 GPU의 메모리를 할당받고 해제하지 않은 프로세스가 있거나 많기 때문입니다.

이 프로세스가 지금 실행하고 있고 중요한 것이 아니면서 Jupyter notebook으로 실행된 메모리 점유만 하고 사용하지 않는 것이라면 그냥 kill 하면 됩니다.

먼저 nvidia-smi로 GPU의 할당 내역을 보고 nvidia-smi –gpu-reset으로 해제를 시도합니다.

sudo nvidia-smi
sudo nvidia-smi --gpu-reset

하고 나서도 해제가 안된다면 킬 해줍니다.

sudo kill -09 24089

하고 나면 깔끔해진 것을 볼 수 있습니다.

이제 메모리 오류가 발생했던 코드를 다시 실행하면 더 이상 에러가 발생하지 않습니다.

선형대수와 데이터과학

데이터과학을 하려면 선형대수를 꼭 배워야할까?

데이터과학, 기계학습, 데이터마이닝, 인공지능, 통계 등에 항상 따라붙는 수학이 선형대수학입니다. 이와 관련된 채용 공고에도 선형대수학에 대한 기본 또는 충분한 이해가 요건으로 붙는 경우가 많았습니다.

데이터과학을 하려면 선형대수를 꼭 배워야 하나?

이 질문에 대한 대부분의 전문가들의 답은 “그렇다”일 것입니다.

어쩌면 여러분은 “데이터과학을 하는데 선형대수학은 필요없다”는 말을 듣고 싶어서 이 포스트를 보고 있는지도 모르겠습니다.

솔직히 누군가 그렇게 말한 사람이 있다면 그건 “개뻥”입니다. 또는 속성 과정으로 금방 배우고 마스터링 할 수 있다고 말한다면 그것도 “개뻥”입니다.

“얼마만큼 깊이 또는 많이 하느냐”의 차이는 있겠지만 선형대수의 기초 지식은 반드시 필요하며 데이터과학, 데이터분석, 통계, 기계학습, 데이터마이닝과 같은 데이터 관련 고급 기술을 배울 때 선형대수는 필수적입니다. 못하면 멍텅구리가 되거나 결국에는 아예 아무것도 이해하지 못하게 됩니다.

선형대수학은 무엇인가?

무시무시한 어감을 가진 선형대수는 대수학의 한 갈래로 영어로는 “Linear Algebra”이고 “리니어 앨지브라”라고 읽습니다. 발음이 조금 까다롭기 때문에 한국인들은 “선형대수” 또는 “선대”라고 읽습니다.

선형대수학이 무엇인지 쉽게 설명하면

선형대수는 짧게 말하면 벡터와 행렬을 다루는 수학입니다.

  • 벡터는 관련이 있는 숫자들을 묶어 놓은 것이고
  • 행렬은 벡터 여러 개를 묶어서 사각형 깍두기로 만들어 놓은 것입니다.

이렇게 모양을 만들어 놓는 것은 안 중요한데 이렇게 서로 뭔가 관련이 있는 숫자들을 묶어서 뭉치로 만들고 이것들을 서로 곱하고 나누고 빼고 줄이고 바꾸고 이것저것 하면 숫자와 숫자의 관계나 숫자 압축, 숫자 분해이 가능하고 문제를 풀 수 있는 경우가 많아집니다.

즉 선형대수학과 미적분을 사용하면 현실에서 정답을 찾는 것이 아니라 쓸만한 결과를 거의 항상 얻어낼 수 있습니다.

선형대수의 큰 매력은 대부분의 경우에 문제를 해결할 수 있다는 것입니다. 정답이 있다는 것이 아니라 “문제를 해결”한다는 것을 이해해야 합니다.

선형대수는 수학적으로 답이 없는 문제가 있을지라도 현실적으로는 억지로라도 답을 찾거나 가장 그럴듯한 것을 찾아낼 수 있습니다.

답이 없다고 포기할 것이 아니라 가장 그럴듯하고 가장 쓸만한 것을 찾아낸다면 그것이 답인 것인데 선형대수는 그런 것을 하는데 가장 도움이 되는 수학입니다.

왜 이름이 선형대수인가?

선형은 “선의 형태”라는 뜻인데 벡터와 행렬을 다룬다고 하면서 여기에 갑자기 “선”은 왜 나오는가?

선형대수가 있으면 원형대수나 곡형대수 같은 것도 있는가? 이런 의문도 들텐데요.

쪼금 어렵게 말하면 벡터를 다차원공간상에 매핑하고 이 벡터를 여러 연산으로 바꾸게 되면 이 벡터가 차원안에서 직선으로만 움직이기 때문입니다. 벡터는 공간상의 점이라고 하면 이 벡터는 직선운동만 가능합니다. 회전해서 움직일 수 없고 직선이 아니게 바꾸는 유일한 방법은 내적이라는 계산밖에 없습니다.

쉽게 말하면 벡터를 공간에 있는 점으로 표현해서 그림을 그려놓고 이런저런 계산을 해서 이 벡터를 다시 공간상에 점을 찍어 놓고 보면 직선으로만 움직이더라는 것이 이렇게 직선으로만 움직이게 해서 숫자로 부터 어떤 의미나 관계를 찾아내기 때문에 선형대수라고 합니다.

그래서 삼각형과 원의 관계를 다루는 삼각함수가 선형대수에서는 잘 보이지 않습니다. 물론 수학자들이 하는 고등수학에는 선형대수나 삼각함수나 뭐 이것저것 섞여서 빈번하게 나오지만 그건 그 사람들 알아서 할 일이구요.

데이터과학을 위해서선형대수를 꼭 배워하는 이유?

선형대수학을 모르고 데이터과학, 통계분석, 데이터마이닝, 기계학습, 인공지능을 한다면 어떤 알고리즘이나 방법(프레임워크나 스킴)의 원리를 이해하지 못하게 됩니다.

이해하지 못하면 다룰 수 없고 알고리즘같은 것이 압도당하고 지배당하게 됩니다.
샘플 코드 복붙해서 실행하는 것인 모델 빌드나 데이터 과학의 전부가 아닙니다.

간단한 예로 선형회귀(Linear Regression)에 대해서 얘기해보면

선형회귀는 처음보면 단순하고 쉬워 보이지만 기저를 다 이해하기 상당히 까다롭고 어렵습니다. 기본을 이해하지 못하면 결국 제대로 다루지 못하고 그 보다 더 복잡하고 난해한 알고리즘은 사용하지 못합니다.

선형회귀를 이해하기 위해서는 OLS를 알아야하고 그러려면 행렬연산이나 이것저것 선형대수와 미적분을 알아야합니다. 제대로 이해하지 못한채 경험적으로 암기한 내용으로만 선형회귀를 하고 나서는 엉뚱한 선형회귀 모델을 만들어 놓고 “이게 왜이러지?”하고 고민하는 경우를 많이 봤습니다.

숫자묶음에서 특징을 추출하는 특이값분해 같은 기법도 선형대수를 배우지 않으면 1도 이해하지 못합니다.

인공지능에서 숱하게 사용하는 경사하강(Gradient Desecnt)과 역전파(Back propagation)같은 것은 선형대수와 미적분의 컬래버입니다.

어떻게 배우면 될까? 문과도 가능할까?

선형대수는 대수학 중에서 매우 쉬운 수학 중에 하나입니다.

대수학들 (미적분, 선형대수학, 위상수학 등…)중에서 쉽다는 말이지 쉽다는 것이 절대 아닙니다.

문과든 이과든 이 선형대수학은 쉬운것 같지만 그렇게 쉽지 않습니다.

그렇다고 수포자가 못할 정도의 것은 아닙니다. 이것도 역시 사람이 만든 것이기 때문입니다.

선형대수학 공부를 쉽게 접근하려면

온라인 강의를 많이 들으면 좋습니다. 요즘 유튜브에 강의가 참 많이 있습니다. 하지만 시간이 많이 든다는 것을 알아야 하고 이해가 될 때까지 반복해서 듣거나 이해가 안되면 다른 강의를 찾는 것이 좋습니다.

가장 유명한 강의이고 추천할 강의는 길버트 스트랭 MIT 교수님의 선형대수학 강의이고 자막이 있습니다.

온라인 강의가 싫으면 결국 대학교재 중에 좋은 것을 하나 읽어야 하는데 “공업수학”교재를 찾으면 됩니다. 크레이그 공업수학 책이 가장 잘 알려진 편이지만 기초가 없으면 독학하기에 조금 어렵지만 못할 것도 아닙니다.

이런 책은 이해가 안되더라도 처음부터 끝까지 다 읽어야 좋은데 고등학교 이과 수준의 수학을 다 알고 대학에서 배우는 고등수학도 일부 알아야 한다는 점입니다.

늦지 않았을까?

늦었다고 시작했을 때는 늦은 겁니다.
하지만 더 늦으면 계속 늦어지기만 할 뿐입니다.
조금씩 하다보면 언젠가는 선형대수가 만만해지는 시기가 옵니다.
물론 이럴때가 또 위험하 시기이긴 하지만 말이죠.

중요한 것은 “지금부터 해도 나는 안될꺼야” 라는생각과 “책 한 권만 떼면 금방 마스터 할 수있을꺼야” 라는 생각을 버리는 것입니다.

파이썬 문자열에서 특수문자 제거하는 3가지 방법 – python 3 ways to remove punctuations from a string

Python으로 특수기호 제거하는 예제입니다.

자연어처리, 크롤한 데이터 정제 등을 할 때 특수문자를 제거하거나 클린징을 해야 할 때 많이 하는 작업입니다.

특히 비정형 데이터 중에서 텍스트(문자열)을 다루다보면 계속 해야 하는 그런 작업입니다.

짧게 먼저 요약하면

  • 가장 빠른 것은 translate() 메서드를 사용하는 것이고
  • 그 다음은 string.replace() 메서드를 사용하는 것이고
  • 가장 느린 것은 정규표현식을 사용하는 것입니다.

속도가 문제되지 않으면 (느려도 되면) 정규표현식을 사용하는 것이 가장 유연하고 좋습니다. 특정 문자를 넣고 빼거나 숫자를 포함하거나 하는 여러가지 작업을 할 수 있습니다.

3가지 방법의 소스코드를 참고하세요.

translate() 함수 사용하기

# strings 패키지의 translate() 함수를 사용하여 특수기호를 제거하는 예제
import string
input_string = '!hi. wh?at is the weat[h]er lik?e. !@##$%%^^&*)_+{}|?"'
output_string = input_string.translate(str.maketrans('', '', string.punctuation))
print(output_string)
# Returns: hi what is the weather like
# 제거되는 특수기호는 아래와 같다.
print(string.punctuation)
# Returns: !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

정규표현식 regular expression 사용하기

# 정규표현식을 사용하여 특수기호를 제거하는 예제
import re
input_string = '!hi. wh?at is the weat[h]er lik?e. !@##$%%^^&*)_+{}|?"'
output_string = re.sub(r'[^\w\s]', '', input_string)
print(output_string)
# Returns: hi what is the weather like

# 좀더 빨리 하려면 정규표현식을 컴파일하는 것이 좋다.
pattern_punctuation = re.compile(r'[^\w\s]')
output_string = pattern_punctuation.sub('', input_string)
print(output_string)

string.replace() 사용하기

# string.replace() 함수를 사용하여 특수기호를 제거하는 예제
import string
input_string = '!hi. wh?at is the weat[h]er lik?e. !@##$%%^^&*)_+{}|?"'
for character in string.punctuation:
    input_string = input_string.replace(character, '')
print(input_string)
# Returns: hi what is the weather like

소스 파일

github에 노트북으로도 올려놨습니다.

https://github.com/euriion/python-exams/blob/main/remove-punctuations.ipynb