반응형
반응형

[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 를 참고하여 만들어졌습니다. 



참고 문서


반응형

[머신러닝] lab 8: Tensor Manipulation

https://www.youtube.com/watch?v=ZYX0FaqUeN4&index=24&list=PLlMkM4tgfjnLSOjrEJN31gZATbcj_MpUm



1. 텐서플로우의 기본적인 1차원 Array 사용법

t = np.array([0,1,2,3,4,5,6])

pp.print(t)

print(t.ndim) #차원 수 출력

print(t.shape) #행렬

print(t[0], t[1], t[-1])...

print(t[2:5], t[4:-1])...

print(t[:2], t[4:])... 


2. 2차원의 Array 사용법

t = np.array([1, 2, 3],[1, 2, 3], [1, 2, 3], [1, 2, 3])

pp.print(t)  #(4,3)행렬이 나오게 됨 

print(t.ndim) # 차원 수 : 2

print(t.shape) # 행렬



반응형

#모두를 위한 딥러닝 강좌 lec 8-2 : 딥러닝의 기본 개념2: Back-propagation 과 2006/2007 '딥'의 출현

https://www.youtube.com/watch?v=AByVbUX1PUI&list=PLlMkM4tgfjnLSOjrEJN31gZATbcj_MpUm&index=23



Breakthrough

in 2006 and 2007 by Hinton and Bengio

초기값을 잘준다면 신경망이 많아도 학습이 잘 될 수 있다는 이론의 논문 발표

뉴럴넷이라고 하면 사람들이 어려워하고 힘들어하니까 Deep learning 으로 명칭도 바꿔서 말하기 시작함


ImageNet 

이미지 넷이라는 사이트에서는 사진을 주고 컴퓨터에게 무슨 사진인지 맞춰보라고 하는 기능이 비약적으로 오류율을 줄이면서 관심을 더 갖게 됨

뿐만 아니라 기술의 발전으로 그림을 설명하기도 했다. 


최근 바이두에서는 소음이 많은 곳에서도 사람의 음성을 인식하는 기술을 개발했다..


그러면서 Hinton이 왜 이전에 잘 안됐는지 4가지 원인을 밝혀보았다.

요건 다음 시간에..


데이터 마이닝을 알면 뭐가 좋은가?

비즈니스 환경에서 활용할 수 있다.

ex) 유튜브의 자막, 페이스북의 추천도 모두 AI를 통해서 만들어지고 있는 서비스다.

반응형

동영상으로 보는 초평면의 개념





반응형


반응형

