은공지능 공작소 :: '딥러닝 공부' 카테고리의 글 목록 (2 Page)

안녕하세요. 은공지능 공작소의 파이찬입니다.
오늘은 자연어처리 강력한 코딩 팁을 들고 왔습니다.
apply, lambda, python comprehension을 이용한 데이터 EDA 방법입니다.

이 3가지 조합으로 정말 많은 정보들을 뽑아낼 수 있습니다.
저도 이 3가지 코딩법은 각각 알고 있었지만, 이것을 조합해서 쓸 때 더욱 강력하다는 것을 알았고,
또 몸에 체득하는 것이 중요하다는 것을 알았습니다.

여러분들도 실전 코딩에서 유용하게 사용하실 수 있길 바랍니다.
그럼 시작해보겠습니다.

 

 

 

 

 

 

 

 

 

 

 

 

1. 데이터 생성해주기

 

 

 

데이터는 성경 데이터를 가져왔습니다. 마태복음 11장입니다.

"무거운 짐 진 자들아 다 내게로 오라 내가 너희를 쉬게 하리라"
라는 구절로 유명한 챕터입니다. 마음이 평온해지는 구절이죠. ^^

데이터 생성하는 부분은 크게 중요하지 않으니,

그냥 아래 코드를 복붙하셔서 진행하시면 됩니다.

 

 

 

 

 

data = '''After Jesus had finished instructing his twelve disciples, he went on from there to teach and preach in the towns of Galilee.
When John heard in prison what Christ was doing, he sent his disciples
to ask him, "Are you the one who was to come, or should we expect someone else?"
Jesus replied, "Go back and report to John what you hear and see:
The blind receive sight, the lame walk, those who have leprosyare cured, the deaf hear, the dead are raised, and the good news is preached to the poor.
Blessed is the man who does not fall away on account of me."
As John's disciples were leaving, Jesus began to speak to the crowd about John: "What did you go out into the desert to see? A reed swayed by the wind?
If not, what did you go out to see? A man dressed in fine clothes? No, those who wear fine clothes are in kings' palaces.
Then what did you go out to see? A prophet? Yes, I tell you, and more than a prophet.
This is the one about whom it is written: " 'I will send my messenger ahead of you, who will prepare your way before you.'
I tell you the truth: Among those born of women there has not risen anyone greater than John the Baptist; yet he who is least in the kingdom of heaven is greater than he.
From the days of John the Baptist until now, the kingdom of heaven has been forcefully advancing, and forceful men lay hold of it.
For all the Prophets and the Law prophesied until John.
And if you are willing to accept it, he is the Elijah who was to come.
He who has ears, let him hear.
"To what can I compare this generation? They are like children sitting in the marketplaces and calling out to others:
" 'We played the flute for you, and you did not dance; we sang a dirge and you did not mourn.'
For John came neither eating nor drinking, and they say, 'He has a demon.'
The Son of Man came eating and drinking, and they say, 'Here is a glutton and a drunkard, a friend of tax collectors and "sinners." ' But wisdom is proved right by her actions."
Then Jesus began to denounce the cities in which most of his miracles had been performed, because they did not repent.
"Woe to you, Korazin! Woe to you, Bethsaida! If the miracles that were performed in you had been performed in Tyre and Sidon, they would have repented long ago in sackcloth and ashes.
But I tell you, it will be more bearable for Tyre and Sidon on the day of judgment than for you.
And you, Capernaum, will you be lifted up to the skies? No, you will go down to the depths. If the miracles that were performed in you had been performed in Sodom, it would have remained to this day.
But I tell you that it will be more bearable for Sodom on the day of judgment than for you."
At that time Jesus said, "I praise you, Father, Lord of heaven and earth, because you have hidden these things from the wise and learned, and revealed them to little children.
Yes, Father, for this was your good pleasure.
"All things have been committed to me by my Father. No one knows the Son except the Father, and no one knows the Father except the Son and those to whom the Son chooses to reveal him.
"Come to me, all you who are weary and burdened, and I will give you rest.
Take my yoke upon you and learn from me, for I am gentle and humble in hear   t, and you will find rest for your souls.
For my yoke is easy and my burden is light."'''
data_dict = {}
data_dict['verse'] = []

for row in [x for x in data.split('\n')]: 
    data_dict['verse'].append(row)
    
bible_data = pd.DataFrame.from_dict(data_dict)
# bible_data
이렇게 하여 마태복음 11장을 가지고 데이터 프레임을 만들어 보았습니다.
다음으로 Apply 함수에 대해 이해해보는 시간을 가지겠습니다.

 

 

 

 

 

 

 

2. Apply 함수 이해하기

 

 

 

Apply 함수는 컬럼 단위로 적용되는 함수입니다. 
즉, 행열 중 열을 기준으로 다양한 함수를 적용합니다.

적용되는 함수는 기본함수부터 사용자가 정의한 함수까지 다양합니다.
물론 람다(lambda)도 쓰일 수가 있고요.

그럼 길이를 구하는 len 함수부터 적용해서 이해를 해보겠습니다.

 

 

 

 

 

bible_data['verse'].apply(len)
output:
0     125
1      70
2      80
...
27     74
28    116
29     44
Name: verse, dtype: int64
이렇게 하면 verse 컬럼에 있는 모든 데이터에 len 함수가 적용되어 그 값이 출력이 됩니다.
한 번 type같은 함수들도 직접 적용해보시길 바랍니다.

이렇게 len(input), type(input) 형식으로 사용되는 함수들은 바로 적용을 시킬 수가 있습니다.
이런 함수들은 괄호 안에 인자를 넣어서 작동하는 기본 함수들입니다.

