자연어 처리 기법과 활용

SF영화를 보면 인공지능이 사람의 말을 모두 알아듣고 이해하고 행동하는 것을 쉽게 볼 수 있다. 심지어 몇몇 영화에서는 보통 사람보다 더 인간적이고 철학적인 생각을 하는 인공지능 로봇들도 등장한다.

“정말 영화에서 나온 것처럼 인공지능이 사람의 언어와 감정을 모두 이해할 수 있을까? “

인간의 언어는 수천년의 역사를 가지고 다양하게 분화되고 발전해 왔다. 그리고 많은 부분 설명하기 힘든 감정이나 암묵적인 지식들로 구성되어 있기 때문에 정성적인 성질이 강하다. 그래서 정량적 데이터가 필요한 현재의 인공지능 학습 방법으로는 이러한 언어의 요소들을 이해시키기 어렵다.

그러면, SF영화에 나오는 것들은 허황된 이야기일 뿐인 것일까?

꼭 그렇지만은 않다. 우리 주변을 잘 살펴보자. 가장 가깝게 AI 스피커를 발견할 수 있을 것이다. 복잡한 대화는 아직 어렵지만 일상적이고 반복적인 간단한 말 들은 아주 잘 이해 한다.

예를들어 잠자리에 들기 전에 다음과 같은 대화를 할 수 있다.

나: (잠자리에 누우며)”OO야! 나 이제 잘래”

AI 스피커: “알람은 몇 시로 할까요?”

나: “내일 아침 7시에 깨워줘”

AI 스피커: “내일 아침 7시로 알람 설정 되었습니다.”

나: “방에 불 꺼줘”

AI 스피커 : (방에 불을 끄며)”수면에 좋은 음악을 틀어 드리겠습니다.”
(약 30분정도 잔잔한 음악 재생 후 종료됨.)

AI 스피커를 사용하기 전에는 이런 것들을 직접 손으로 해야 했다. 휴대폰에 알림을 맞추고, 잠들기 전에 들을 음악을 리스트에 담고 타이머를 맞춘다. 그러고 나서야 방에 불을 끄고 잠자리에 눕는다. 하지만 이젠 바로 잠자리 누워서 말로만 하면 된다.

어떻게 가능한 것일까?

이것을 이해 하기 위해서는 먼저 컴퓨터가 사람의 언어를 이해하기 위해서 시도 되었던 기계번역에 대해서 알아볼 필요가 있다.

초기에는 정해진 규칙에 의해서 번역을 해주는 ‘규칙기반(혹은 중성언어 기반)’으로 언어를 컴퓨터가 다루도록 하였다. 말 그대로 개발자가 정한 규칙에 의해서 원문을 타겟 언어로 번역해 주는 것인데, 앞서 언급한 말로 설명하기 힘든 감정적인 부분과 암묵적인 지식들을 개발자가 모두를 규칙으로 담기에는 한계가 있었다.

이러한 한계를 뛰어 넘기 위해서 나온 것이 ‘말뭉치 기반’으로 번역하는 방식이다. 말뭉치 기반은 크게 ‘예시 기반’‘통계 기반’ 2가지로 나누어 진다.

‘예시 기반’은 원문과 번역문을 저장해 두었다가 똑같은 원문 요청이 왔을때, 이를 활용하는 방식이다. 그리고 ‘통계 기반’은 원문과 번역문의 상관관계 빈도수를 통계화하고 이 수치를 활용하는 방식이다.

말뭉치 기반으로 번역을 하게 되면, 사용을 하면 할 수록 새로운 말뭉치 데이터가 누적 되기 때문에 사람의 개입 없이 컴퓨터가 스스로 언어의 정보를 익히고 처리해준다. 뿐만 아니라 번역 완성도도 점점 높아지게 된다.

“어떻게 말뭉치 기반이라는 것이 앞서 언급한 사람 언어의 정성적인 부분을 상관관계 형태로 통계화 하고 수치로 만든다는 것일까?”

컴퓨터에게 ‘사과’‘배’라는 두 단어를 보여준다면, 단지 유니코드 집합으로 해석 할 뿐 두 단어의 개념적 차이를 이해할 수는 없다.


그러면 유니코드가 아닌 컴퓨터가 이해 할 수 있는 수치를 사용해야 한다. 그것이 바로 벡터로 표현 하는 것이다. 벡터를 만드는 방식 중 하나인 One-Hot 인코딩 방식을 이용하여 간단히 설명해 보면, 다음과 같다.

문장에 의도를 파악하기 위해 필요한 요소가 [왕, 여왕, 남자, 여자]라면 ‘왕’를 표현하는 벡터는 [1, 0, 0, 0]이 되는 것이다. 그리고 ‘여왕’를 표현하는 벡터는 [0, 1, 0, 0]이 된다. 이런 식으로 벡터가 만들어지면 단어들이 실수 공간에 들어오기 때문에 각 단어들의 사이의 유사도를 측정 할 수 있게 된다. 그리고 문장속 단어의 의미 자체가 수치화 되어 있기 때문에 벡터 연산을 통해서 추론을 내릴 수도 있게 된다.

