| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 | 31 |
- 파이썬
- 파이선
- postgres
- psycopg
- Python
- chartjs-chart-financial
- 아나콘다
- settings.py
- ec2
- vue
- 오픈빌더
- 챗봇
- Chatbot
- database
- RDS
- 장고
- SSH Tunnel
- GPT
- 따라하며 배우는 파이썬과 데이터 과학
- django db with ssh tunnel
- 이터널리턴
- 파이참
- 개발일지
- vpc
- pycharm
- Django
- AWS
- subnet
- 파이팅
- Today
- Total
우아한 개발계발 블로그
따라하며 배우는 파이썬과 데이터 과학 (9) - 텍스트를 처리해보자 본문
2021.06.20 - [Study/따라하며 배우는 파이썬과 데이터 과학] - 따라하며 배우는 파이썬과 데이터 과학 (8) - 연관된 데이터를 딕셔너리로 짝을 짓자
따라하며 배우는 파이썬과 데이터 과학 (8) - 연관된 데이터를 딕셔너리로 짝을 짓자
2021.06.20 - [Study/따라하며 배우는 파이썬과 데이터 과학] - 따라하며 배우는 파이썬과 데이터 과학 (7) - 데이터를 리스트와 튜플로 묶어보자 따라하며 배우는 파이썬과 데이터 과학 (7) - 데이터를
w00-ah.tistory.com
오늘날의 인터넷에는 다양한 데이터가 넘쳐나지만, 이러한 데이터들의 한 원천 데이터 들은 사람이 읽을 수 있는 텍스트(Text)의 형태로 저장되어 있다.
이번 장에서는 텍스트 데이터를 다루는 데에 어렵지만서도 좋은 도구인 정규표현식(regular expression)을 알아보자.
9.1 문자열 다루기
문자열을 다루는 가장 기본적인 작업은 문자열 안에서 개별 문자들을 추출하는 것이다.
인덱싱 & 슬라이싱
>>> s = 'Monty Python'
>>> s[0] # 인덱스를 이용해 접근/추출
'M'
>>> s[6:10]
'Pyth' # 슬라이싱을 이용해 접근/추출
>>> s[-12:-7]
'Monty'
>>> s[::-1]
'nohtyP ytnoM'
슬라이싱을 이용해 굳이 별다른 메소드나 함수를 사용하지 않고도 문자열을 뒤집을 수 있으니, 알아두자
split() 메소드
split() 메소드는 문자열을 매개변수로 입력받은 인자 값으로 문자열을 나누고
이때 인자가 공백으로 비어있다면, 문자열을 공백(space)로 나눈다. 이 메소드의 반환값은 list형 이므로 참고하자.
>>> s = 'Welcome to Python'
>>> s.split()
['Welcome', 'to', 'Python']
strip() 메소드
strip() 메소드는 문자열의 앞뒤로 입력받은 인자(텍스트) 가 존재하면 지우는 역할을 한다.
그냥 strip은 문자열의 좌우(앞뒤)를 확인하고, rstrip 과 lstrip은 각각 오른쪽과 왼쪽을 확인한다.
만약 입력받은 인자가 없다면 공백을 지운다. 그리고 strip은 하나만 지우는 것이아닌 겹치는 모든 패턴을 지우는 특징이있다.
>>> a = "ffaaaaaaaaffff"
>>> a.strip("f")
'aaaaaaaa'
join() 메소드
split()으로 문자열을 잘랐다면 이번에는 붙여보는 것이다.
이런식으로 문자열.join(시퀀스 자료형)
>>> ','.join(['apple', 'grape', 'banana'])
'apple,grape,banana'
>>> ','.join({'apple', 'grape', 'banana'})
'grape,apple,banana'
만약 그대가 set 자료형을 넘긴다면 순서가 뒤죽박죽으로 연결될 것이다.
대소문자 변환
>>> s = 'Hello, World!'
>>> s.lower()
'hello, world!'
>>> s.upper()
'HELLO, WORLD!'
>>> 'hello, world!'.capitalize()
'Hello, world!'
find() 메소드
find() 메소드는 문자열에서 지정된 부분 문자열을 찾아서 그 인덱스를 반환한다. 찾지 못했을 경우에는 -1을 반환한다.
>>> s = 'www.google.com'
>>> s.find('google')
4
>>> s.find('tistory')
-1
count() 메소드
count() 메소드는 인자로 입력받는 문자열 패턴이 등장하는 횟수를 반환한다.
>>> s = 'www.google.com'
>>> s.count('o') # o 가 3번 등장함
3
ord(), chr() 메소드
>>> s = 'www.google.com'
>>> ord(max(s)) # s문자열 내에서 유니코드 값이 가장 큰 값의 유니코드 값을 반환
119
>>> ord(min(s)) # s문자열 내에서 유니코드 값이 가장 작은 값의 유니코드 값을 반환
46
>>> chr(119), chr(46) # 유니코드 값 119, 46에 해당하는 문자를 반환.
( 'w', '.')
ord 는 입력받은 문자의 대응되는 유니코드 값을 반환하고
chr 은 입력받은 유니코드에 대응되는 문자를 반환한다.
String 모듈
>>> import string
>>> src_str = string.ascii_uppercase
>>> print('src_str =", src_str)
src_str = ABCDEFGHIJKLMNOPQRSTUVWXYZ
A-Z까지의 문자열을 가져오기 위해 String모듈에서 상수 데이터인 ascii_uppercase 를 가져온 것이다.
9.2 워드 클라우드
워드 클라우드(Word Cloud)는 각 단어의 크기가 빈도 또는 중요성을 나타내는 텍스트 뎅터 시각화 기술을 말한다.
파이썬에서 워드 클라우드를 생성하려면 matplotlib, pandas, wordcloud 모듈의 설치가 선행되어야 한다.
(wordcloud 설치가 사람에 따라 파이썬 버전에 따라 문제가 많은 것 같다.
이정도는 구글에 검색하면 쉽게 해결할 수 있는 문제이다.)
import wikipedia
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from wordcloud import WordCloud, STOPWORDS
# 위키백과 사전의 컨텐츠 제목을 명시해 준다
wiki = wikipedia.page('Artificial intelligence')
# 이 페이지의 텍스트 컨텐츠를 추출하도록 한다
text = wiki.content
# 워드 클라우드를 생성
wordcloud = WordCloud(width = 2000, height = 1500).generate(text)
plt.figure(figsize=(40, 30))
# 화면에 이미지를 그려준다
plt.imshow(wordcloud)
plt.show()
s_words = STOPWORDS.union( {'one', 'using', 'first', 'two', 'make', 'use'} )
wordcloud = WordCloud(width = 2000, height = 1500,
stopwords = s_words).generate(text)

위의 몇줄 안되는 코드를 통해 영문 위키피디아에서 가자 많이 쓰인 단어가 AI, human, system, problem 인 것을 시각적으로 알 수 있다. 신기하지 않은가. 파이썬은 할 수 있는게 다양해서 좋다.
9.3. 정규표현식(regular expression)
특정한 규칙을 가지고 있는 문자열들을 표현하는데 사용되는 규칙을 가진 언어이다.
이때, 문자들을 찾거나 조작하기 위해서 다양한 특수 문자들이 정규표현식의 규칙을 갖고 이용되니, 사용에 주의하여야한다.
※ 파이썬에 정규식을 사용하려면 re모듈을 포함시켜야 한다.
>>> import re
>>> txt1 = 'Life is too short, you need python.'
>>> txt2 = 'The best moments of my life.'
>>> print(re.search('Life', txt1)) # 문장 안에 Life가 있는가 검사함
<_sre.SRE_Match object; span=(0, 4), match='Life'>
>>> print(re.search('Life', txt2)) # 문장 안에 Life가 있는가 검사함
None
위의 결과를 통해 Life 와 life 는 서로 다른 문자열로 인식하여, 첫번째에는 match='Life' 가 출력되지만, 두번째에는 'Life'가 문자열 내에 존재하지 않아 None 이 출력되는 모습이다.
이때 그냥 Life라는 단어를 첫 글짜의 대소 상관없이 찾고싶다면
우리는 특수 문자들을 이용하여 정규표현식을 작성할 수 있다.
| 식 | 기능 | 설명 |
| ^ | 시작 | 문자열의 시작을 의미함 |
| $ | 끝 | 문자열의 끝을 의미함 |
| . | 문자 | 한 개의 문자 |
| \d | 숫자 | 한 개의 숫자 |
| \w | 문자와 숫자 | 한 개의 문자나 숫자 |
| \s | 공백문자 | 공백 문자 (스페이스, 탭, 줄바꿈 등) |
| \S | 공백문자 제외 | 공백 문자를 제외한 모든 문자가 될 수 있음 |
| * | 반복 | 앞 문자가 0번 이상 반복 |
| + | 반복 | 앞 문자가 1번 이상 반복 |
| [abc] | 문자 선택 범위 | a, b, c 가운데 하나의 문자 |
| [^abc] | 문자 제외 범위 | a, b, c가 아닌 어떤 문자 |
| | | 또는 | | 앞의 문자 또는 뒤의 문자를 의미함 |
>>> print(re.search('[Ll]ife', txt2))
<re.Match object; span=(23, 27), match='life'>
[Ll]ife 는 Life이거나 life인 문자라는 의미이다. 그래서 txt2에서도 life 단어를 찾은 것을 알 수 있다.
정규표현식에서 [], -, |와 같은 특별한 의미를 가지는 문자들을 사용하여 검색하거나 교체하기도 한다. 이러한 특수한 용도의 문자를 메타문자(meta character)라고 한다.
정규표현식의 예시를 좀더 보자면
>>> re.search('A..A', 'ABA') # 조건에 맞지 않음
>>> re.search('A..A', 'ABBA') # 조건에 맞음
<re.Match object; span=(0, 4), match='ABBA'>
>>> re.search('A..A', 'ABBBA') # 조건에 맞지 않음
검색 함수 findall()
정규 표현식의 findall()을 사용하면 정규식을 만족하는 모든 문자열을 추출할 수 있다.
>>> txt = 'My life my life my life in the sunshine'
>>> re.findall('[Mm]y', txt)
['My', 'my', 'my']
문자열 대체 함수 sub()
sub() 메소드는 특정한 문자열을 다른 문자열로 대체하는 함수이다.
s문자열 내에서 1번쨰 인자의 패턴이 발견되면 2번째 인자로 대체 시키는 함수이다.
>>> s = 'I like BTS!'
>>> re.sub('BTS', 'Black Pink', s)
'I like Black Pink!'
정규표현식은 예시에서 보여준 것과 같이 짧은 문자열이 아니라, 정말 많은 방대한 텍스트들, (ex: 로그파일, 데이터 베이스 등)에서 진정한 가치를 발휘한다. string에서 문자열로 찾는것이 아닌, 패턴으로 문자열을 찾는 것이기 때문에 방대한 자료들에서 해당하는 데이터를 필터링하기 때문에, 코드를 간결화할 뿐만 아니라 속도적인 측면에서도 우월하다.
정규표현식을 처음 배우고 사용해보는 것이라 처음엔 조금 어려웠는데, 이것저것 만들다보니 어느정도 감은 익혀지는 것 같다.
'Study > 따라하며 배우는 파이썬과 데이터 과학' 카테고리의 다른 글
| 따라하며 배우는 파이썬과 데이터 과학 (11) - 차트를 멋지게 그려보자 (0) | 2021.06.20 |
|---|---|
| 따라하며 배우는 파이썬과 데이터 과학 (10) - 넘파이로 수치 데이터를 처리해보자 (0) | 2021.06.20 |
| 따라하며 배우는 파이썬과 데이터 과학 (8) - 연관된 데이터를 딕셔너리로 짝을 짓자 (0) | 2021.06.20 |
| 따라하며 배우는 파이썬과 데이터 과학 (7) - 데이터를 리스트와 튜플로 묶어보자 (0) | 2021.06.20 |
| 따라하며 배우는 파이썬과 데이터 과학 (6) - 함수로 일처리를 짜임새있게 하자 (1) | 2021.06.20 |