하지만 이러한 기본함수들 이외에도 점( . )을 이용해 쓰는 함수들도 있습니다.
apply 함수만 해도 점( . )을 이용해 쓰는 함수이고,
list.append 등도 이러한 방식으로 사용이 됩니다.

이런 함수들은 lambda를 통해 적용을 할 수 있습니다.
바로 아래에서 자세히 다루어 보겠습니다.

 

 

 

 

 

 

 

3. Lambda 함수 이해하기

 

 

 

bible_data['verse'][0] 
output:
'After Jesus had finished instructing his twelve disciples, he went on from there to teach and preach in the towns of Galilee.'
위와 같이 마태복음 11장 1절을 살펴보겠습니다.
첫 글자가 After~ 와 같이 대문자로 시작하는 것을 확인할 수 있습니다.

하지만 모든 절(verse)이 다 대문자로 시작하는 것은 아닙니다.
그래서 저희는 lambda를 이용해서,
첫 글자가 대문자인지 검사하는 코드를 작성해 보겠습니다.

여기에는 2가지 방법이 있습니다.
① 직접 사용자 정의 함수를 만든다.
② 람다 구문을 이용한다.

물론 제가 강조드리고 싶은 것은 ②번이지만, ①번부터 차근차근 다 살펴보도록 하겠습니다.

 

 

 

 

 

def IsUpper(input):
    return input[0].isupper()

bible_data['verse'].apply(IsUpper)
output:
0      True
1      True
2     False
...
27    False
28     True
29     True
Name: verse, dtype: bool
위와 같이 사용자 정의 함수 + apply 함수를 이용하여,
첫글자가 대문자인지를 검사할 수 있습니다.

하지만 그것보다 더 간단한 방법이 있는데,
그것이 바로 lambda 구문의 활용입니다.

 

 

 

 

 

bible_data['verse'].apply(lambda x : x[0].isupper())
output:
0      True
1      True
2     False
...
27    False
28     True
29     True
Name: verse, dtype: bool
이런 식으로 즉석에서 사용자 정의 함수를 만드는 것이 바로 lambda 구문입니다.
아까와 동일한 결과를 내놓지만 코드는 더 깔끔하죠!

이런 것들이 몸에 체득이 되면, 코딩 실무에서 매우 강력한 무기가 될 수 있고
고수의 느낌도 슬슬 풍길 수 있습니다.
여기에다가 list comprehension을 더해주면 더욱 완벽해집니다.

 

 

 

 

 

 

 

4. List comprehension 이해하기

 

 

 

List comprehension... 이름만 들으면 참 아리송합니다.
 리스트는 파이썬의 리스트 데이터 타입을 말하는 것인데,
컴프리헨션의 의미와 구문 사용법이 잘 매칭이 되질 않습니다.

굳이 짜맞추자면 "고도의 이해력을 가진 사람만이 쓸 수 있는 코딩구문"(???)
네 개소리인 것 같습니다...ㅋㅋㅋ
그냥 컴프리헨션이라는 코딩 문법이 있고, 사용법을 숙지하고 가시면 됩니다.

이번에는 각 row 마다 대문자의 개수를 세주는 상황을 가정하겠습니다.
마태복음 11장은 총 30절이 있으니, 30개의 숫자를 가진 컬럼이 출력되는 방식입니다.
가장 기본적은 Comprehension부터 살펴보겠습니다.

 

 

 

 

 

[i for i in bible_data['verse']]
output:
['After Jesus had finished instructing his twelve disciples, he went on from there to teach and preach in the towns of Galilee.',
 'When John heard in prison what Christ was doing, he sent his disciples',
 'to ask him, "Are you the one who was to come, or should we expect someone else?"',
 
 ...
 
 '"Come to me, all you who are weary and burdened, and I will give you rest.',
 'Take my yoke upon you and learn from me, for I am gentle and humble in heart, and you will find rest for your souls.',
 'For my yoke is easy and my burden is light."']
가장 기본적인 List comprehension의 구문입니다.
이런 식으로 Comprehension은 리스트 대괄호로 감싸주는 것이 기본입니다.

 

 

 

 

 

일반적인 for 반복문은 많이 보셨을 것입니다.
list comprehension은 간단한 코딩을 위해 실행문을 for문 앞으로 가져오는 것입니다.

위의 그림을 보면 이해가 쉬우실 겁니다.
달라지는 점은 실행문이 앞으로 온다는 것, 그리고 대괄호로 감싸주는 것뿐입니다.

 

 

 

 

 

[len(i) for i in bible_data['verse']]
output:
[125,
 70,
 80,
 ...
 74,
 116,
 44]
좀 더 이해를 돕기 위해, i 에 len() 함수를 씌워보았습니다.
 이런 식으로 함수를 씌워주면, 모든 데이터가 len 함수를 거쳐서 나오게 됩니다.
이것이 바로 for문을 간단하게 코딩할 수 있는 list comprehension입니다.

 

 

 

 

 

 

 

5. 종합 연습 (Apply, Lambda, List comprehension 모두 사용)

 

 

 

지금까지 Apply, Lambda, List comprehension까지 모두 다루어보았습니다.
이제는 이 3가지 무기들을 조합해, 강력한 무기를 사용해볼 때입니다.

이번에는 각 절(verse) 마다 몇 개의 대문자가 있는지
출력해보는 상황을 가정하겠습니다.