Male – Female

예를 들어 ‘왕(King)’에 대한 벡터에서 ‘남자(Male)’을 빼고 ‘여자(Female)’을 더하면, 벡터 연산을 통해서 ‘여왕(Queen)’이라는 결과를 얻을 수 있게 된다.

벡터 연산

이로써 컴퓨터가 사람의 언어적 정보를 단순히 저장하고 읽는 것만 하는 것이 아니라 의도를 파악할 수 있게 된 것이다.

이러한 처리 방식을 통해서 많은 관심을 받게 된 분야가 대표적으로 챗봇이다. 챗봇이 사람의 말의 의도를 파악할 수 있게 되면서 단순한 작업에 대해서 많은 도움을 줄 수 있게 되었다.

최근 가장 성공적인 사례인 ‘코로나-19’ 챗봇을 이야기 해보자.

그 동안의 민원 처리 방식은 모든 민원 내용을 사람이 일일이 읽어보고 취합한 뒤 공지를 통해서 한번에 알리는 방식이 일반적이었다. 이런 경우 민원을 넣고 처리가 되길 기다려야 한다. 질병관리본부에 들어오는 코로나-19에 대한 민원도 마찬가지 였지만 챗봇 도입을 통해서 이러한 문제점에 대해서 많은 어려움을 해소 할 수 있었다.

민원을 하는 사람이 “자가격리자는 어떻게 해야 할까?”라는 질문이 들어오면, 챗봇은 자연어 처리를 통해 사람의 의도를 파악하고 질병관리본부에서 제공하는 생활 수칙 가이드를 찾아서 제공을 해주는 것이다.

해결하고 싶거나 알고 싶은 정보들을 기다리지 않고 챗봇을 통해 바로 안내를 받게 해주면서 사람들 대부분의 민원을 지연없이 해결하게 된 것이다. 그로인해서 질병관리본부의 코로나-19 챗봇 등록자 수가 70만명을 넘어 섰다.

이 뿐만이 아니다. 사용자 층의 챗봇을 바라보는 시선이 전반적으로 달라졌다. 챗봇 초창기에 사람의 말을 제대로 이해하지 못하여서 좋은 사용자 경험을 전달하지 못했다. 그래서 좋은 기능으로 발전했음에도 불구하고 사람들로부터 외면 받고 있었다. 하지만 코로나-19 챗봇에 대한 좋은 사용자 경험으로 인해서 챗봇이 사용할 만하다는 인식이 생겨 났다.

국내 대표적인 소셜미디어 회사인 카카오와 네이버의 경우 코로나 사태 직전대비 챗봇 사용량이 각각 50%, 18%씩 증가 한 것으로 나타났다.

이는 컴퓨터가 사람의 말을 알아 들을 수 있게 되면서 사용자의 서비스 소비 패러다임이 변하고 있다는 것을 반영한다고 본다. 이러한 패러다임 변화에 대해서 기업들은 많은 관심을 가져야 할 것이다. 챗봇을 통해 기업 비즈니스를 고객들에게 어떻게 서비스 할 것인지 깊게 고민해 볼 필요가 있을 것 같다.

인공지능의 발전과 오픈소스 전략에 대하여

인공지능의 발전은 생각보다 오래 전부터 진행되었다. 1950년에 앨런 튜링이 “계산기계와 지성(Computing machinery and intelligence)”이라는 논문을 통해 처음으로 인공지능에 대한 개념의 토대를 마련했다. 이후, 1956년에 “다트머스 회의(Dartmouth Conference)”로 알려진 모임에서 처음으로 인공지능(AI: Artificial intelligence)이라는 용어를 사용하였고 튜링이 제안한 “생각하는 기계”를 구체화하기 위한 것들을 논의 하기 시작했다.

인공지능의 70년 역사

그리고 오늘날까지 눈에 띄지 않게 성장과 쇠퇴를 반복하다 2016년 인공지능 바둑 프로그램인 알파고가 등장하면서 그 동안 인공지능 기술 발전이 상당히 진행되었다는 것을 보여주었다. 사실, 이때만해도 알파고는 인공지능의 분야중 인지능력에 대한 가능성을 보여줬을뿐 직접적으로 무언가를 제시한 것은 아니었으며 알파고와 같은 인공지능 기술을 가지기 위해서 얼마나 많은 비용과 인력이 투자되었을지 파악하기도 어려운 것으로 느껴졌다.

하지만 알파고의 등장 이후 4년이 지난 지금은 어떤 산업군이든 인공지능 접목을 당연하게 생각하고 있다. 최근의 인공지능 기술들은 간단한 서비스 형태도 제공되어 어려운 기술적인 이해가 없어도 누구나 데이터만 있으면 이미 만들어진 인공지능 모델에 적용하여 학습시켜 볼 수 있으며 심지어 그 결과가 좋다면 제품에 바로 적용도 할 수 있다.

“도대체 최근 4년동안 무슨 일이 있었던 것일까?”

인공지능 기술 분야에서 글로벌 선도기업인 구글의 사례를 중심으로 살펴보자.

  • 2015년 구글의 인공지능 플랫폼 텐서플로우(Tensor Flow)를 무료로 공개 하였다.
  • 2016년 알파고로 유명한 구글 딥마인드에서 인공지능 기술 테스트 플랫폼인 딥마인드랩(DeepMind Lab)을 외부에 무료 공개 하였다.
  • 2017년 10월부터 고사양의 하드웨어(GPU, TPU)환경을 제공하는 인공지능 개발 환경 서비스 코랩(CoLab)을 무료로 사용할 수 있도록 하고 있다.

“인공지능 알고리즘을 구현하는 플랫폼 개발에는 대규모 자본이 투입되었으며, 고도의 기술력이 집약되어 있을 텐데 구글은 왜 무료로 외부에 공개했을까?”

인공지능 기술은 전통적인 ICT 산업부문을 넘어 전통산업을 포함하는 매우 광범위한 영역으로 응용된다. 그리고 응용대상 영역에서 얻어지는 데이터 및 사용자 피드백 등 케이스 의존적인 성격이 강하다. 이러한 이유로 인공지능의 기본 알고리즘은 금융, 의료, 제조, 교육 등 모든 분야에 응용가능하지만 각각의 응용대상 분야 자체에 대한 노하우가 없으면 수많은 알고리즘들은 실제로 구현 될 수 없다.

구글과 같은 글로벌 선도기업도 혼자만의 힘으로는 인공지능 기술의 보급 확산을 지금과 같은 수준으로 올릴 순 없었다. 오픈 소스 생태계를 활용하여 다양한 분야에서 인공지능 기술을 응용하는 주체들이 모두 협력했기 때문에 가능했던 것이다.

이러한 이유로, 구글뿐만 아니라 MS, IBM, Facebook, Open AI 등등 인공지능 기술을 이끄는 대부분의 글로벌 기업들이 오픈소스 생태계에 투자를 하고 있다. 그리고 이런 투자 덕분에 인공지능에 대한 보급과 화산이 그 전과 달리 매우 빠르게 진행 될 수 있었다.

“그러면 여기서 궁금한 것이 생긴다. 거대 글로벌 기업의 기술에 참여를 하여 발전을 도와주고 있는데, 정작 참여하고 있는 기업이나 개발자들 에게는 무엇이 남는 것일까?”

인공지능 연구 환경의 진입장벽이 매우 낮아졌다.

인공지능 기술은 쉽게 생각하면 주어진 데이터들을 다양한 차원으로 비교 탐색 및 분석하여 의미 있는 패턴을 찾아주는 것이다. 여기에는 여러 기술들이 요구되는데 크게 보면 2가지로 구분 할 수 있다. 분석을 할 데이터를 인공지능이 학습할 수 있도록 데이터를 탐색하고 정제하는 전처리 기술과 인공지능 모델을 실제로 연구하고 구현 할 플랫폼이다.

그 동안, 이런 인공지능 기술은 바로 상용화가 불확실한 경우가 많아서 자본이 부족한 기업은 투자가 어려웠고, 하더라도 리스크를 줄이기 위해 대학원이나 전문 연구기관 연구과제를 빌려와 진행하는 경우가 많았다. 이런 경우 굉장히 학문적으로 접근하기 때문에 현실적으로 매출에 좋은 영향을 주지 못 했다.

그러나 글로벌 기업이 엄청난 기술과 자본을 들여 만든 인공지능 연구/개발 플랫폼 기술을 모두 오픈소스로 공개 함으로써 인공지능 기술을 도입하려는 기업은 초기 기술 개발 비용에 대한 부담없이 오픈소스를 통해서 글로벌 기업의 기술력을 제공 받아 연구개발을 시작할 수 있게 된 것이다.

데이터 분석에 사용되는 알고리즘 기법들의 표준화이다.

오픈소스 프로젝트를 사용하는 참가 기업들이 많아지면 각 산업 분야의 다양한 정보와 최신 트랜드에 대한 문제점의 해결책을 공유하여 운영되기 때문에 유연하고 호환성이 높은 표준 모듈/라이브러리들이 개발 될 수 있다.