hdf5 파일형식이란? (https://www.hdfgroup.org/hdf5/)

계층적 데이터 형식(Hierarchical Data Format, HDF)은 HDF Gruop에 의해 관리되고 있는 대용량의 데이터를 저장하기 위한 파일 형식이다.

HDF5 is a data model, library, and file format for storing and managing data. It supports an unlimited variety of datatypes, and is designed for flexible and efficient I/O and for high volume and complex data. HDF5 is portable and is extensible, allowing applications to evolve in their use of HDF5. The HDF5 Technology suite includes tools and applications for managing, manipulating, viewing, and analyzing data in the HDF5 format.


hdf5의 특징 (https://support.hdfgroup.org/HDF5/whatishdf5.html)

  • XML과 동일하게 자기 기술적으로 구성되어있어 데이터 형식을 파일 안에 기술이 가능하다.
  • 많은 양의 데이터를 저장 가능하다.
  • 검색 속도가 빠르다.
  • 병렬 입출력을 지원한다.
  • 데이터의 무작위 조회가 가능하다.
  • 20여년 이상 개발되어온 포맷으로 안정적이다.
  • 수많은 프로그래밍 언어와 오픈소스 라이브러리 API가 지원된다.

hdf5에 대해서

Python에서 사용하는 방법


참고 링크


반응형


#텍스트간의 유사성을 판단하는 : 편집거리 알고리즘 (Levenshtein distance)

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




두 문자열의 유사도를 판단하는 알고리즘으로 비교하려는 문자열을 기준으로 문자열을 삽입/삭제/변경(수정)을 몇 번이나하여 동일하게 바꿀 수 있는 지를 계산하여 유사도의 판단 기준으로 삼는 알고리즘이다.


예시) next과 text의 유사도를 알고 싶다면?

 {}

N

E

X

T

T

E

 

 

 

 

X

 

 

 

 

T

 

 

 

 


ㄱ. T를 N으로 바꾸는 방법

(방법1) T를 삭제(+1)하고 N으로 수정(+1)한다. : 비용2

(방법2) T에 N을 추가(+1)하고 (TN) T를 삭제(+1)한다. : 비용 2

(방법3) T를 N으로 수정(+1)한다. : 비용1


이런 방식으로 모든 칸의 비용을 계산한 뒤, 최소 비용의 값을 구하면 된다.



참고 링크


반응형

#모두를 위한 딥러닝 강좌 lec 8-1: 딥러닝의 기본 개념: 시작과 XOR 문제

https://www.youtube.com/watch?v=n7DNueHGkqE&list=PLlMkM4tgfjnLSOjrEJN31gZATbcj_MpUm&index=22



사람의 뇌는 굉장히 복잡하게 연결되어있는데, 연결된 부분들을 자세히보니(뉴런)을 자세히 보니 단순하게 움직이는 구조더라! input → input이 들어오는 신호의 길이에 따라서 input x* weight 되면서 계속해서 Sum이되고 Bias라는 값이 더해지면서 전달이 되더라!

근데 그 어떤값을 통해서 뇌가 활성화가 되고 활성화가 되지 않기도 하더라! 그래서 나온 컴퓨터로 구현할 수 있지 않을까해서 나온 것이


Activation Functions


값이 어떤 값보다 크면 1을 주고 어떤 값보다 낮으면 0을 주는 형태로 만들면 되겠다! 라는 아이디어가 나왔다.


Logistic regression Units


지난 번 시간에 배웠던 Logistic regression이 여러개가 있따면 이런식으로 네트워크를 형성할 수 있겠다!

= 여러개의 출력을 동시에 낼 수 있다.


False Promises (허황된 약속)


Frank 박사는 당시에 그러한 알고리즘을 통해서 말하고, 걷고, 글을쓰고, 자기자신을 인지할 수 있다고 말을 함...

많은 사람들에게 관심을 끌게 되었고...


근데 성과가 없었던 것은 아니였다고 한다..


AND/OR problem : linearly separable? 


그 당시에 AND와 OR라는 로직을 풀 수 있으면, 이것들을 조합해서 인공지능 기계를 만들 수 있겠다고 생각했었다.


OR = x1(가로축 값)과 x2(세로축 값)의 값이 있을 때

x1이 1이고 x2가 1이면 = 1이되고

x1이 0이고 x2가 0이면 = 0이되는 것을 안다면 (왼쪽 or 그림)


x1+x2를 통해서 Y라는 값을 만들 수 있을까?

linear하기 때문에 값을 구분할 수 있다!


AND

x1이 0일때, x2도 0이면은 값이 0이 되고,

x1이 1일때, x2도 1이면은 값이 1이되는 (오른쪽 and 그림)


..... 진짜 인공지능 머신을 만들 수 있겠다 싶었는데!!


XOR라는 이상한게 나옴! 어떻게 나왔느냐


 x1

 x2

 결과

 0

 0

0

 0

 1

1

 1

 0

 1 

 1

 1

0


값이 같을 때 0, 값이 다를때 1이되는.. XOR를 가지고 x1과 x2를 더해서 Y값을 나오게 기계에게 시켰는데?

Y가 정확하게 안나오는 것이다..


이유는 +와 -값이 다르기 흩어져있기 때문에 어떻게해도 linear하게 선이 그어질 수 없어서 100프로 맞게 나올 수가 없다. 

확률이 아무리해도 50%밖에 안나오더라.. 그래서 많은 사람들이 좌절함


Perceptrons(1969) by Minsky

이런 시기에 Minsky라는 교수가 XOR는 수학적으로 풀 수 없다며 수학적인 증명으로 말했고

[  ] [  ] [  ] MLP를 여러개 합쳐서 XOR를 할 수는 있지만, 각각 [  ]안에 들어가는 weight 과 bias를 학습시킬 수 없다고 했다.






그러다가 74,84년도 쯤에 해결이 된다.

Backpropagation (1974, 1982)

가운데에 네트워크가 연결되어있고 w+b를 통해서 출력을 만들어낼 수 있는데

출력이 원하는 결과가 아닐 경우 w나 b를 조절해야했는데,


나중에 앞에서 w나 b값을 조절하지말고 나중에 w와 b를 조절하면 어떨까?하고 논문을 냄


이것을 통해서 본격적으로 ML에 이 알고리즘이 사용되기 시작함.


그리고 나중에 고양이의 시신경이 어떻게 움직이는지 보려고 했는데

그림을 다르게 줄 때마다 새로운 네트워크를 형성하여가는 것을 발견함


즉, 일부를 인식하고 나중에 합쳐지는 것이 아닐까란 생각을 함


Convolutional Neural Networks

그림을 모두 한번에 읽는 것이 아니라. 

A라는 그림을 잘라서 작게 쪼개서 머리로 보내고 나중에 그림을 다 합치는 방법을 발견하였다 => Neural Networks 방법 발견


A Big problem


Backpropagetion을 통해서 몇개는 괜찮던데 네트워크가 여러개로 만들어지는 머신러닝의 경우,

뒤에서 조절된 W와 B값이 다시 앞까지 가는데, 정보가 소실되고 어렵게 됨..

결국 간단한 알고리즘들이 더 성능이 좋더라!


+ Recent posts