코딩 논리 흐름은 다음과 같습니다.
apply로 문장에 접근 -> 문자 별로 쪼개고 대문자인 것을 True/False로 출력 -> np.sum

 

 

 

 

 

bible_data['verse'].apply(lambda x: [i for i in x]) # lambda x는 in 뒤에 들어갑니다.
bible_data['verse'].apply(lambda x: [i.isupper() for i in x]) # for앞이 실행문인것 기억
bible_data['verse'].apply(lambda x: np.sum([i.isupper() for i in x])) # np.sum 위치 주목
output:
0     3
1     3
2     1

...

27    2
28    2
29    1
Name: verse, dtype: int64
한 줄, 한 줄 실행해보시면 이해가 빠르실 것입니다.
output은 마지막 줄 결과만 담았습니다.

위와 같은 방식으로 얼마든지 여러 줄의 코딩을 간단하게 만들 수 있습니다.
모두 몸과 마음에 잘 익혀두어 고수의 길을 가시길 바랍니다!
오늘 포스팅은 여기까지 하겠습니다. 감사합니다.
반응형
블로그 이미지

pychan

딥러닝에 관련된 시행착오, 사소하지만 중요한 것들, 가능한 모든 여정을 담았습니다.

,

안녕하세요. 은공지능 공작소의 파이찬입니다.
오늘은 IMDb 영화리뷰 데이터로 워드클라우드를 그려보겠습니다.
데이터 전처리 과정은 아래 포스팅을 참조해주시길 바랍니다.
 

[Python/Jupyter] 자연어처리를 위한 IMDB 데이터 전처리 과정 (데이터 다운로드부터 라벨링까지!)

안녕하세요! 은공지능 공작소의 파이찬입니다. 오늘은 파이썬으로 IMDB 영화데이터를 다운받고 전처리해보겠습니다. 전처리 작업은 자연어 처리를 위한 라벨링까지 진행합니다. https://www.imdb.com/ Ratings an..

chan-lab.tistory.com

 

 

 

 

 

 

 

 

 

 

 

 

1. 필요한 라이브러리 불러오기

 

 

 

from wordcloud import WordCloud, STOPWORDS
import matplotlib.pyplot as plt
%matplotlib inline # matplotlib가 주피터노트북에 표시되도록 설정
필요한 라이브러리는 총 3가지 입니다.
wordcloud, stopwords, matplotlib를 사용하겠습니다.

wordcloud는 워드클라우드 객체를 생성해주는 라이브러리이고,
stopwords는 일종의 불용어 집합 사전입니다.
불용어란 인터넷 검색시 잘 사용하지 않는 단어라고 합니다. 즉, 별 의미없는 단어라는 것입니다.
조사, 관사, 전치사, 접속사 등이 불용어에 해당됩니다. 이를 stopword 라고 부릅니다.

matplotlib는 파이썬언어로 그래프를 그려줄 수 있는 라이브러리 입니다.
워드클라우드 말고도 기본적인 선그래프, 박스플롯 등도
모두 이 matplotlib 라이브러리를 사용해서 그릴 수 있습니다.

 

 

 

 

 

 

 

2. 워드클라우드 데이터 살펴보기

 

 

 

워드 클라우드를 그릴 Train_data 입니다. (지난 포스팅에서 만들어 둔 것입니다.)
긍정리뷰와 부정리뷰를 모두 포함하고 있고, 총 25,000개의 행을 가지고 있습니다.

 

 

 

 

 

 

 

3. join 함수 이해하기

 

 

 

O Captain! my Captain! our fearful trip is done.
The ship has weather'd every rack, the prize we sought is won.

오 선장님! 나의 선장님! 우리의 두려운 여정은 끝났고,
배는 그 어떠한 비바람도 견뎠으며, 우리가 얻고자 한 상품을 쟁취했습니다.

- 월트 휘트먼의 소설 『풀잎』 中 -
join 함수를 설명하기 위해서, 월트 휘트먼의 소설 『풀잎』에서 3 문장을 가져왔습니다.
죽은시인의 사회라는 영화에서도 등장하는 꽤 유명한 문장이죠.

이제 이 3문장을 가지고 판다스 데이터 프레임을 만들어보도록 하겠습니다.

 

 

 

 

 

a = 'O Captain! my Captain!'
b = 'our fearful trip is done.'
c = "The ship has weather'd every rack, the prize we sought is won"

test_data = {}
test_data['sentence'] = []

test_data['sentence'].append(a)
test_data['sentence'].append(b)
test_data['sentence'].append(c)

test_data = pd.DataFrame.from_dict(test_data)
test_data
output:
                                            sentence
0                             O Captain! my Captain!
1                          our fearful trip is done.
2  The ship has weather'd every rack, the prize w...
위와 같이 코드를 짜주면, 3문장이 담긴 데이터프레임이 하나 만들어 집니다.
이제 이것들을 join 함수를 이용해서 하나로 통합해주겠습니다.

 

 

 

 

 

' '.join(test_data['sentence'])
output:
"O Captain! my Captain! our fearful trip is done. The ship has weather'd every rack, 
the prize we sought is won"
공백(' ')에 조인함수를 붙이면, 위와 같은 결과물을 얻을 수 있습니다.
이 공백의 의미는 구분자를 공백으로 해주겠다는 뜻 입니다.
이해를 돕기 위해 아래와 같이 % 문자열에 join을 적용해 보겠습니다.

 

 

 

 

 

'%'.join(test_data['sentence'])
output:
"O Captain! my Captain!%our fearful trip is done.%The ship has weather'd every rack,
the prize we sought is won"
문장 중간중간에 %가 들어간 것이 보이시나요?
이런 식으로 구분자와 join 함수를 통해, 문장들을 하나로 통합할 수 있습니다.

이해를 돕기 위해 %를 사용한 것 이니,
다음 코드부터는 정상적으로 공백 구분자로 진행하겠습니다.

 

 

 

 

 

 

 

4. 워드클라우드 그리기

 

 

 

wordcloud = WordCloud(stopwords = STOPWORDS,
                      background_color = 'black', #배경색
                      width = 800,
                      height = 600).generate(' '.join(train_data['txt']))
                      
plt.figure(figsize = (15, 10)) # (가로인치, 세로인치)
plt.axis("off") # 축눈금 제거
plt.imshow(wordcloud) # 이미지가 표시되도록
plt.show() # 최종 출력문
위와 같이 입력해하여,
워드 클라우드 객체 생성 후 워드 클라우드를 그려줍니다.

stopwords불용어처리를 해주는 옵션이고, 아래에서 더 자세히 다루겠습니다.
background_color배경색을 지정해주는 옵션입니다.
width, height는 각각 워드클라우드의 가로길이, 세로길이를 나타내고 단위는 픽셀입니다.

.generate()를 통해 워드클라우드 객체에 데이터를 넣을 수 있습니다.
괄호 안에는 공백과 join 함수로 만든 통합문이 들어가게 됩니다.
(위에서 자세히 설명 드렸습니다.)

plt라고 되어 있는 부분들은 모두 워드클라우드를 그려주기 위한 부분입니다.
설명은 코드주석으로 대신하겠습니다.

 

 

 

 

 

생성된 워드클라우드의 모습입니다.
아직 다듬어야 할 부분이 많지만, 그래도 아름답죠? ㅎㅎ

 

 

 

 

 

 

 

+ Stopwords 자세히 알아보기

 

 

 

stopwords = set(STOPWORDS)
stopwords
output:
{'a',
 'about',
 'above',
 ...
 'yours',
 'yourself',
 'yourselves'}
stopwords는 앞에서도 말씀드렸다시피, 불용어를 의미합니다.
불용어는 검색어로 잘 쓰이지 않는 단어를 뜻합니다. 즉, 쓸데없어서 삭제해야 하는 단어이지요.

위의 결과에서도 확인하실 수 있듯이, 별로 큰 의미를 갖지 못하는 단어들이 나열되어 있습니다.
여기에는 전치사, 관사, 관계대명사, 지시대명사 등이 포함이 됩니다.

WordCloud 객체에서는 Stopwords 옵션이 있는데,
stopwords = STOPWORDS 라고 해주면 자동으로 불용어를 제거한 후 출력을 해줍니다.

 

 

 

 

 

네 이렇게 해서 오늘은 기본적인 워드클라우드 그리는 법에 대해 알아보았습니다.
다음 시간에는 html 태그제거와 stopwords 업데이트 방법 등에 대해 알아보겠습니다.

위의 워드클라우드를 보면 br이라고 되어 있는 것들이 유독 눈에 많이 들어옵니다.
이는 html의 <br> 태그인데요, 키보드의 엔터키처럼 줄을 바꿔주는 기능을 합니다.
이런 단어들은 제거를 해주는 것이 당연하겠지요?
또한 불용어 사전을 업데이트하는 방법도 다음 포스팅에서 다루어볼 생각입니다.

오늘 포스팅은 여기까지 하겠습니다.
감사합니다.

 

반응형
블로그 이미지

pychan

딥러닝에 관련된 시행착오, 사소하지만 중요한 것들, 가능한 모든 여정을 담았습니다.

,

안녕하세요! 은공지능 공작소의 파이찬입니다.
오늘은 파이썬으로 IMDB 영화데이터를 다운받고 전처리해보겠습니다.
전처리 작업은 자연어 처리를 위한 라벨링까지 진행합니다.

 

 

 

 

 

https://www.imdb.com/

 

Ratings and Reviews for New Movies and TV Shows - IMDb

IMDb is the world's most popular and authoritative source for movie, TV and celebrity content. Find ratings and reviews for the newest movie and TV shows.

www.imdb.com

위의 사이트가 바로 IMDb 영화 리뷰 사이트입니다.
시간 되시는 분들은 접속하셔서 쓱~ 한번 둘러보시는 것도 좋습니다.
저희는 웹크롤링을 하면 좋겠지만... 스탠퍼드 대학교에서 데이터를 모아 둔 것이 있으므로,
이 데이터를 다운받아서 바로 사용하도록 하겠습니다 ^^

 

 

 

 

 

 

 

 

 

 

1. 데이터 다운받기

 

 

import os, re
import pandas as pd
import tensorflow as tf
from tensorflow.keras import utils

dataset = tf.keras.utils.get_file(
    fname='imdb.tar.gz', # 다운받은 압축파일의 이름
    origin = "http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz", # 링크주소
    extract = True) # 압축 해제 여부
우선 import 명령어를 사용해서 필요한 모듈을 다운받아 줍니다.
데이터셋을 다운받는 방법은 위와 같습니다.
자세한 설명은 코드 주석으로 대체하겠습니다.

Keras의 utils 함수는 웹 상의 데이터를 쉽게 다운로드 할 수 있도록 지원해줍니다.
링크 주소는 오타가 나기 쉬우니, 제 코드 복붙하시길 바랍니다.
(오른쪽 클릭하시고 복붙해가세요~! 오른쪽마우스 클릭방지 안 걸어 놨습니다 ㅎㅎ)

 

 

 

 

 