데이터 분석에 사용되는 알고리즘들은 크게 Classification(분류), Clustering(군집), Regression(회귀), Forecast(예측), Dimensional reduction(차원 축소) 등의 유형로 나누어진다. 그리고 각 유형에는 다양한 분석/학습 알고리즘 기법들로 세분화 된다. 이러한 것 때문에 인공지능 구현을 위해서는 알고리즘에 대한 많은 지식이 있어야 했고 최소 대학원 석사 이상이어야 인공지능 분야에서 일을 할 수 있었다.

Select Algorithm

하지만 최근 몇년사이에 오픈소스 생태계에 참여한 기업과 개발자들의 노력 덕분에 이러한 어려운 내용들이 정형화 되고 패키지/모듈로 간단히 제공되면서 이론에 대한 이해만 있으면 쉽게 가져다가 원하는 인공지능 모델을 구현해 낼 수 있게 되었다.

이러한 오픈소스 생태계의 이점들로 인해서 자원이 부족한 기업들도 잘 만들어진 글로벌 기업의 기술을 적은 비용으로 가져다가 사용할 수 있는 기회를 얻게 된 것이다.

국내 기업들은 오픈소스를 하면 기업의 기술이나 노하우가 노출된다고 생각하여 잘 시도 하지 않는다. 하지만 다르게 생각해보면 정말 잘 만든 기술도 많은 사람들로부터 활용되지 않으면 피드백이 적을 수 밖에 없고 빠르게 변화하는 IT 트랜드를 놓치기 쉽다. 많은 글로벌 IT 선도 기업들이 이러한 개념을 잘 이해하고 오픈소스 생태계를 전략적으로 잘 활용하고 있다. 국내 기업과 연구자들도 오픈소스 생태계를 적극 참여하여 미래 글로벌 IT 시장을 선도해 나가는 기회로 삼을 수 있기록 하는 것이 중요할 것 같다.

Python redact sensitive information in text

text 데이터를 처리하다 보면 그 안에 개인정보(phone, email 등) 등의 민감정보가 포함 되어 있는 경우가 있다. 이것들은 정규식(regular expression)을 사용하여 알아 볼 수 없도록 편집 (masking) 할 수 있다.

import re

text = '안녕하세요. 문의드릴 것이 있어서 연락드렸습니다. 제 연락처는 010-1234-1234 / thenewth@gmail.com 입니다. 연락가능 하실때 연락 부탁 드립니다. 감사합니다.'

phoneRegular = "\d{2,3}-\d{3,4}-\d{4}"
emailReqular = "(\w+\.)*\w+@(\w+\.)+[A-Za-z]+"

phonePattern = re.compile(phoneRegular)
emailPattern = re.compile(emailReqular)

#Masking 문자 대신 공백을 사용하면 민감정보 표시 자체를 삭제 할 수 있다.
redactedPhoneText = re.sub(phonePattern, "***-****-****", text)
redactedEmailText = re.sub(emailPattern , "****@****.***", text)

#전화번호 정보 masking 결과 확인
print(redactedPhoneText)

#이메일 정보 masking 결과 확인
print(redactedEmailText)

출력한 결과를 확인해 보면 정규식에 해당하는 민감정보가 편집(Masking)된 것을 확인 할 수 있다.

인공지능 프로그램 이해와 비즈니스 적용에 관하여

최근 인공지능이 실제 비즈니스에 적용되면서 많은 산업의 전반에 영향을 미치고 있다.
Statista에 따르면 세계적으로 인공지능에 대한 시장 전망이 2018년 약 95억달러에서 연 평균 43%씩 성장하여 2025년에는 1,186억달러 규모로 이를 것이라고 한다.

Revenues from the artificial intelligence (AI) software market worldwide from 2018 to 2025

AI를 포함한 글로벌 소프트웨어 서비스 전체 시장이 2018년부터 2025년까지 매년 10% 성장하여 3,229억 달러 규모가 될 것이라는 것을 생각해 보면 엄청난 투자와 성장이 이루어지고있다는 것을 알 수 있다.

이런 이유로 사업을 하는 사람이라면 누구나 기업 비즈니스에 어떻게든 하루 빨리 인공지능을 도입하고 싶을 것이다.

“그런데 정말 인공지능을 도입하면 비즈니스의 매출이 성공적으로 올라갈까?”
“기존의 소프트웨어 프로그램들로는 할 수 없는 것인가?”

이것에 대해 이야기하기 전에 먼저 기존의 소프트웨어 프로그램들이 어떠했는지 생각해 볼 필요가 있다.

그 동안의 프로그램들은 연속적이지 않고 구분되어진 이산 논리를 가지고 나오는 경우 수들을 공식화하여 만든 것들이다.

우리의 일상생활을 살펴 보자.

아침에 일어나야 하기 때문에 매일 아침 7시가 되면 알람이 울리도록 알람을 맞춘다. 시간은 사실 연속적이지만 그 시간을 시, 분, 초로 이산화 시켜 표기하고 아침 7시라는 경우가 되면 알림이 울리도록 되어 있는 것이다.

