편집거리 개념 편집거리 알고리즘(Levenshtein Distance)는 두 개의 문자열 간의 편집거리를 측정하는 알고리즘 입니다. 편집 거리는 문자열을 다른 문자열로 변경하는데 필요한 최소한의 삽입, 삭제 및 대체 작업 수를 나타냅니다. 편집거리 알고리즘은 다양한 응용 분야에서 사용될 수 있는데 맞춤법 검사, 음성 인식, 텍스트 유사성 측정 등에서 사용됩니다. 알고리즘 설명 위 예시는 편집거리를 계산하는 것을 보여주는 예시로 비(rain)와 빛나다(shine)로 설명을 합니다. 우선 rain을 shine으로 변환하려면 r을 s로 바꾸고, a를 h로 바꾸고 e를 삽입합니다. 고로 이 편집거리는 3입니다. 기차(rain)와 빛나다(shine)에 대해서 작업을 하게 된다면, shine앞에 t를 붙이고, s를..
보통 문자열을 인식하는 기능등은 많은 라이브러리나 정규표현식으로 쉽게 가져올 수 있지만 한자만 가지고 오는 방법은 별도의 작업을 수행해야 한다. 사실 한자라는 것이 무궁무진한 글자이고 한글과 다르게 무한대로 확장이 가능한 글자라서 컴퓨터 영역에서는 표현하기가 상당히 까다로운데 이럴땐 유니코드를 이용해서 추출하거나 인식할 수 있다. Java 소스 코드 public static void main( String[] args ) { String text = "가불有 大韓民國"; for(int i = 0; i = '\u2E80' && charAt = '\u3400' && charAt = '..
바로 이전 포스팅에서는 형태소 분석기별 가장 중요한 명사를 추출하는 성능(속도 측면)을 비교해 봤습니다. 품사 태깅(pos-tagging)은 우리가 흔히 형태소 분석기라는 말과 동의어로 생각하는 기능으로 명사만 추출하는게 아니라 문장의 모든 품사를 분석하게 됩니다. 명사만 추출하는 것은 사실 어렵지 않습니다. 단어안에 명사를 그냥 찾으면 그만이니까요. 하지만 pos-tagging은 한국어 문법을 제대로 이해해야 하고, 분석 방법과 퀄리티에 따라 속도에 큰 영향을 주게 됩니다. 즉, 명사만 추출하는 것으로 속도가 오래 걸리지 않지만 대다수 pos-tagging 작업으로 인해서 형태소 분석기가 오래 걸리게 되는 것이죠. 예를 들어, 자모 단위로 분리해서 분석을 한다면 상당히 큰 cpu 자원을 사용할 수도 있..
최근 konlpy 사이트에 적혀 있는 형태소 분석기의 분석 속도와 실제로 느꼈던 kolnpy의 개별 형태소 분석기의 성능이 맞지 않는 것 같아서 비교적 용량이 많은 문장을 기반으로 형태소 분석기의 성능을 체크해보려고 합니다. 실험에 사용된 형태소 분석기는 총 3종인 코모란(Komoran), 꼬꼬마(Kkma), Okt(Open korean text)이며 꼬꼬마는 분석속도가 나쁜 것이 체감이 날 정도로 좋지 않지만 코모란과 okt의 분석 속도도 예상 밖인것 같아서 제대로 시간을 체크하고자 하였습니다. 공통코드 import urllib.request import time from konlpy.tag import Okt from konlpy.tag import Komoran from konlpy.tag impo..
현재 가장 많이 사용되는 딥러닝(Deep Learning) 기반의 분산 표현(distributed representation) 워드임베딩(Word Embedding, 자연어를 기계가 이해할 수 있는 숫자 벡터 값으로 변경하는 기술)은 Word2vec이라 할 수 있다. Word2Vec 임베딩 기술은 단순하지만 성능이 우수해서 많이 사용되는데 치명적인 문제점도 존재한다. 바로 주어지는 단어(Corpus, 말뭉치)를 기반으로 학습을 진행하며 존재하지 않던 단어를 던졌을 때 에러가 발생하는 등 만능적인 모습을 보여주지 않는다. 당연히 학습 안된 단어는 나오지 말아야 되는거 아니냐? 할 수 있겠지만 이 문제를 해결하기 위한 방식이 연구되고 있었고, 페이스북(Facebook)에서 이를 보완하는 언어 모델이 등장한다..
TF-IDF는 자연어처리에서 가장 기본적이고 가장 많이 활용하는 기술이라 할 수 있으며 그만큼 강력하며 쉽다. TF-IDF는 Term-Frequency와 Inverse Document Frequency의 약어로 되어 있으며, 문서에서 자주 등장하는 문서별 중요 단어에서 다른 문서에서 자주 등장하는 패널티를 빼는 역빈도를 구하여 최종 스코어를 구하게 된다. 이를 예로 들면, 편의점마다 많이 팔리는 물건을 조사하고 싶은데 단순히 매출로만 판단하게 되면 모든 편의점마다 담배가 1위로 올라설 것이다. 이렇게 다수가 나오는 패널티를 빼게 되면 결국 편의점마다 독특하게 등장하는 물건들이 있을 것이고, 이를 토대로 선호 물품과 해당 편의점 주변의 나이대 등을 간접적으로 알수도 있을 것이다. TF-IDF로 가장 많이 ..
Word2Vec로 구현할 수 있는 서비스는 무궁무진하다. 분류, 연관키워드와 같은 직접적인 서비스를 구현할 수도 있으며 최종 서비스를 위한 전처리 과정에서도 활용될 수 있다. 참고로 이 포스팅은 이전에 작성한 Word2Vec #2, 기본적인 모델 구현(생성)하기에서 만든 모델을 기반으로 설명이 이어진다. Word2Vec Source Code from gensim.models import Word2Vec model_okt = Word2Vec.load('word2vec_okt.model') 코모란 버전과 Okt 버전 모두 모델을 만들었지만, 이번 포스팅에서는 Okt 버전만 사용해보도록 한다. # 단어 벡터 확인 print('영웅 : ', model_okt.wv['영웅']) 벡터가 잘 뽑혔는지 확인하기 위해서..
우선 워드투벡터(Word2Vec)를 구현하기에 앞서 이 포스팅에 사용된 예제는 네이버 영화 리뷰 데이터이다. 네이버 영화 리뷰 데이터는 직접 github에 들어가서 데이터를 다운로드 받아서 특정 폴더에 저장한 후 사용하는 방법과 파이썬을 실행 하는것과 동시에 다운로드를 받는 2가지 방법이 존재한다. 여기서는 github에 있는 데이터를 파이썬을 실행할 때 접근하여 가져오는 방식을 사용하도록 한다. 네이버 영화 리뷰 데이터 e9t/nsmc Naver sentiment movie corpus. Contribute to e9t/nsmc development by creating an account on GitHub. github.com 위 링크에 들어가면 네이버 영화 리뷰에 대한 자세한 설명이 있으며, 샘플로..
Word2Vec를 이해하기 전에 우선 희소 표현과 분산 표현에 대한 이해를 하지 못했다면 아래의 포스팅을 보고 표현들의 개념을 익히길 권장한다. 희소 표현과 분산 표현, 차원의 저주 희소 표현과 분산 표현, 차원의 저주 희소 표현(Sparse Representation) 희소 표현(Sparse Representation)이란 데이터가 희소(부족)한 형태를 띄는 것을 말한다. 즉 대부분의 값이 0인 경우를 뜻하며, 원핫 인코딩(One Hot Encoding)이 대표적인 예.. needjarvis.tistory.com 워드투벡 혹은 워드투벡터는 분산 표현을 만들기 위해서 가장 많이 활용하는 강력하고 범용적인 단어 임베딩(Word Embedding) 모델이다. 구글(Google)에서 2013년에 발표했으며, ..
Okt(Open Korean Text)는 트위터에서 만든 오픈소스 한국어 처리기인 twitter-korean-text를 이어받아 만들고 있는 프로젝트이다. 기존 형태소 분석기인 트위터 형태소 처리기의 깃헙(github)을 들어가면 github.com/twitter/twitter-korean-text twitter/twitter-korean-text Korean tokenizer. Contribute to twitter/twitter-korean-text development by creating an account on GitHub. github.com 기존 트위터 형태소 분석기에 다음과 같은 내용이 있다. 트위터에서 넘어온 깃허브 주소는 아래와 같고 github.com/open-korean-text/o..
현재 유니코드로 대부분의 문자열을 추출하기 때문에 본 포스팅도 유니코드를 기반의 한글 자모 추출 내용이다. 우리가 한글에서 자모를 추출하기 위해서는 유니코드에서 한글이 어느위치에 있는지를 알아야 한다. (참고로 파이썬에 관련된 자모 추출이 궁금하면 포스팅 맨 하단의 링크글로 들어가면 된다.) 유니코드는 마구잡이로 한글을 넣지 않았고 초성, 중성, 종성의 조합으로 값을 넣게 되었는데 반대로 이 조합을 알면 현재의 한글을 초성, 중성, 중성으로 분리할 수 있다는 말이 된다. 비슷한 개념으로 영어의 소문자(97~122)와 대문자(65~90)의 변환을 32로 빼고 더하는 것으로 변환할 수 있는 것과 유사하다. 유니코드에서 한글의 시작점은 AC00값이며, 이 값은 한글로 "가"이다. 즉 이 값을 기준으로 유니코드..
아스키코드(ASCII) 아스키코드(American Standard Code for Information Interchange, ASCII)는 아스키의 말을 풀어 썼을 때 알 수 있는 것처럼 오로지 미국을 위한 표준 부호였다. 초창기 컴퓨터는 영어권에서 사용됐으며, 당시 그들은 전세계의 말을 쓸 필요가 없다 생각했기에 1bit의 체크섬(Checksum)용을 제외하고 라틴 문자, 숫자 그리고 특수 문자들을 128개 모와 7bit의 아스키코드를 만들었다. 그러나, 컴퓨터의 발달로 전세계가 각자 부호표를 만들어 수많은 캐릭터셋(ex: euckr, cp949)을 만들게 되었고 이 캐릭터셋은 최근 10년 들어서 UTF-8로 대동단결하게 된다. 참고로 10년전만 하더라도 수많은 국내 사이트들이 EUC-KR로 사이트를..