basic_dir = os.path.dirname(dataset)
print(basic_dir)
output:
C:\Users\white\.keras\datasets
이제 데이터를 다운받았으니, 데이터가 어느 경로에 있는지 확인이 필요합니다.
os.path.dirname 함수를 사용하면, 데이터의 경로를 확인할 수 있습니다.
한 번 직접 윈도우 탐색기를 통해서 폴더 구조를 살펴봅시다.

 

 

 

 

 

경로를 따라 직접 폴더에 들어가보시면, 위의 화면같은 창이 뜰 것입니다.
크게는 Train data와 Test data로 나뉘어져 있고,
그 안에는 Positive 리뷰와 negative 리뷰가 있습니다.
각각의 앞글자를 따서 폴더 이름은 pos, neg라고 되어 있을 것입니다.

 

 

 

 

 

test 폴더의 neg 폴더까지 들어가보았습니다. 여기서 txt 파일을 하나 열어봅시다.
저런 식으로 한 텍스트 파일 안에는 리뷰가 여러 문장으로 존재합니다.
그러니 코딩을 할 때, 크게 4 종류의 파일에 접근을 해야 하는 것입니다.
(train_pos, train_neg, test_pos, test_neg)

이러한 구조를 기억하면서 다음으로 넘어가겠습니다.

 

 

 

 

 

 

 

2. txt 파일을 가져와 데이터 담기

 

 

 

변수 리스트:
basic_dir = 'C:\Users\white\.keras\datasets'
os.path.join(basic_dir, 'aclImdb')
output:
'C:\\Users\\white\\.keras\\datasets\\aclImdb'
basic_dir 변수에는 dataset 폴더까지의 경로가 담겨 있습니다.
만일 여기서 한단계 하위 폴더에 접근하고 싶다면, os.path.join 함수를 쓰시면 됩니다.

os.path.join(basic_dir, 'aclImdb') 이라고 입력하시면,
그 데이터셋보다 한 단계 아래인 폴더에까지 접근이 가능합니다.
이렇게 os.path.join 함수는 디렉터리 경로를 조인해주는 역할을 합니다.

 

 

 

 

 

path_train_pos = os.path.join(basic_dir, 'aclImdb', 'train', 'pos')
path_train_pos
output:
'C:\\Users\\white\\.keras\\datasets\\aclImdb\\train\\pos'
이제 위와 같이 써주면, 텍스트파일이 있는 경로까지 접근이 가능합니다.
이 경로를 path_train_pos에 저장하도록 하겠습니다.

그렇다면 이제 각각의 텍스트 파일에 접근해야 하는 과제가 남았습니다.
이럴 때 사용하기 딱 좋은 함수가 하나 있습니다.

 

 

 

 

 

os.listdir(path_train_pos)
output:
['0_9.txt',
 '10000_8.txt',
 ...]
바로 os.listdir 함수입니다.
이 함수는 인자 경로에 있는 파일들을 리스트에 담아서 출력을 해줍니다.
그렇지 않으면 일일이 12,500개의 txt 파일을 손코딩 해야 할 수밖에요..

 

 

 

 

 

for i in os.listdir(path_train_pos):
    path = os.path.join(path_train_pos, i)
    print(path)
output:
C:\Users\white\.keras\datasets\aclImdb\train\pos\0_9.txt
C:\Users\white\.keras\datasets\aclImdb\train\pos\10000_8.txt
C:\Users\white\.keras\datasets\aclImdb\train\pos\10001_10.txt
...
이제 for 반복문으로 각각의 텍스트 파일의 경로들을 만들어 줍니다.
위와 같이 os.path.join을 쓰면, path_train_pos 경로의 모든 txt 파일경로를 출력할 수 있습니다.

 

 

 

 

 

for i in os.listdir(path_train_pos):
    path = os.path.join(path_train_pos, i)
#     print(path)
    rst = open(path, "r", encoding="UTF-8").read()
    print(rst+ '\n\n')
이제 각각의 txt 파일에 접근했으니, 해당 파일들을 읽어보는 작업을 해보겠습니다.
파일 읽는 법은 open().read()를 써주면 됩니다.

open 함수 안에는 ① 경로명, ② 모드, ③ 인코딩이 인자로 들어갑니다.
저는 open(path, "r", encoding = 'UTF-8') 이라고 했습니다.

코드의 의미는, ①경로명은 path 변수에 담긴 것으로 하겠다.
② 모드는 "r" 즉, reading 모드를 적용하겠다. (그밖에 w, a 모드가 있습니다.)
③ 인코딩은 UTF-8을 적용하겠다. 정도로 봐주시면 됩니다.

특히 인코딩 부분을 명시하지 않을 경우, 오류가 발생할 수 있으니
이 점 유의해주시길 바랍니다.

 

 

 

 

 

출력 결과는 위와 같습니다. print 문에 '\n\n'을 넣어서, 각각의 txt 파일을 구분했습니다.
출력 결과를 보시면 중간에 2칸의 공백줄이 추가된 것을 보실 수 있습니다.
이제 이러한 rst 결과물들을 딕셔너리에 담아보는 작업을 해보겠습니다.

 

 

 

 

 

 

# 먼저 데이터라는 딕셔너리를 하나 생성해줍니다.
data = {}

# 그리고 그 안에, txt라는 키를 가진 리스트를 하나 만들어 줄게요.
data['txt'] = []

for i in os.listdir(path_train_pos):
    path = os.path.join(path_train_pos, i)
    rst = open(path, "r", encoding="UTF-8").read()
    data['txt'].append(rst)
    # list.append()는 리스트에 데이터를 계속 추가해줍니다.
