티스토리 뷰
본 포스팅은 『텐서플로2와 머신러닝으로 시작하는 자연어처리』를 참고하여 만들어졌습니다.
https://wikibook.co.kr/nlp-tf2/
자연어 처리 문제에 도움을 줄 수 있는 파이썬 라이브러리를 소개하겠다. 계산을 위한 numpy, 데이터 분석을 위한 pandas, 시각화 도구인 matplotlib, 정규표현식을 사용하기 위한 Re, 그리고 HTML을 다루기 위한 Beautiful Soup까지 총 5가지 라이브버리에 대해 알아보자.
1. 넘파이 numpy
넘파이(numpy)는 빠르고 효율적인 계산을 위해 만들어진 파이썬 라이브러리이다. 넘파이는 고성능의 다차원 배결 객체와 이러한 배열을 계산할 효율적인 도구를 제공한다. 넘파이의 핵심은 ndarray 객체이다. 이 객체는 동일한 자료형을 가지는 n 차원의 배열로 이 객체를 화용하면 파이썬에 내장된 배열을 사용하는 것보다 더 적은 코드로 연산이 가능하고 더 빠르게 결과를 얻을 수 있다.
1) 넘파이 배열
넘파이 배열은 앞서 말한 ndarray 객체 형태이다. 이 객체는 동일한 자료형을 가지는 값들이 행렬 형태로 구성돼 있다. 각 값은 음이 아닌 정수 값으로 색인되고, 객체의 차원은 axis(축)이라 불린다.
(1) ndarray 객체의 속성
- ndarray.ndim : 배열의 축(차원)의 수를 반환한다.
- ndarray.shape : 배열의 형태를 반환한다.
- ndarray.size : 배열 내 원소의 총 개수를 반환한다.
- ndarray.dtypr : 배열 내 원소들의 자료형을 반환한다.
import numpy as np
a = np.array([[1,2,3],[1,5,9],[3,5,7]])
print(a.ndim) # 2
print(a.shape) # (3,3)
print(a.size) # 9
print(a.dtype) # dtype(int32)
(2) ndarray 객체의 생성
위 예제에서는 배열을 만들 때 직접 리스트를 중첩해서 만들었지만 배열을 생성할 때는 다음과 같은 다양하 방법을 활용할 수 있다.
- numpy.zeros : 모든 배열의 원소가 0인 배열을 생성한다.
- numpy.ones : 모든 배열의 원소가 1인 배열을 생성한다.
- numpy.empty : 배열의 크기만 정해주고 원소는 초기화하지 않은 배열을 생성한다. 원소에는 매우 크거나 작은 값이 들어간다.
- numpy.arrange : 파이썬의 range 함수와 유사한 형태로 배열을 생성할 수 있다. 배열의 원소들이 수열을 구성한다.
- numpy.full : 배열의 모든 값이 하나의 상수인 배열을 생성한다.
- numpy.eye : 지정한 크기의 단위행렬을 생성한다.
- numpy.random.random : 배열의 원소를 임의의 값으로 생성한다. 값은 0부터 1사이의 값으로 지정된다.
import numpy as np
a = np.zeros((2,3)) #모든 원소가 0인 (2,3) 배열을 생성한다.
print(a)
b = np.ones((2,1)) #모든 원소가 1인 (2,1) 배열을 생성한다.
print(b)
c= np.empty((2,2)) # 원소값을 초기화하지 않은 (2,2) 배열을 생성한다.
print(c)
d = np.arrange(10,30,5) #10부터 30이전까지 5 단위로 배열 생성
print(d) #array([10,15,20,25])
e = np.full((2,2),4) #모든 원소가 4인 (2,2)배열 생성
print(e)
f=np.eye(3) #3x3 크기의 단위행렬 생성
print(f)
g=np.ramdom.random((2,2)) # [0~1) 범위의 임의의 값을 가진 배열 생성
print(g)
2) 넘파이 기본 연산
넘파이는 배열끼리 연산할 때 빠르고 사용하기 쉬운 여러 연산 함수를 제공한다. 넘파이에서 제공하는 기본 배열 연산에 대해 알아보자.
넘파이는 배열의 기본적인 사칙 연산을 모두 지원한다, 주의하 점은 벡터끼리의 곱셈과 내적을 구분해야 한다는 점이다. * 연산의 경우에는 벡터끼리 사용할 경우 원소별 곱셈을 의미한다. 벡터의 내적인 경우에는 dot함수를 사용해야 한다.
import numpy as np
a = np.array([1,2,3])
b = np.array([10,20,30])
print(a+b) # [11 22 33]
print(np.add(a,b)) # [11 22 33]
print(b-a) # [ 9 18 27]
print(np.subtract(b,a)) # [ 9 18 27]
print(a**2) #제곱연산 [1 4 9]
print( b < 15) # 비교연산 [ True False False ]
c = np.array([[1,2],
[3,4]])
d = np.array([[1,2],
[3,4]])
print(c*d) # 원소별 곱셈
# [[ 1 4]
# [ 9 16]]
print(np.dot(c,d)) #내적(dot product) 계산
print(c.dot(d)) #또 다른 내적 계산법
# [[ 7 10]
# [15 22]]
3) 넘파이 배열 인덱싱, 슬라이싱
넘파이 배열은 파이썬 리스트와 마찬가지로 인덱싱(indexing), 슬라이싱(slicing) 기능을 제공한다. 인덱싱이란 배열에서 특정 원소를 뽑아내는 것이며, 슬라이싱이란 배열에서 특정 구간의 값을 뽑아내는 것이다.
일차원 배열의 경우 인덱싱과 슬라이싱은 파이썬 리스트 인덱싱과 슬라이싱과 매우 비슷하다.
a = np.array([1, 2, 3, 4, 5, 6, 7])
print(a[3]) # 4
print(a[-1]) # 7
print(a[2:5]) # [3, 4, 5]
print(a[2:]) # [3, 4, 5, 6, 7]
print(a[:4]) # [1, 2, 3, 4]
다차원 배열의 경우 넘파이는 우용한 인덱싱과 슬라이싱 기능을 제공한다. 이 경우 인덱싱은 축(axis)을 기준으로 한다.
a= np.array([[1,2,3],
[4,5,6],
[7,8,9]])
print(a[1,2]) # 6
print(a[ : ,1]) #1열의 모든원소 [2, 5, 8]
print(a[-1]) # [7, 8, 9]
4) 넘파이를 이용한 배열 형태 변환
배열을 사용하다 보면 배열의 형태를 바꿔야 할 때가 자주 있다. 이때 넘파이는 배열의 형태를 쉽게 바꿀 수 있는 여러 함수를 제공한다.
- ndarray.ravel( ) : 배열을 1차원으로 만든다.
- ndarray.reshape( ) : 배열의 형태를 바꾼다.
- ndarray.T : 트랜스포즈된 배열을 만든다. 행렬의 트랜스포즈와 같다. (행과 열이 반전된다.)
a = np.array([[1,2,3,4],
[5,6,7,8],
[9,10,11,12]])
print(a.ravel()) # [ 1 2 3 4 5 6 7 8 9 10 11 12]
print(a.reshape(2,6))
# [[ 1 2 3 4 5 6]
# [ 7 8 9 10 11 12]]
print(a.T)
# [[ 1 5 9]
# [ 2 6 10]
# [ 3 7 11]
# [ 4 8 12]]
reshape의 경우 특정한 행, 열만 지정해도 나머지는 자동으로 맞출 수 있다.
print(a.reshape(3,-1))
# [[ 1 2 3 4]
# [ 5 6 7 8]
# [ 9 10 11 12]]
5) 넘파이 브로드캐스팅
배열의 경우 두 배열의 형태가 같아야만 사용할 수 있는 연산이 많다. 하지만 넘파이는 브로드캐스팅이라는 기능을 통해 다른 형태의 배열끼리도 연산이 가능하게 만들어 준다. 예를 들면, 작은 크기의 배열을 큰 크기의 배열에 더하고 싶을 때 반복문을 사용하지 않고도 더할 수 있다.
#브로드캐스팅을 이용하지 않았을 때, 반복문을 이용해서 크기가 다른 행렬의 덧셈을 해야한다.
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
b = np.array([1,0,1])
y = np.empty_like(a) # a와 크기가 같은 원소가 비어있는 배열 생성
for i in range(len(a)):
y[i,:] = a[i,:] + b
print(y)
# [[ 2 2 4]
# [ 5 5 7]
# [ 8 8 10]]
위와 같은 방식으로 각 행에 배열을 더할 수 있지만 배열이 커질수록 위와 같은 반복문은 매우 느려질 수 있다. 이러한 경우 브로드캐스팅을 이용하면 반복문 없이 매우 간단하게 계산할 수 있다.
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
b = np.array([1,0,1])
c = a + b # 브로드캐스팅을 이용한 덧셈
print(c)
# [[ 2 2 4]
# [ 5 5 7]
# [ 8 8 10]]
2. 판다스 Pandas
판다스(Pandas)란 데이터 과학을 위해 꼭 필요한 파이썬 라이브러리 중 하나다. 편리한 데이터 구조와 데이터 분석 기능을 제공하기 때문에 데티어를 다루기 위해서는 반드시 알아둬야 한다.
1) 판다스 데이터 구조
판다스는 다음의 세 가지 데이터 구조를 사용 할 수 있다.
- 시리즈(Series) : 배열과 같은 형태를 지님. (1차원)
- 데이터프레임(DataFrame) : 행렬과 같은 형태를 지님. (2차원)
- 패널(Panel) : DataFrame의 모음으로 3차원으로 형성됨.
세 가지 데이터 구조를 구분하는 가장 명확한 기준은 차원이다. Series 데이터 구조의 경우 1차원의 데이터 구조이고, DataFrame은 2차원, Panel은 3차원이다.
2) 판다스 데이터 생성
판다스를 이용해 데이터를 생성하는 방법을 알아보자. 시리즈, 데이터프레임을 생성하는 방법을 나눠서 알아보고 여기서는 패널 데이터를 생성하는 법은 생략한다. 패널에 대한 자세한 설명은 판다스 공식 문서에서 확인할 수 있다.
(1) 시리즈 생성
시리즈 데이터는 1차원 데이터다. 시리즈를 만드는 명령은 다음과 같다.
pandas.Series(data, index, dtype, copy)
data를 제외한 값들을 생략할 수 있다. 그렇다면 실제 시리즈를 만드는 여러 가지 예제를 살펴보자. 시리즈 데이터는 리스트를 직접 넣어서 만들 수도 있고 넘파이 배열을 이용해 생성할 수도 있다.
import numpy as np
import pandas as pd
a = pd.Series([1,3,5,7,10]) # 리스트를 이용한 시리즈 데이터 생성
print(a)
# 0 1
# 1 3
# 2 5
# 3 7
# 4 10
# dtype: int64
data = np.array(['a','b','c','d'])
b = pd.Series(data) # 넘파이 베열을 이용한 시리즈 데이터 생성
print(b)
# 0 a
# 1 b
# 2 c
# 3 d
# dtype: object
c = pd.Series(np.arange(10,30,5)) # [10, 15, 20, 25]
print(c)
# 0 10
# 1 15
# 2 20
# 3 25
# dtype: int64
시리즈 데이터는 기본적으로 순서대로 index가 존재하는데 이 값을 원하는 값으로 바꿔줄 수 있다. 파이썬의 딕셔너리를 활용해 시리즈를 생성하면 이 index 값은 딕셔너리의 키 값으로 지정된다.
a = pd.Series(['a','b','c'], index=[10,20,30]) #index가 10, 20, 30
print(a)
# 10 a
# 20 b
# 30 c
# dtype: object
dic = {'a':10, 'b':20, 'c':30}
b = pd.Series(dic) # index가 a, b, c
print(b)
# a 10
# b 20
# c 30
# dtype: int64
(2) 데이터프레임 생성
데이터프레임은 2차원 데이터다. 데이터프레임을 만드는 명령은 다음과 같다.
pandas.DataFrame(data, index, colums, dtype, copy)
데이터프레임도 시리즈를 생성할 때와 마찬가지로 data를 제외한 나머지 값은 생략 가능하다. 그리고 시리즈에 없던 colums 값이 생겼다. 이 값을 이용하면 각 열의 라벨을 지정할 수 있다.
a = pd.DataFrame([1, 3, 5, 7, 9]) # 리스트를 이용한 데이터프래임 생성
print(a)
# 0
# 0 1
# 1 3
# 2 5
# 3 7
# 4 9
dic = {'Name':['Cho','Kim','Lee'], 'Age':[28,31,38]}
b = pd.DataFrame(dic) #딕셔너리를 이용한 데이터프래임 생성
print(b)
# Name Age
# 0 Cho 28
# 1 Kim 31
# 2 Lee 38
c = pd.DataFrame([['apple',7000],['banana',5000],['orange',4000]]) # 중첩리스트를프래임 이용한 데이터프래임 생성
print(c)
# 0 1
# 0 apple 7000
# 1 banana 5000
# 2 orange 4000
데이터 프레임의 구조를 살펴보면 각 열의 상던에 인덱스가 지정돼 있는 모습을 볼 수 있다. 여기서 다음과 같이 인덱스 칼럼 인자값을 통해 지정해 줄 수 있다.
d = pd.DataFrame([['apple',7000],['banana',5000],['orange',4000]], columns=['name','price'])
print(d)
# name price
# 0 apple 7000
# 1 banana 5000
# 2 orange 4000
3) 판다스 데이터 불러오기 및 쓰기
앞에서 판다스의 시리즈와 데이터프레임을 만드는 법을 알아봤다. 하지만 슬제로 데이터를 다룰 때는 직접 작성하지 않고 데이터 파일을 읽어서 사용한다. 보통의 데이터셋은 .csv파일 형식으로 돼 있다. 판다스의 read_csv라는 함수를 이용하면 쉽고 간단하게 이러한 데이터 파일들을 읽어올 수 있다. 이 함수는 다음과 같은 형태로 사용할 수 있다.
pandas.read_csv('file_path')
4) 판다스 데이터 다루기
우리는 상황에 따라 필요한 열만 읽어 올 수도 있고, 특정 열을 더해 새로운 열을 만들거나 특정 열을 제거할 수 있다. 그 뿐만 아니라 필요 없는 행을 제거하는 것 또한 어렵지 않다.
data_frame = pd.read_csv('file_path')
print(data_frame['A']) # A열의 데이터만을 조회
print(data_frame['A'][1:5]) # A열의 데이터를 슬라이싱해서 조회
data_frame['C'] = data_frame['A'] + data_frame['B'] # A열과 B열을 더하여 새로운 C열을 생성
이러한 기본적인 데이터 확인 방법뿐 아니라 판다스는 데이터를 쉽게 이해할 수 있게 다양한 함수를 제공한다. describr() 함수를 사용하면 데이터에 대한 평균, 표준편차 등 다양한 수치 값을 얻을 수 있다.
data_frame.describe()
5) 판다스 데이터 시각화
데이터는 보통 판다스를 사용해서 다루기 때문에 반다스 데이터를 시각화하는 것이 중요하다. 판다스의 시리즈와 데이터프레임은 기본적으로 plot( ) 함수를 내장한다. 따라서 맷플롯립을 따로 불러오지 않고도 판다스의 plot( )함수를 사용할 수 있다. 사용법 또한 어렵지 않다.
data_frame = pd.read_csv('file path')
data_frame.plot( )
3. Matplotlib
데이터 혹은 결괏값들은 수치로 보는 것보다 그래프로 시각화된 자료를 보는 것이 훨씬 더 직관적으로 잘 이해될 때가 많다. 맷플롯립(matplotlib)은 데이터 분석 시 시각화를 위한 라이브러리이다. 맷플롯립을 이용하면 차트, 플롯 등 다양한 시각화 자료를 몇 줄의 코드만으로 쉽게 만들 수 있다.
1) Matplotlib.pyplot
파이플롯(pyplot)은 맷플롯립 안에 포함된 서브 모듈이다. 시각화를 위한 많은 함수가 있으며 실제로 사용할 때 파이 플롯을 활용하는 경우가 많다. 간단한 시각화의 경우에는 파이 플롯만 사용하더라도 충분하다. 해당 모듈은 다음 명령어로 불러온 후 사용 할 수 있다.
import matplotlib.pyplot as plt
(1) 기본적인 그래프 그리기
x = [1, 3, 5, 7, 9]
y = [100, 200, 300, 400, 500]
plt.plot(x,y)
(2) 코사인 함수 그리기
넘파이의 코사인 함수와 파이플롯을 이용하면 코사인 함수도 쉽게 그릴 수 있다. x 값들을 정의한 후 넘파이의 코사인 함수를 사용해 y리스트를 정의하면 된다.
x = np.linspace(-np.pi, np.pi, 128)
y = np.cos(x)
plt.plot(x,y)
4. Re
re는 파이썬 정규 표현식(Regular Expression) 라이브러리이다. re를 사용해 문자열을 쉽게 다룰 수 있기 때문에 문자열 데이터를 주로 다루는 자연어 처리 분야에서 많이 사용한다. 특히 전처리 과정에서 많이 사용하며, 특정 문자열을 제거하거나 검색 혹은 치환 등에 자주 사용된다. 정규 표현식을 작성할 때는 특별한 의미를 가진 문자나 기호를 사용하는데, 여기서는 그러한 문자나 기호를 먼저 알아본 후 라이브러리 함수에 대해 알아보겠다.
1) 파이썬 정규 표현식
앞에서 정규 표현식을 이용하면 특정 문자열을 찾거나 제거 혹은 치환할 수 있다고 했다. 그렇다면 정규 표현식에 사용하는 특별한 문자나 기호로 어떤 것이 있는지 알아보자.
. | 줄 바꿈을 제외한 모든 문자 |
^ | 문자열의 시작 |
$ | 문자열의 끝 |
* | 앞에 있는 문자가 0회 이상 반복된 문자열 |
+ | 앞에 있는 문자가 1회이상 반복된 문자열 |
{ m } | 앞 문자를 m회 반복하는 문자열 |
{ m , n } | 앞 문자를 m~n회 반복하는 문자열 |
? | 앞 문자가 나오거나 나오지 않은 문자열 {0,1}과 동일 |
\d | 숫자 |
\D | 숫자가 아닌 문자 |
\w | 문자 혹은 숫자 |
\W | 문자 혹은 숫자가 아닌 것 |
( ... ) | 괄호 안의 모든 정규 표현식을 만족하는 문자 |
[a, b, c] | a, b, c 중 한 개의 문자와 일치 |
2) re 함수
re 라이브러리 내 모든 함수를 다루기보다는 자연어 처리에 주로 사용되는 함수 위주로 알아보겠다.
import re
1. re.compile(pattern)
complie 함수는 특정 기호를 정규 표현식 객체로 만들어준다. re 라이브러리를 사용하려면 정규 표현식 패턴을 매번 작성해야 하는데, 이 함수를 사용해 패턴을 컴파일하면 필요할 때마다 사용할 수 있다.
2. re.search( pattern, string )
search 함수는 해당 문자열에서 정규 표현식에 해당하는 첫 부분을 찾는다.
3. re.split( pattern, string )
split 함수는 해당 문자열에서 특정 패턴으로 문자열을 나눠서 리스트로 만든다.
4. re.sub( pattern, repl, string )
sub 함수는 문자열에서 특정 패턴을 만족시키는 문자를 사용자가 정의한 문자(repl)로 치환한다.
5. Beautiful Soup
Beautiful Soup은 주로 웹 크롤링에 사용되는 라이브러리로서 HTML 문서 혹은 XML 문서에서 데이터를 불러오는데 사용된다. 자연어처리에서는 주로 HTML 태그를 제거하기 위해 사용한다.
자연어 처리에 사용되는 데이터 중에는 웹크롤링을 통해 모은 데이터가 많다. 보통 데이터는 어느 정도 정제돼 있기 때문에 바로 사용하면 되지만 간혹 일부 텍스트의 경우 HTML 태그가 그대로 남아있는 경우가 있다. 이때, Beautiful Soup을 이용하면 손쉽게 이러한 태그를 제거할 수 있다.
from bs4 import BeautifulSoup
str = '<p> p태그가 남아있는 str </p>'
str = BeautifulSoup(str,"html5lib").get_text() # HTML태그가 제거된 텍스트만 가져온다.
'인공지능, 자연어처리 > 텐서플로2와 머신러닝으로 시작하는 자연어처리' 카테고리의 다른 글
3장 자연어 처리 개요(2) : 텍스트 분류 (0) | 2021.01.05 |
---|---|
3장 자연어 처리 개요(1) : 단어표현 (0) | 2021.01.05 |
2장 자연어 처리 개발 준비(3) : 자연어 토크나이징 도구 (0) | 2021.01.03 |
2장 자연어 처리 개발 준비(2) : 사이킷런 (0) | 2020.12.30 |
2장 자연어처리 개발 준비(1) : 텐서플로 (2) | 2020.12.26 |
- Total
- Today
- Yesterday
- AI
- 심리학
- word vector
- CBOW
- 그림자
- Polls
- 분석심리학
- word embedding
- Skip-gram
- web
- 당신의 그림자가 울고 있다.
- 로버트존슨
- 인공지능
- text classification
- NLP
- Python
- 코딩테스트
- Tutorial
- 젠심
- word2vec
- 알고스팟
- 코딩하는 신학생
- 텍스트분류
- 융
- Mikolov
- django
- WebProgramming
- 단어표현
- lstm
- 자연어처리
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |