반응형
반응형

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



참고 문서


반응형


반응형

python 문자열 아스키코드 알아내기


# 문자열에서 아스키 코드값 추출

print(ord('a')) => 97


# 아스키 코드에서 문자열로 변환 : https://namu.wiki/w/%EC%95%84%EC%8A%A4%ED%82%A4%20%EC%BD%94%EB%93%9C

print(chr(65)) => A


# 슬라이싱을 이용하여서 문자열의 아스키 값 추출하기

chr(int(Str[시작:끝])))

- 이때 시작값은 0부터 시작이다.

반응형

정규식 문법

사용 문자

사용법

의미

비고

.

a.b

\n(줄 바꿈)를 제외한 모든 문자와 매치됨을 의미한다.

즉, a와 b 문자 사이에 모든 문자가 허용된다.

ex) aab, acb, afb, a3b ....


^

^app

문자열의 시작을 나타낸다.

ex) ^app apple.... , appads ..

즉, app~로 시작하는 문자열이 모두 매치된다.


$

ple$

문자열의 종료를 나타낸다.

ex) abcple, aee3ple, oefple ....


[]

apple[a-z]

집합을 의미한다.

ex) [abcd]의 경우 a 또는 b 또는 c또는 d를 의미한다.

ex) [^5]일 경우 5를 제외한 모든 문자를 의미한다.

ex) [a-c]일 경우, a~c 문자를 의미한다.

apple[a-z]는 applee, applec... 와 매치되고 

apple4, appleE와 같은 문자일 경우, 매치되지 않는다.


|

a|b

OR 연산을 의미한다. 

ex) a|b는 a 또는 b문자열을 의미한다.


()

(a|b)

괄호 안의 정규식을 group으로 만든다.

직접 괄호를 통하여 매칭하기 위해서 \(, \[로도 나타낸다.


*

ca*t

0회 이상 반복되는 것을 의미한다. 

ex) ca*t는 ct, cat, caat, caaaaat) 등과 매치된다.


+

a+

1회 이상 반복되는 것을 말한다.

ex) cat, caaat 등


?

ca?t

0회 또는 1회 이상 반복되는 것을 의미한다.

ex) ca?t는 cat, ca와 매치된다.


{m}

 ca{2}

{m}회 반복하는 것을 말한다. 

ex) ca{2}는 caa와 매치된다. 

 

{m, n}

 ca{m,n}

m 회부터 n회까지 반복됨을 말한다.

ex) ca{2,4}p는 caap, caap, cbbbp와 매치된다.

 

{m,}

 

 

 


정규식 예제

import re


print (bool(re.match( '[a-c]{3}', 'aaa')))

→ True


반응형

* 텐서플로우 lib를 추가하기 위해서 확인해야 할 사항

1) python 버전이 3.5.x 인지 확인

$python --version

2) pip 버전이 9.0.x 확인

$pip --version




1. Python 버전 3.5.x 다운로드 및 환경변수 설정 : http://aileen93.tistory.com/58 참고

2. pip 버전 업그레이드하는 방법

방법1) Pycharm을 통해 업그레이드 

Fail > Settings > Project:프로젝트명 > Project Interpreter > 오른쪽 + 버튼 클릭 > pip 검색 > Install Package 

방법2) CMD를 명령어를 통한 업그레이드

[Mac OS] pip 업데이트 

$pip install -U 

[Windows OS] pip 업데이트

$python -m pip install -U pip

방법3) 아나콘다를 이용하기

Python과 Anaconda 모두 삭제 > pip 버전을 확인하여서 Anaconda 다른 버전으로 재설치




pip 환경변수 등록하기

1. pip 명령어를 통해 이미 설치되어 있을 경우, 환경변수 설정을 하고, 그렇지 않을 경우 

2. pip.exe가 있는 경로를 환경변수에 추가 

  • %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;C:\Windows\softcamp\sds;C:\Windows\softcamp\sdk;C:\Windows\Softcamp\SDS\x64;C:\Windows\SoftCamp\SDK\x64;C:\Users\Aileen\AppData\Local\Programs\Python\Python35;C:\Users\Aileen\AppData\Local\Programs\Python\Python35\Scripts;



pip 설치하다가 아래와 같이 오류가 날 경우

Collecting pip==9.0.1

  Could not fetch URL https://pypi.python.org/simple/pip/: There was a problem confirming the ssl certificate: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:645) - skipping


  Could not find a version that satisfies the requirement pip==9.0.1 (from versions: )

No matching distribution found for pip==9.0.1


http://aileen93.tistory.com/72


반응형



Python 환경 변수 설정

1. Python3.5 설치 후, 탐색기> 제어판\모든 제어판 항목\시스템 > 왼쪽 메뉴 > 고급 시스템 설정

2. 시스템 속성 > 고급 > 환경변수 

3. 시스템 변수(S)에 Path 편집 클릭 - 파이썬 설치경로 추가 > 확인

  • %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;C:\Windows\softcamp\sds;C:\Windows\softcamp\sdk;C:\Windows\Softcamp\SDS\x64;C:\Windows\SoftCamp\SDK\x64;C:\Users\Aileen\AppData\Local\Programs\Python\Python35;


4. 시스템 변수(S) > 새로 만들기 > 확인

  • 변수이름 : PYTHONPATH

  • 변수 값 : C:\Users\Aileen\AppData\Local\Programs\Python\Python35\Lib (파이썬 설치경로)


5. 콘솔창을 다시 열어서 python --version 확인




*아나콘다로 파이썬을 설치 했을 경우, 자동으로 환경변수 설정이 모두 되므로 안해도 됨

반응형

파이참(Pycharm)에서 텐서플로우 예제 실행해보기



File > Settings .. 



Project 선택 > Project Intepreter > TensorFlow가 있는지 확인!

없으면, + Install > 



TensorFlow 검색 > Install Package


간단한 예제와 결과

import tensorflow as tf

# https://www.tensorflow.org/get_started/get_started
node1 = tf.constant(3.0, tf.float32)
node2 = tf.constant(4.0) # also tf.float32 implicitly print('result:', node1, node2)

/Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 /Users/aileen/PycharmProjects/test_project/TensorFlow/__init__.py result: Tensor("Const:0", shape=(), dtype=float32) Tensor("Const_1:0", shape=(), dtype=float32) Process finished with exit code 0


관련문서


반응형

파이참(Pycharm)으로 Hello world 찍기



파이참 첫 화면!

Pycharm의 프로젝트 구조 : https://www.jetbrains.com/help/pycharm/2016.3/project-structure-dialog.html



Empty Project에서 마우스 오른쪽 클릭하여 Python File 추가



파일에 Print ("Hello, world") 입력하고 실행하면!


C:\Users\Aileen\AppData\Local\Programs\Python\Python35\python.exe C:/Users/Aileen/PycharmProjects/exam_project/HelloWorld.py

Hello, world!


Process finished with exit code 0


다음편 ☞Pycharm에서 텐서플로우 예제 실행해보기

+ Recent posts