반응형
반응형

[2단계] 데이터 전처리 (Preprocessing 및 파이썬 자연어처리 라이브러리 정리)



데이터 전처리 순서 (Preprocessing Step)


  1. 토큰화 (Tokenization)
    • 문자열에서 단어로 분리시키는 단계
  2. 불용어 제거 (Stop word elimination)
    • 전치사, 관사 등 너무 많이 등장하는 단어 등 문장이나 문서의 특징을 표현하는데 불필요한 단어를 삭제하는 단계
  3. 어간 추출 (Stemming)
    • 단어의 기본 형태를 추출하는 단계
  4. 문서 표현 (Representation)
    • 주어진 문서나 문장을 하나의 벡터로 표현하는 단계
    • 단어들을 모두 인덱싱(indexing)하고 주어진 문서에 존재하는 단어의 빈도수를 사용하여 문서를 표현


자연어처리를 위한 Python 라이브러리 종류


1. KoNLPy (코엔엘파이)http://konlpy-ko.readthedocs.io/ko/v0.4.3/#

  • 한국어 자연어처리를 위한 대표적인 파이썬 라이브러리 
  • NLP (Natural Language Processing, 자연어처리)란? 텍스트(Text)에서 의미있는 정보를 분석, 추출하고 이해하는 일련의 기술 집합
  • Twitter, Komoran, Mecab 등 다양한 형태소 분석기를 내장하고 있음

관련된 글


2. NLTK (Natural Language Toolkit) http://www.nltk.org/

  • 영어로된 텍스트의 자연어처리를 위한 대표적인 파이썬 라이브러리
  • NLTK is a leading platform for building Python programs to work with human language data.
  • It provides easy-to-use interfaces to over 50 corpora and lexical resources such as WordNet, along with a suite of text processing libraries for classification, tokenization, stemming, tagging, parsing, and semantic reasoning, wrappers for industrial-strength NLP libraries, and an active discussion forum.


3. Gensim https://radimrehurek.com/gensim/

  • 주로 Topic modeling, Corpus(말뭉치) 및 Word Embedding 모델을 지원해줌
  • 한국어 및 다양한 언어를 지원해줌
관련된 글

전처리 과정


1. 토큰화 (Tokenization) : 단어를 떼어내는 단계

ex) I loved you. data-mining

= I / love / you 로 띄어쓰기나 개행을 기준으로 단어를 떼어내는 것을 말한다. 

  • 1-1) 단어를 띄어쓰기와 개행을 기준으로 단어를 떼어낸다.   ex) I / loved / you. / data-mining
  • 1-2) 문장 부호를 기준으로 한번 더 떼어낸다.                      ex) I / loved / you / . / data / - / mining
  • 1-3) 문장 부호를 떼어 내는데 예외를 둔다.                         ex) I / loved / you / . / data-mining

파이썬 3.6 Tokenizer 가이드 : https://docs.python.org/3/library/tokenize.html

파이썬 2.7 Tokenizer 가이드 : https://docs.python.org/2.7/library/tokenize.html


2. 불용어 제거 (Stop word elimination) : 불필요한 단어들을 제거하는 단계

  • 2-1) 모든 단어를 소문자화한다.
  • 2-2) 불용어 사전을 검색하여 불용어를 삭제한다. 
  • 2-3) 전제 말뭉치(corpus)에서 n번 이상 등장하지 않는 단어를 삭제한다.
    • why? 별로 중요한 단어라고 생각하지 않기 때문에

3. 어간 추출 (Stemming)
  • 단어를 기본형으로 표현하여 같은 단어가 표현형 때문에 다른 단어로 인덱싱(indexing)되는 일 없도록 한다.
  • 이때, 다양한 알고리즘을 사용하는데, 기본형으로부터 단어들을 자동으로 파생시켜서 리스트를 만들고 매칭을 시키기도 한다.
관련된 글
  • https://datascienceschool.net/view-notebook/118731eec74b4ad3bdd2f89bab077e1b/

4. 문서 표현 (Representation)

다양한 알고리즘을 사용하여서 문서(Text)를 벡터(Vector)값으로 변환하는 단계이다. (=임베딩, Embedding)
이렇게 바뀐 벡터(Vector)값을 통해서 우리는 유클리디안 거리, 코사인 유사도 등을 통해 단어간의 유사성 등을 구할 수 있다.
  • word2vec
  • doc2vec