먼저 data라는 딕셔너리를 하나 만들어주고,
그 안에 'txt'라는 키를 가진 리스트를 생성해 줍니다.

그리고 for 반복문에서 계속 해당 리스트에
rst 결과물을 추가(append)해주는 구조입니다.

이런 식으로 train/pos 경로의 모든 텍스트 파일들을
data['txt']라는 리스트에 추가할 수 있습니다.

하지만 지금 작업은 train의 pos 폴더 내용물에만 해당되는 것입니다.
아직 train_neg, test_pos, test_neg 폴더의 작업이 남아 있습니다 ㅜㅜ
3번의 작업을 반복해야 하니, 이 쯤에서 함수를 하나 만들어 주는 것이 좋을 듯 합니다.

 

 

 

 

 

def make_dict(dir):
    data = {}
    data['txt'] = []

    for i in os.listdir(dir):
        path = os.path.join(dir, i)
        rst = open(path, "r", encoding="UTF-8").read()
        data['txt'].append(rst)
        
    return pd.DataFrame.from_dict(data)
위와 같이 dir를 인자로 받는 함수를 하나 만들어 줬습니다.
리턴값은 판다스 데이터 프레임으로 지정해줬습니다.
이제 이 함수를 이용해 4개 경로의 데이터를 담아보도록 하겠습니다.

 

 

 

 

 

train_pos = make_dict(os.path.join(basic_dir, 'aclImdb', 'train', 'pos'))
train_neg = make_dict(os.path.join(basic_dir, 'aclImdb', 'train', 'neg'))
test_pos = make_dict(os.path.join(basic_dir, 'aclImdb', 'test', 'pos'))
test_neg = make_dict(os.path.join(basic_dir, 'aclImdb', 'test', 'neg'))
이렇게 4개 변수에 만들어 준 함수를 적용하면, 각각 경로의 데이터를 모두 담을 수 있습니다.
이제 이 4개 데이터에 라벨링을 해주고, 
데이터를 통합해주는 일만 남았습니다.

 

 

 

 

 

 

 

3. 데이터 라벨링하고 통합해주기

 

 

 

train_pos['label'] = 1
train_neg['label'] = 0
test_pos['label'] = 1
test_neg['label'] = 0
라벨링을 해주는 코드입니다.
긍정적인 리뷰 데이터는 1 이라는 라벨을 달아주고,
부정적인 리뷰 데이터는 0 이라는 라벨을 달았습니다.

라벨링은 위와 같이 컴퓨터가 이해하기 쉽도록, 꼬리표(label)를 달아주는 작업입니다.
주로 머신러닝의 지도학습에 사용할 용도로 라벨링을 해줍니다.

 

 

 

 

 

train_data = pd.concat([train_pos, train_neg])
test_data = pd.concat([test_pos, test_neg])
마지막으로 데이터를 통합해줍니다.
pd.concat 함수를 사용했습니다.

pd.concat은 데이터를 세로로 통합해주는 역할을 합니다.
행과 열이 있는 데이터에서, 열은 고정해두고 행을 통합한다는 의미입니다.

 

 

 

 

 

test_data를 출력해본 모습입니다.
1 라벨과 0 라벨이 모두 잘 달린 25,000개의 데이터를 확인하실 수 있습니다.

네 이렇게 오늘은 IMDb 영화데이터를 전처리하고 라벨링하는 작업까지 해보았습니다.
쓰고나니 너무 장황하게 설명해놓은 감이 있네요 ㅜㅜ
원래 제가 좀 TMI 기질이 다분히 있어서.. ㅋㅋ 모쪼록 긴 글 읽어주셔서 감사합니다.

 

 

반응형
블로그 이미지

pychan

딥러닝에 관련된 시행착오, 사소하지만 중요한 것들, 가능한 모든 여정을 담았습니다.

,

 

안녕하세요. 은공지능 공작소의 파이찬입니다.
오늘은 아나콘다 프롬프트창에서 Kaggle API 설치부터
데이터 다운로드하는 방법까지 알아보도록 하겠습니다.

 

 

 

 

 

 

 

 

 

 

 

 

1. Kaggle API 설치

 

 

 

conda install -c conda-forge kaggle
conda install kaggle
위의 명령어들을 입력하여 kaggle을 설치해 줍니다.

여담이지만, 먼저 conda install kaggle 명령어를 치니까 안되더라고요.. ㅜㅜ
구글링해서 알아보니 conda install -c conda-forge kaggle 명령어를 쓰라고 합니다.
그럼에도 불구하고 두 명령어 다 해준 것은 노파심 때문에 그렇습니다.. ㅎㅎ

네 아무튼, 다 설치가 되셨으면 이제 kaggle 홈페이지에서
사용자 토큰을 생성해주어야 합니다.

 

 

 

 

 

 

 

2. kaggle 사용자 토큰 생성하기

 

 

 

https://www.kaggle.com/

 

Kaggle: Your Home for Data Science

 

www.kaggle.com

kaggle 홈페이지에 접속하셔서, 가입을 먼저 해주셔야 합니다.
가입 절차는 그렇게 엄청 복잡하지는 않습니다.
구글 아이디만 있으면 자동으로 연동이 되는 것으로 알고 있습니다.

 

 

 

 

 

계정을 생성하셨다면, 우측 상단에 있는 계정 프로필을 클릭하시고
My Account로 들어가 줍니다.

 

 

 

 

 