이것 저것 분주히 준비한 다음 집을 나서면 엘리베이터를 마주하게 된다. 엘리베이터의 한쪽 벽에 표시된 층수를 누르면 엘리베이터는 해당 층수로 이동한다. 공간 또한 마찬가지로 연속적이지만 층이라는 규격화된 높이로 이산화 시켜 표시하고 눌려진 버튼에 입력된 층의 위치로 이동하는 것이다.

예시에서 알 수 있듯이 이산 논리는 확실하게 구분된다. 어떤 경우에 해당되는지 그렇지 않은 것인지 확실한 선을 긋는 것이다. 이 선들이 조건(Rule)이 되고 조건들을 조합하여 공식을 만든 것이 프로그램이 되는 것이다.

일상에서 쉽게 볼 수 있는 간단한 프로그램들을 예시로 들었지만 사업에 사용되는 프로그램들도 마찬가지다. 단지, 관련 분야의 도메인 전문가가 문제를 해결하기 위해서 좀 더 세분화된 조건(Rule)들을 도출해 냈을 뿐이다.

예를 들어, 어느 과수원에서는 사과를 중량으로만 선별 하고 중량을 나누는 작업을 자동화 시스템으로 개발 한다고 가정해 보자. 먼저, 각 사과들의 중량을 측정할 것이다. 그리고 측정된 중량들을 이산화 된 등급의 조건으로 만들어 준다. 가령 200~350g이면 가정용, 351~400g이면 선물용 , 401g 이상은 제수용으로 등급을 만들어 주면 이 시스템을 통해서 사과들은 3개의 등급으로 구분되게 된다.

이 시스템에서는 사과의 무게가 350g이라면 가정용으로 분류할 것이다. 그리고 351g은 선물용으로 분류가 될 것이다. 그러면 1g 차이로 가정용과 선물용으로 분류 되는데 이 것이 합리적인 것일까? 350g이 351g보다 실제로 선물용으로 가치가 더 있다면?

실제로 사과를 제대로 선별하기 위해서는 중량 외에 빛깔, 형상, 과육 등등 기준들이 더 많이 있어야 한다. 때문에 사과를 좀 더 잘 선별하기 위해서는 ‘사과’라는 여러 속성을 갖는 객체를 만들고 각 속성에 값을 측정하여 입력하고 특정 조건이 만족할 경우 분류 되게 해야 한다.

그럼 다시 질문해 보자. 전 보다 조건이 많아 졌으니 이제는 합리적으로 나눌 수 있는 것일까?

글쎄다. 어디까지나 이산 논리에 대한 조건들이 세분화 된 것일 뿐이지 경계가 불분명한 예외사항은 언제나 발생 하고, 발생한 예외는 결국 사람이 처리해야 한다. 이것이 인공지능 이전의 프로그램 방식들인 것이다.

“그렇다면, 인공지능이 도입된 프로그램 방식은 무엇 일까?”

1(참)과 0(거짓)으로만 나누는 이산적인 방식에서 0~1 사이의 모든 실수로 확장된 것을 의미한다. 다시 말하면 어떤 등급에 속할 가능성으로 나타내는 것이다.

예를 들어, 사과의 중량은 350g이지만 다른 조건들로 인해 이 사과가 선물용으로 적합하다는 가능성이 0.86으로 정의 할 수 있다면 이 사과는 가정용이 아니라 선물용이 되는 것이다. 이처럼 경계선이 명확하지 않은 대상을 다룰 수 있는 것이 인공지능이 도입된 프로그램 방식이다.

이렇게 간단하게 설명하면 신기하게 들릴 수도 있지만 이것은 그 동안 잘 처리하지 못한 불분명한 예외사항을 기계가 효율적으로 나누기 위한 추론 기법일 뿐이다.

사람은 350~351g의 애매한 중량의 사과라면 손으로 만져보고 눈으로 보고 향을 맡아본 뒤 직관적으로 분류했을 것이다. 이렇게 사람이 분류 하던 데이터들을 기계에게 학습시키면, 기계는 데이터에서 패턴을 찾고 그 패턴을 추론로직으로 사용하는 것이다.

결국, 완전한 인공지능이라기 보단 사람의 직관을 흉내낼 수 있어서 사람의 인지적인 부분을 도와 줄 수 있는 형태인 것이다.

그런데 왜 이렇게 사람들이 관심을 갖고 열광하는 것일까?

그 이유는 최근 몇 년 사이 그 흉내내는 수준이 단순 흉내 이상의 가치를 만들고 시작했기 때문이다. 가장 가깝게는 스마트 폰으로 사진을 찍으면 사진을 자동으로 보정하고 분류해준다. 공장에서는 제품의 상태를 사람 보다 더 잘 예측하고, 병원에서는 환자의 영상데이터를 의사보다 더 정확히 분석하고 있다.

인지능력으로는 이미 인간의 수준을 넘어선 것있다.

이런 기능이 물리적인 제약 없이 24시간 365일 쉬지 않고 동작 할 수 있기 때문에 완전한 인공지능이 아님에도 불구하고 비즈니스 매출에 성공적인 상승 가져다 주는 것이다.

“그렇다면, 어떻게 하면 인공지능을 비즈니스에 적용 할 수 있을까?”

인공지능을 비즈니스에 적용하기 위해서는 많은 것들이 필요하지만 꼭 필요한 3가지가 있다.

첫째로 비즈니스에서 해결하고자 하는 문제점을 정확히 알아야 한다.
위에서 설명했듯이 최근의 인공지능은 완전한 인공지능이 아니기 때문에 그저 ‘도입하면 무엇이든 되겠지’라고 생각 하는 순간 실패사례로 남게 된다. 문제점을 잘 파악하기 위해서 비즈니스에 대한 프로세스를 잘 정립하고 프로세스 간의 절차와 관계를 정의하여 해결하려고 하는 문제점을 정확히 이해하고 도출해야 한다.

두번째로, 인공지능이 학습 가능한 데이터로 기존 데이터를 가공하고 수집해야 한다.
인공지능에 대한 환상으로 인해 생긴 오해 중 하나인데, 무작정 데이터가 있다고 해서 바로 인공지능에게 데이터를 학습시킬 수 있는 것이 아니다. 데이터에는 생각지도 못한 많은 노이즈 정보들이 있으며, 현재의 인공지능은 이런 정보까지 분별하지 못 한다. 특히, 데이터가 비정형 데이터라면 전처리 기술을 통해서 정형화 혹은 반정형화 작업을 해주어야 학습에 사용할 수 있다. 때문에 인공지능이 학습 가능한 형태로 데이터를 새롭게 만들어 가야 한다.

마지막으로 오픈소스 소프트웨어를 잘 활용해야 한다.
일반 기업에서 인공지능을 처음부터 개발한다는 것은 불가능에 가깝고, 투자가 가능하더라도 너무 뒤쳐지는 발상이다. 이미 잘 개발된 인공지능에 관련한 오픈소스들이 너무 많다. 국내 최고 기술 회사인 삼성, LG는 물론이고 글로벌 선두 IT 기업인 AMG(Amazon, MS, Google)도 인공지능 만큼은 오픈소스를 활용한다.
우리는 거인의 어깨에 올라탈 필요가 있다. 이미 글로벌 기업들이 자신들의 비즈니스로 검증한 오픈소스를 이용하는 것이 비용을 아끼면서 빠르게 성장할 수 있는 발판이 되는 것이다. 오픈소스에 기존 비즈니스를 잘 녹여낼 수 있다면 손쉽게 인공지능 서비스를 제공할 수 있음과 동시에 글로벌 기업의 인공지능 기술을 같이 공유하게 되는 것이다.

그 동안 공상과학 영화에서나 나오던 인공지능에 대한 것들이 점점 현실로 다가 오고 있다. 아직 사회적 부작용도 많고 완성도에서도 완전한 인공지능은 아니지만 인공지능 시장의 성장와 규제 대응 속도를 가만해 보면 향후 5~10년 안에는 우리 생활 속에 정착할 것으로 보인다. 그 때에 앞서가는 비즈니스를 하고 있으려면, 기존 비즈니스를 인공지능을 통해서 어떤 새로운 가치를 만들어 낼 것인가를 고민하는 것이 중요할 것 같다.

3D Hologram Projector 만들기

주말 내내 집에만 있다보니 심심하던 찰나에 홀로랜즈 관련된 유투브 영상을 보게 되었다. 보다보니 집에 남는 아크릴도 있겠다 한번 만들어 봐야 겠다는 생각이 들었다.

일단, 3D Hologram Projector 도면이 필요한데, 구글 검색을 통해서 쉽게 얻을 수 있다.

보통 보면 대부분의 도면이 위와 같은데… 크기가 좀… 작은 것 같다.
아마도 스마트폰 위에 올려놓는 형태이다 보니 일반적인 스마트폰 화면 크기인 5~6 inch를 기준으로 그려진 도면인 것 같다.

디스플레이 관련 제품은 거거익선이기 때문에 좀 더 크고 좋은 영상을 보기위해 여기서는 좀 더 큰 테블릿용으로 만들어 보겠다. 테블릿 화면 크기는 대략 9~10 inch 정도로 스마트 폰보다는 대략 2배 정도 크다. 따라서 도면도 딱 2배 씩 늘려 준다.