Dictionary (사전)
  • 단어와 단어에 대한 인덱스가 표시된 사전
  • 단어 자체를 사용하여 문서를 표현하면 비효율적이다.
  • 문서 집합에 있는 문서 전체를 읽어가면서 토큰화, 불용어 제거 등의 순서를 진행하여 사전을 구축한다.
  • 불용어, 어간추출 등의 비적용/부분적용이 가능하다. (선택적)
  • ex) 사전 파일 (line 번호를 단어 index로 간주)


예제

뉴스 제목 = 한글 + 영어 + 한자 + 특수문자 

1차 가정 : 한글만 허용하고 나머지는 삭제해서 학습시켜보기 (추후에 regex 라이브러리 찾아보기, + 영어 라이브러리 적용)

Read Document 
from konlpy.corpus import kobill    # Docs from pokr.kr/bill
files_ko = kobill.fileids()         # Get file ids
doc_ko = kobill.open('1809890.txt').read()


Tokenize 

from konlpy.tag import Twitter; t = Twitter()
tokens_ko = t.morphs(doc_ko)

Load tokens
import nltk
ko = nltk.Text(tokens_ko, name='대한민국 국회 의안 제 1809890호')   # For Python 2, input `name` as u'유니코드'

기능1) tokens 
print(len(ko.tokens))       # returns number of tokens (document length)
print(len(set(ko.tokens)))  # returns number of unique tokens
ko.vocab()        
기능2) count 
ko.count('초등학교')   # Counts occurrences
기능3) Concordance 
ko.concordance('초등학교')
기능4) Similar word 
ko.similar('자녀')
ko.similar('육아휴직')
기능5) Collocations
en.collocations()
POS Tagging
from konlpy.tag import Twitter; t = Twitter()
tags_ko = t.pos("작고 노란 강아지가 페르시안 고양이에게 짖었다")

# 수집된 txt 파일을 한 줄씩 \n (줄바꿈)을 기준으로 읽어들인다.
def read_data(filename):
with open(filename, 'r') as f:
data = [line.split('\t') for line in f.read().splitlines()]
data = data[1:] # header 제외
return data
train_data = read_data('ratings_train.txt')

test_data = read_data('ratings_test.txt')

# row, column의 수가 제대로 읽혔는지 확인
print(len(train_data)) # nrows: 150000
print(len(train_data[0])) # ncols: 3
print(len(test_data)) # nrows: 50000

print(len(test_data[0])) # ncols: 3


# 형태소(POS) 분석을 하고, Tokenizing 한다.

    • Q. 꼭 형태소/품사를 나눠야하는가? 
      데이터가 정말 충분하다면, 어절 단위로도 분석이 가능하지만 데이터가 적으므로 형태소로 나누는 것이 필요하다.
      품사를 태깅해둔다면 동음이의어를 구분할 수 있다. 
from konlpy.tag import Twitter
pos_tagger = Twitter()
def tokenize(doc):
# norm, stem은 optional
return ['/'.join(t) for t in pos_tagger.pos(doc, norm=True, stem=True)]
train_docs = [(tokenize(row[1]), row[2]) for row in train_data] # Training Data ( 학습용 데이터 )
test_docs = [(tokenize(row[1]), row[2]) for row in test_data] # Test Data ( 검증용 데이터 )
# 잘 들어갔는지 확인
from pprint import pprint
pprint(train_docs[0])
# => [(['아/Exclamation',
# '더빙/Noun',
# '../Punctuation',
# '진짜/Noun',
# '짜증/Noun',
# '나다/Verb',
# '목소리/Noun'],

# '0')]


# 말뭉치(Corpus)가 어떤 특징을 가지고 있는지 Training Data의 Token 모으기

tokens = [t for d in train_docs for t in d[0]]
print(len(tokens))
# => 2194536

# NLTK를 통한 tokenize
import nltk
text = nltk.Text(tokens, name='NMSC')
print(text)
# => <Text: NMSC>

print(len(text.tokens)) # returns number of tokens
# => 2194536
print(len(set(text.tokens))) # returns number of unique tokens
# => 48765
pprint(text.vocab().most_common(10)) # returns frequency distribution
# => [('./Punctuation', 68630),
# ('영화/Noun', 51365),
# ('하다/Verb', 50281),
# ('이/Josa', 39123),
# ('보다/Verb', 34764),
# ('의/Josa', 30480),
# ('../Punctuation', 29055),
# ('에/Josa', 27108),
# ('가/Josa', 26696),


Doc2vec 예제 

from collections import namedtuple
TaggedDocument = namedtuple('TaggedDocument', 'words tags')
# 여기서는 15만개 training documents 전부 사용함
tagged_train_docs = [TaggedDocument(d, [c]) for d, c in train_docs]