My Account에 들어가셨다면,
쭉 스크롤을 내리셔서 Create New API Token 버튼을 누릅니다.
그러면 kaggle.json이라는 파일이 하나 다운받아질 것입니다.

 

 

 

 

 

다시 아나콘다 프롬프트로 돌아옵니다.
명령어에 kaggle이라고 쳐서 아무 명령어나 날려줍니다.
이렇게 쓸데없이 명령어를 날려주는 이유는 .kaggle이라는 폴더를 생성하기 위해서입니다.

이 .kaggle이라는 폴더는 사용자가 억지로 만들 수 있는 것이 아니고
이런 식으로 명령어를 통해서 시스템이 만들어 주는 폴더입니다.
저런 식으로 한 번 명령어를 날려줘야 디렉터리 인식을 하는 모양입니다.

 

 

 

 

이제 아까 받아두었던 kaggle.json 파일을 .kaggle 안에 옮겨줍니다.
이렇게 하여 kaggle 사용자 토큰 설정이 끝났습니다.

 

 

 

 

 

kaggle competitions list
간단한 테스트를 해보겠습니다.
다시 아나콘다 프롬프트도 돌아와서 위의 명령어를 입력해줍니다.
해당 명령어는, 캐글에서 진행되고 있는 경진대회 목록을 보여주는 명령어입니다.

 

 

 

 

 

명령어가 잘 수행되었고, 테스트가 성공적으로 끝났습니다.

 

 

 

 

 

 

 

3. kaggle API로 데이터 다운로드하기

 

 

 

kaggle datasets 텝에는 실습에 사용할 수 있는 좋은 데이터들이 많이 있습니다.
이 데이터들은 홈페이지를 통해서 직접 다운받아도 되지만,
Kaggle API를 통해서 다운로드할 시 더 편리한 이용이 가능합니다.

 

 

 

 

 

kaggle datasets list
먼저 위의 명령어를 입력해서 다운받을 수 있는 데이터들의 리스트를 확인합니다.

 

 

 

 

kaggle datasets download <데이터명> -p <"경로">
리스트들을 확인하시고,
다운로드하고 싶은 데이터명을 그래그한 뒤 마우스 우클릭으로 복사합니다.
위의 명령어를 입력하시면 데이터를 쉽게 받을 수 있습니다.

만약 다운로드 경로를 바꾸고 싶으시다면,
위의 명령어처럼 -p 뒤에 자신이 원하는 경로를 입력하면
해당 폴더 안으로 다운로드를 할 수 있습니다.

 

 

 

 

 

만일 홈페이지에서 본 데이터를 kaggle API로 다운받고 싶다면,
위의 그림처럼 ··· 버튼을 클릭 후 Copy API Command를 눌러줍니다.
해당 명령어를 복사하고 그대로 아나콘다 프롬프트 창에 입력하면 데이터 다운로드가 됩니다.

 

 

 

 

 

홈페이지에서 커맨드를 복사해도 잘 다운로드가 된 모습입니다.

네 오늘 포스팅은 여기까지 하겠습니다.
도움이 되셨다면 왼쪽 하단에 하트 버튼 꾹 부탁드립니다!
감사합니다.
반응형
블로그 이미지

pychan

딥러닝에 관련된 시행착오, 사소하지만 중요한 것들, 가능한 모든 여정을 담았습니다.

,

안녕하세요. 은공지능 공작소의 파이찬입니다.
오늘은 Permission 에러 없는 Spacy 라이브러리 설치법에 대해 알아보겠습니다.
Spacy는 자연어처리를 위한 라이브러리인데,
Permission 에러 때문에 설치에 애를 먹었던 경험이 있습니다.
그래서 이러한 문제에 대한 해결법을 포스팅으로 작성해보게 되었습니다.

 

 

 

 

 

 

 

 

 

 

 

 

1. Conda를 이용한 Spacy 설치

 

 

conda activate <가상환경이름>
conda install spacy
아나콘다 프롬프트를 실행한 뒤,
conda activate 명령어를 이용하여 원하는 가상환경을 켜줍니다.

그런 다음, conda install spacy 명령어를 입력하여
Spacy 라이브러리를 설치 해줍니다.
설치는 비교적 간단하게 끝납니다. (다음이 중요합니다)

 

 

 

 

 

 

2. 아나콘다 프롬프트 관리자 권한으로 재시작

 

 

 

아나콘다를 종료하시고 오른쪽 마우스를 클릭하여
관리자 권한으로 다시 실행시켜 줍니다.

관리자 권한으로 실행하지 않고 계속 진행한다면,
위의 그림과 같은 에러 화면이 뜨게 됩니다...
(여러분들은 저 같은 실수를 반복하지 마세요... ㅜㅜ)

 

 

 

 

 

conda activate <가상환경이름>
python -m spacy download en
관리자 권한으로 실행시키셨다면, 위의 명령어를 입력하여
Spacy의 en 모델을 다운로드 해줍니다.
(**en은 english의 줄임말입니다.)

 

 

 

 

 

정상적으로 모델을 다운받았다면, 위와 같은 화면이 뜨게 됩니다.

 

 

 

 

 

 

3. 간단한 테스트

 

 

 

Be extremely subtle, even to the point of formlessness. 
Be extremely mysterious, even to the point of soundlessness. 
Thereby you can be the director of the opponent's fate.


미묘하고도 미묘하여 보이지 않는 경지에 이르며, 
신비하고도 신비하여 소리가 없는 경지에 이른다. 
그러므로 능히 적의 생사를 맡아 다스리게 되는 것이다.
- 손자병법 -
제가 좋아하는 손자병법의 구절 중 하나입니다.
지금부터 이를 단어별로 Tokenizing(쪼개기)하는 테스트를 해보겠습니다.

 

 

 

 

 