수치를 2배씩 늘려 도면을 새로 그려준 뒤에, 새로 그린 도면을 오려내어 아래 그림과 같이 아크릴 위에 붙여준다.

이제 도면에 따라 아크릴를 재단해 준다.

아크릴에 붙였던 도면을 제거하고 아래 그림과 같이 대각선 모서리를 붙여준다.
(도면을 제거하고 나서 아크릴표면을 딱아줘야 나중에 최대한 선명한 영상을 볼 수 있다.)

뒤집어서 모서리 안쪽에 목공풀을 칠해서 고정 되도록 한다.
(글루건이나 좀더 강한 접착제를 써도 좋지만, 목공풀만써도 충분하다.)

목공풀이 마르면 다 완성된 것이다. 겉에 붙였던 테입을 뜯어낸 후에 사용하면 된다.

유투브에 홀로그램 영상을 검색하면 많은 영상들이 나온다. 적당한 것을 선택하여 홀로그램 영상을 감상하면 된다.

리자몽 홀로그램 영상

WSL(Windows Subsystem for Linux) Ubuntu Config user password

WSL(Windows Subsystem for Linux)을 사용하다 보면 user password를 잃어 버리는 경우가 있다. WSL이 아닌 경우 여러가지 복원 절차를 통해야 하지만 WSL인 경우 MS(Microsoft)에서 개발한 리눅스 호환 커털 인터페이스를 제공하기 때문에 간단히 user password를 초기화 할 수 있다.

먼저, 설치된 WSL 버전을 확인 해야 한다.
명령 실행 창에서 ‘CMD’를 실행하고 아래 명령어를 입력하면, 설치된 WSL 버전 정보를 확인 할 수 있다. (여기서는 Ubuntu 1804 Linux를 기준으로 한다.)

c:\> wslconfig /list /all

Windows Subsystem for Linux Distributions:
Ubuntu-18.04 (Default)

설치된 WSL은 Ubuntu-18.04이고, 실행 명령어는 ‘Ubuntu1804’가 된다.
(만약, Ubuntu(Default)로 나왔다면 실행 명령어는 ‘Ubuntu’가 된다.)

위에서 확인한 실행 명령어를 가지고 CMD창에서 다음과 같이 Ubuntu 기본 사용자를 root(관리자)로 변경해 준다.

c:\> Ubuntu1804 config --default-user root

이제, WSL Ubuntu를 실행하면 기본사용자가 root로 되어 있기 때문에 root로 로그인 된다.
바로, 대상 user의 password를 변경해 주고 로그아웃 한다.

$ passwd user

Enter new UNIX password: (type password)
Retype new UNIX password: (type password)

$ exit

다시 CMD창으로 돌아와 Ubuntu 기본 사용자를 기존 user로 변경해 준다.

c:\> Ubuntu1804 config --default-user user

이제, 다시 WSL Ubuntu를 실행하여 확인해 보면 password가 변경된 것을 확인 할 수 있다.

About Raspbian

Raspbian은 하드웨어 제품인 RPi(Raspberry Pi)와 Linux계열의 OS(Operating System)인 Debian의 합성어로 Raspberry Pi Foundation이 개발한 RPi 전용 OS다.

RPi는 Raspberry Pi Foundation에서 학교와 개발도상국에서 기초 컴퓨터 과학의 교육을 증진시키기 위해 개발한 신용카드 크기의 싱글 보드 컴퓨터이다.
크기가 작고 전력 소비가 5V-2A로 동작하도록 설계되어 있기 때문에 Raspbian은 저전력 ARM CPU에 상당히 최적화되 도록 만들어 졌다.

Raspberry Pi 4 board

Raspbian을 사용하기 위해서는 앞서 설명한 RPi라는 하드웨어가 필요하다.

(Desktop 버전을 사용하여 live Disc를 생성하거나, 가상머신을 이용하여 PC에 설치 할 수도 있다.)

RPi Model B+RPi 2 Model BRPi 3 Model BRPi 4 Model B
SoCBCM2835BCM2836BCM2837BCM2711
CPUARM11 @700MHzQuad Cortex
A7@900MHz
Quad Cortex
A53@1.2Ghz
Quad Cortex
A72@1.5Ghz
Instruction SetARMv6ARMv7-AARMv8-AARMv8-A
GPU250MHz VideoCore IV250MHz VideoCore IV400MHz VideoCore IV500MHz VideoCore VI
RAM512MB SDRAM1GB SDRAM1GB SDRAM1, 2 or 4 GB
WirelessNoneNone802.11n/Bluetooth 4.0802.11n/Bluetooth 5.0
VideoHDMI/CompositeHDMI/CompositeHDMI/Composite2x micro-HDMI/Composite
AudioHDMI/HeadphoneHDMI/HeadphoneHDMI/HeadphoneHDMI/Headphone
RPi는 그래픽 성능을 띄어나지만 매우 저렴한 가격(약 25~35$)에 구입할 수 있다.