tagged_test_docs = [TaggedDocument(d, [c]) for d, c in test_docs]


from gensim.models import doc2vec
# 사전 구축
doc_vectorizer = doc2vec.Doc2Vec(size=300, alpha=0.025, min_alpha=0.025, seed=1234)
doc_vectorizer.build_vocab(tagged_train_docs)
# Train document vectors!
for epoch in range(10):
doc_vectorizer.train(tagged_train_docs)
doc_vectorizer.alpha -= 0.002 # decrease the learning rate
doc_vectorizer.min_alpha = doc_vectorizer.alpha # fix the learning rate, no decay
# To save

# doc_vectorizer.save('doc2vec.model')


pprint(doc_vectorizer.most_similar('공포/Noun'))
# => [('서스펜스/Noun', 0.5669919848442078),
# ('미스터리/Noun', 0.5522832274436951),
# ('스릴러/Noun', 0.5021427869796753),
# ('장르/Noun', 0.5000861287117004),
# ('판타지/Noun', 0.4368450343608856),
# ('무게/Noun', 0.42848479747772217),
# ('호러/Noun', 0.42714330554008484),
# ('환타지/Noun', 0.41590073704719543),
# ('멜로/Noun', 0.41056352853775024),
# ('공포영화/Noun', 0.4052993059158325)]


해당 예제는 https://www.lucypark.kr/courses/2015-dm/text-mining.html 를 참고하여 만들어졌습니다. 



참고 문서


반응형

데이터마이닝 알고리즘에 대한 포스팅




데이터마이닝 분석 방법

  1. 분류 분석
    • 목표 필드의 값을 찾는 모델을 생성하여 과거의 데이터를 입력하여 분류 모델을 생성하고 새로운 데이터에 대한 분류 값을 예측하는 것
  2. 군집 분석
    • 데이터를 여러가지 속성(변수)들을 고려하여 성질이 비슷한 몇 개의 집합으로 구분하는 분석 기법
      분류분석과는 달리 목표 변수를 설정하지 않는다. 따라서 분류는 교사학습이라고하고 군집은 비교사 학습이라 한다.
  3. 연관 규칙
    • 장바구니 분석 방법
      A물건을 구입하는 회원은 B물건도 같이 구입하는 패턴을 분석했다면 A물건 구입시 B물건을 추천해주는 기법
  4. 연속 패턴 
    • 연관 규사 규칙과 비슷한 분석 방법
      노트북을 구입한 사람은 한달 후에 노트북 받침대를 구입한다는 패턴을 찾으면 이 규칙을 바탕으로 노트북 구입자에게 노트북 받침대를 추천하는 기법

데이터마이닝 동영상 강좌 

  1. Google TechTalk에서 제공하는 데이터마이닝 강좌 (Stat202)  [강좌보기]
  2. 방송통신대학의 데이터마이닝 강좌 [강좌보기]


각 알고리즘들의 종류와 특징
  1. 연관 규칙 알고리즘 (association rule)
  2. 클러스터링 알고리즘 (clustering)
  3. 신경망 알고리즘 (neural network)
  4. 결정트리 알고리즘 (decision tree)
  5. 유전자 알고리즘 (genetic)
  6. 베이지안 네트워크 알고리즘 (bayesian network)
  7. 메모리 기반 추론 알고리즘  (memory-based reasoning)
  8. 시계열 알고리즘

1. 알고리즘 선택하기
    • 데이터 집합의 다른 특성을 기반으로 하나 이상의 불연속 변수를 예측하는분류 알고리즘

    • 데이터 집합의 다른 특성을 기반으로 수익 또는 손실과 같은 하나 이상의 연속 변수를 예측하는 회귀 알고리즘

    • 데이터를 속성이 유사한 항목의 그룹 또는 클러스터로 나누는 세그먼트화 알고리즘

    • 데이터 집합에 있는 여러 특성 사이의 상관 관계를 찾는연결 알고리즘
      이러한 종류의 알고리즘은 시장 바구니 분석에 사용할 수 있는 연결 규칙을 만드는 데 가장 일반적으로 적용됩니다.

    • 시퀀스 분석 알고리즘은 웹 사이트에서 일련의 클릭 또는 컴퓨터 유지 관리 앞의 일련의 로그 이벤트와 같이 데이터에서 빈번한 시퀀스 또는 에피소드를 요약합니다.

참고 링크


반응형

#데이터마이닝 : https://msdn.microsoft.com/ko-kr/library/ms174949.aspx


개요