import spacy

a = spacy.load('en') # 잉글리시 버전의 패키지를 불러온다.
sentence = "Be extremely subtle, even to the point of formlessness. Be extremely mysterious, even to the point of soundlessness. Thereby you can be the director of the opponent's fate."

doc = a(sentence)

word_tokenized_sentence = [token.text for token in doc]

print(word_tokenized_sentence)
output:
['Be', 'extremely', 'subtle', ',', 'even', 'to', 'the', 'point', 'of', 'formlessness', '.', 'Be', 'extremely', 'mysterious', ',', 'even', 'to', 'the', 'point', 'of', 'soundlessness', '.', 'Thereby', 'you', 'can', 'be', 'the', 'director', 'of', 'the', 'opponent', "'s", 'fate', '.']
단어별로 토크나이징(쪼개기)가 잘 된 것을 보실 수 있습니다. #테스트 성공적

네 이렇게 오늘은 Anaconda python에서 spacy 라이브러리 설치와
간단한 토크나이징 테스트까지 해보았습니다.

기회가 된다면 다음에 자연어처리 관련된 포스팅도 작성해보도록 하겠습니다.
지금까지 긴 글 읽어주셔서 감사합니다.

 

반응형
블로그 이미지

pychan

딥러닝에 관련된 시행착오, 사소하지만 중요한 것들, 가능한 모든 여정을 담았습니다.

,

 

안녕하세요! 은공지능 공작소의 파이찬입니다.
오늘은 Python과 함께 사용하는 JAVA의 올바른 설치법
Konlpy 라이브러리 사용 중 나타나는 JvmNotFoundException 에러
해결법에 대해 알아보겠습니다.

 

 

 

 

 

 

 

 

 

 

 

 

1. 문제상황

 

 

 

위의 그림처럼 JvmNotFoundException 에러가 뜨는 상황입니다.
그래서 Konlpy 라이브러리 사용 중 okt 객체 생성이 안되어 문제가 발생했습니다.

원인은 2가지 정도로 추정됩니다.
1. 잘못된 용도 또는 버전의 자바가 설치되어 있을 수 있습니다.
2. 자바 환경변수 설정이 제대로 안 되어 있을 수 있습니다.

저 같은 경우, 1번 원인에 해당하는 문제였습니다.
그래서 환경변수 설정을 해줘도 계속 같은 에러가 발생되었구요.
그래서 자바 설치부터 제대로 다시 해줘야 했습니다.

 

 

 

 

 

 

2. 자바 설치

 

 

 

https://www.oracle.com/technetwork/java/javase/downloads/index.html

 

Java SE - Downloads | Oracle Technology Network | Oracle

Which Java package do I need? Software Developers: JDK (Java SE Development Kit). For Java Developers. Includes a complete JRE plus tools for developing, debugging, and monitoring Java applications. Administrators running applications on a server:  Server

www.oracle.com

위의 사이트에 들어가서 최신 버전의 자바를 받습니다.
지금 19년 07월 27일 기준으로 Java SE 12.0.2가 최신 버전이었습니다.
현재 포스팅은 이 버전으로 작성된 점 참고해 주시면 됩니다.

 

 

 

 

 

라이센스 동의 부분에 체크 후 진행해 주세요.

 

 

 

 

 

파일 경로명을 한 번 체크 해주시길 바랍니다.
파일 경로는 C드라이브의 Program Files로 설정되어야 합니다.
절대 Program Files (x86) 으로 설정이 되면 안됩니다.
이 점 유의해주시면서 진행하시면 설치는 금방 끝납니다.

 

 

 

 

 

 

 

3. 자바 환경변수 설정

 

 

검색창을 열고 '시스템 환경 변수 편집'에 들어갑니다.

 

 

 

 

 

환경변수 버튼을 눌러 들어갑니다.

 

 

 

 

 

새로 만들기 버튼을 눌러 새로운 시스템 변수를 추가해줍니다.

 

 

 

 

 


변수 이름: JAVA_HOME
변수값: C:\Program Files\Java\jdk-12.0.2\bin


위와 같이 설정을 해주시길 바랍니다.
반드시 해당 경로의 bin 폴더 안에 jvm.dll 이라는 파일이 존재하는지
확인 후 진행하시길 바랍니다.

또한 Program File (x86)이 아니라 반드시 Program File으로
경로를 지정해줘야 합니다. 그렇지 않으면 제대로 설치가 되더라도
파이썬의 konlpy 라이브러리에서 자바를 제대로 찾을 수 없게 됩니다.

위의 주의 사항들을 확인하시고,
확인 버튼들을 눌러 변경된 내용들을 저장해 주면
자바 환경변수 설정이 완료가 된 것입니다.

 

 

 

 

 

 

 

4. 마무리

 

 

 

커널을 재시작 후, 다시 실행을 해보면
JvmNotFoundException 에러가 사라진 것을 확인할 수 있습니다.

음.. 약간의 경고가 뜨긴 하지만 동작은 잘 됩니다 ^^;
나중에 기회가 되면 저 거슬리는 분홍 박스를 없애는 방법에 대해서도 포스팅 해보겠습니다.

도움이 되셨으면 좋겠습니다.
지금까지 은공지능 공작소의 파이찬이었습니다. 감사합니다.

 

반응형
블로그 이미지

pychan

딥러닝에 관련된 시행착오, 사소하지만 중요한 것들, 가능한 모든 여정을 담았습니다.

,