RPi는 OSHW(Open Source Hardware)라서 하드웨어 스팩은 물론이고 전용 OS인 Raspbian역시 오픈소스로 공개 되어 있기 때문에 하드웨어만 구입하면 나머지 사용하는 것에 대해서는 100% 무료로 사용할 수 있다.

RPi 전용 OS인 Rapbian은 Debian을 기반으로 만들어 졌기 때문에 대부분의 주요 명령어는 Debian과 거의 동일하게 사용하는 하다.

  • APT(Advanced Package Tool)을 통한 소프트웨어 설치 / 업데이트
  • dpkg(Debian package) 형식의 패키지 소프트웨어 사용

PIXEL(Pi Improved Xwindows Environment, Lightweight)이라는 GUI 기능 제공을 한다. 이를 통해서 데스크탑 환경을 사용할 수 있다. 특히, 데스크탑 환경 중 App Store와 동일한 개념의 PI Store 제공하여 호환되는 Package들을 쉽게 제공 받을 수 있도록 되어 있다.

Raspbian Pi Store

오픈소스 싱글 보드계열 중에서 저렴하고 파워풀한 기능을 제공하고 있어서 가성비가 좋은 제품으로 많은 개발자들에게 사랑 받고 있다.

전 세계적으로 많은 개발자들이 사용하고 있다 보니 많은 관련 개발 커뮤니티들도 분야별로 자연스럽게 형성되고 있다. 초급자라면 관심 있는 분야의 커뮤니티에서 많은 정보(Tip)들을 제공 받을 수 있다. (오픈소스의 장점이 잘 살려진 것 같다.)

커뮤니티 링크: https://www.raspberrypi.org/community/

Python connect to MS-SQL with pymssql

Python에서 MS-SQL을 사용하려면 일단, MS-SQL DB를 지원하는 Python 모듈을 설치해야 한다. MS-SQL에 대한 모듈은 크게 pyodbc와 pymssql 두가지가 있는데 여기서는 pymssql을 사용 할 것이다.

(DB에 관련된 모듈은 무수히 많은 것들이 있다. 참고: https://www.lfd.uci.edu/~gohlke/pythonlibs/)

다음과 같이 pymssql을 설치한다.

(설치 방법은 Ubuntu Linux대상 이다. 다른 OS를 사용하는 경우는 여기를 참고하면 된다.)

$ apt-get --assume-yes update
$ apt-get --assume-yes install freetds-dev freetds-bin
$ pip install pymssql

이제 Python에서 설치한 모듈을 가지고 MS-SQL에 접근해 보자.

import json
import pymssql 

#[Tip]json 문자열을 환경변수 파일로 저장하여 사용한다면 서버정보를 노출 하지 않을 수 있다.
json_string = 
'{
    "host":"Server Address",
    "port":1433,
    "user":"User ID@Server Name",
    "password":"P@ssW0rd",
    "database":"Database Name"
}'
json_data = json.load(json_string)

#pymssql 모듈을 이용하여 Connection 생성을 한다.
conn = pymssql.connect(host=json_data['host'], port=json_data['port'], user=json_data['user'], password=json_data['password'], database=json_data['database'])

여기까지 하면 MS-SQL서버에 접근(Connection 완료) 한 것이다.
다음으로 Select query문을 실행하여 데이터를 가져와 보자.

#Connection으로부터 cursor 생성
cursor = conn.cursor() 

#Select Query 실행
cursor.execute('select * from [Target Table Name]') 

#결과 데이터를 데이터프레임에 저장
df = pd.DataFrame(cursor.fetchall())

#실행이 끝나면 항상 연결 객체를 닫아 주어야 한다.
conn.close() 

잘 실행 되었다면 결과를 담은 데이터프레임을 출력 해보자.

#결과 출력
print(df)

실행한 Select Query한 결과를 확인 할 수 있을 것이다.

MS-SQL Table Copy

학습 데이터를 준비 하려다 보면 기존의 데이터를 변형해야 될 때가 있다. 이때 원본 테이블을 가지고 바로 작업을 하게 되면 데이터가 손실 될 수 있다.
백업 데이터가 있다고 하면 그나마 다행이지만 보통 학습에 사용되는 데이터는 양이 많기 때문에 100% 복구하려면 시간이 걸린다.
이런 점들 때문에 될 수 있으면 테이블(혹은 데이터)을 복사해서 사용하면 좋다.

  1. 새 테이블을 생성 하면서 데이터 복사
select * into [New Table Name] from [Source Data]
  1. 테이블 구조만 복사
select * into [New Table Name] from [Source Table Name] where 1=2
  1. 기존 테이블에 데이터만 복사
insert into [Destination Table Name] select * from [Source Table Name]