데이터 마이닝이란 큰 데이터 집합에서 의미있는 정보를 찾는 것이며 이러한 정보를 찾는데에는 수학적 분석을 이용하여 데이터에 있는 패턴과 추세를 읽는 것이다. 일반적으로 관계가 너무 복잡하거나, 데이터가 너무 많은 경우, 전통적인 데이터 탐색패턴으로는 이러한 패턴을 찾을 수가 없기 때문에 데이터 마이닝이라는 개념이 나오게 됐다.


데이터 마이닝이 적용가능한 사례

  1. 예측 (Frecasting) : 서버 부하 또는 서버 가동 중지 시간을 예측하기
  2. 군집화(Clustering) : 구체적인 특성을 공유하는 군집을 찾는다. 군집화는 미리 정의된 특성에 대한 정보를 가지지 않는다는 점에서 분류와 다르다 (예 : 유사 행동 집단의 구분)
  3. 분류(classification) : 집단 또는 범주형 변수로 반응을 한다. 안한다. 혹은 안전이다. 위험이다. 등 값을 예측하여 분류하는 기법
  4. 연관성(Association) : 동시에 발생한 사건간의 관계를 정의한다. (예: 장바구니안의 동시에 들어 가는 상품들의 관계 규명)
  5. 연속성(Sequencing) : 특정 기간에 걸쳐 발생하는 관계를 규명한다. 기간의 특성을 제외하면 연관성 분석과 유사하다 (예: 슈퍼마켓과 금융상품 사용에 대한 반복 방문)
  6. 예측(Forecasting) : 대용량 데이터집합내의 패턴을 기반으로 미래를 예측한다 (예: 수요예측, 위험 및 확률 예측)


데이터 마이닝의 기본 프로세스 

  1. 문제 정의
  2. 데이터 준비
  3. 데이터 탐색
  4. 모델 작성
  5. 모델 탐색 및 유효성 검사
  6. 모델 배포 및 업데이트

1단계. 문제 정의

  1. 찾으려는 것은 무엇인지, 찾을 관계의 유형은 무엇인지
  2. 해결할 문제가 비즈니스의 정책 또는 프로세스를 반영하는지
  3. 데이터 마이닝 모델을 사용하여 예측을 할 것인지, 아니면 패턴만 찾을 것인지
  4. 예측할 결과 또는 특성은 무엇인지
  5. 어떤 종류의 데이터를 가지고 있으며, 각 열에는 어떠한 정보의 종류가 들어가 있는지, 
    테이블이 여러개인 경우 해당 테이블들과의 관계는 어떻게 구성되어있고
    데이터를 사용가능한 데이터로 만들기 위해서 해야할 정리, 집계가 필요한지
  6. 데이터가 어떻게 쌓인 것인지, 주기적인 데이터들인지 아니면 비즈니스 로직을 모두 담고 있는지
이러한 질문들을 통해서 데이터 가용성 및 사용 가능한 데이터에 대한 요구 사항을 조사해야 한다.
데이터가 사용자의 요구사항에 부합하지 않는다면 프로젝트를 다시 구성해야 한다. Ex) KPI같은 목표를 설정한다면 더 좋다.

2단계. 데이터 준비
데이터가 회사의 여러부서에 흩어져 서로 다른 형식으로 저장되기도 하고 항목이 잘못되었거나 누락되는 등의 데이터 불일치가 있을 수 있다. 데이터 정리는 단지 잘못된 데이터를 제거하거나 누락된 값을 보정하는 것만아니라 데이터의 숨겨진 상관 관계를 찾아내고 가장 정확한 데이터 원본을 식별하고 분석에 사용할 가장 적절한 열을 확인하는 것이다. 즉, 불완전한 데이터와 잘못된 데이터 등은 결과에 예상치 않은 영향을 줄 수가 있다.

따라서, 마이닝 모델을 실행하기 전에는 이러한 문제를 파악하고 수정 방법을 확인해야 한다. 데이터 마이닝의 경우 일반적으로 매우 큰 데이터 집합으로 작업하므로 모든 트랜잭션의 데이터 품질을 검사할 수 없다. 그러므로 데이터를 탐색하고 불일치하는 사항을 찾아내기 위해서 특정한 데이터 형태의 데이터 프로파일링 도구와 자동 데이터 정리 및 필터링 도구를 사용하여 정리한다.

3단계. 데이터 탐색
마이닝 모델을 만들 때 적절한 결정을 내리기 위해서는 데이터를 이해해야 한다. 탐색기술에는 최소값 및 최대값 계산, 평균 및 표준 편차, 데이터 배포 검토 등이 포함된다. 예를 들어 최대값, 최소값 및 평균 값을 검토하여 데이터가 고객 또는 비즈니스 프로세스를 대표하지 않는지 확인하고, 그러한 경우 보다 균형있는 데이터를 가져오거나 예상의 기초가 된 가정을 검토해야 하는지 확인할 수 있다. 표준 편차가 크면 다른 데이터를 추가하여 모델을 개선할 수도 있다. 표준 분포에서 지나치게 벗어나는 데이터는 왜곡된 것일 수도 있고, 실제 문제를 정확히 나타낸 것일 수도 있지만 이러한 데이터가 있으면 데이터에 맞는 모델을 만들기가 어려워진다. 비즈니스 문제를 정확히 이해하고 데이터를 탐색하면 데이터 집합에 결함이 있는 데이터가 있는지 확인한 다음 문제를 해결할 수 있는 전략을 고안하거나 비즈니스의 일반적인 동작을 보다 깊이 있게 이해할 수 있다. 

4단계. 모델 작성
마이닝 구조를 만들어 사용할 데이터 열을 정의한다. 마이닝 구조는 데이터 원본에 링크되지만 처리되기 전까지는 실제로 데이터가 포함되지 않는다. 마이닝 구조를 처리하면 Analysis Services 에서는 분석에 사용할 수 있는 집계 및 기타 통계 정보를 생성한다. 이 정보는 해당 구조를 기반으로 하는 마이닝 모델에서 사용할 수 있다. (마이닝 구조와 마이닝 모델의 관계에 대한 내용은 이곳을 참고하기)

구조 및 모델이 처리되기 전에는 데이터 마이닝 모델 역시 단지 입력에 사용되는 열, 예측할 특성 및 알고리즘에 데이터 처리 방식을 알려주는 매개 변수를 지정하는 컨테이너이다. 모델을 처리하는 작업을 학습이라고도 하는데 학습은 패턴을 추출하기 위해 구조의 데이터에 특정 수학적 알고리즘을 적용하는 프로세스다. 학습 프로세스에서 찾은 패턴은 선택한 학습 데이터, 선택한 알고리즘 및 알고리즘 구성 방식에 따라 달라진다. (sql server 2016에서 제공되는 알고리즘 목록은 이곳을 참고하기)

매개 변수를 사용하여 각 알고리즘을 조정하고 일부 데이터만 사용하도록 학습 데이터에 필터를 적용하여 다른 결과를 만들 수도 있다. 데이터가 변경될 때 마다 마이닝 구조와 마이닝 모델을 모두 업데이트해야하며 마이닝 구조를 다시 처리하여 업데이트하면 Analysis Services에서는 원본 데이터를 검색하고 마이닝 구조를 다시 채운다.

원본이 동적으로 업데이트된 경우에는 검색 시 새 데이터도 포함된다. 해당 구조를 기반으로 하는 모델이 있는 경우 모델을 업데이트하여 새 데이터에 대해 다시 학습되도록 할 수 있고 모델을 그대로 둘 수 도 있다.

5단계. 모델 탐색 및 유효성 검사
모델을 프로덕션 환경에 배포하기 전에 모델의 효율성을 테스트 해야 한다. 또한 모델을 작성할 때는 일반적으로 각기 다른 구성으로 여러 모델을 만들고 모든 모델을 테스트하여 어떤 모델에서 문제 및 데이터에 대한 최상의 결과가 얻어지는지 확인해야 한다. 모델 작성 단계에서 만든 모델의 효율성이 모두 떨어지는 경우 프로세스의 이전 단계로 돌아가서 다시 문제를 정의하거나 원래 데이터 집합의 데이터를 다시 조시 해야 할 수 도 있다.

6단계. 모델 배포 및 업데이트

모델을 사용하여 예측하여 비즈니스 의사결정이 가능할 수 있다.



데이터 마이닝의 과정

  • 문제 정의 > 데이터 준비 > 데이터 탐색 > 데이터 정제 > 데이터 모델 (알고리즘 등 분석 방법 & 데이터 분할) > 데이터 유효성 검사 > 데이터 추출 > 데이터 시각화 > 데이터 분할 > 결과 도출 > 예측 > 새로운 데이터(변수) 추가 & 업데이트 > 반복


참고 링크

  • [위키-데이터마이닝] https://ko.wikipedia.org/wiki/%EB%8D%B0%EC%9D%B4%ED%84%B0_%EB%A7%88%EC%9D%B4%EB%8B%9D


+ Recent posts