-
[CHAPTER 9] 텍스트 처리Deep Learning/인공지능 입문 코딩 2021. 5. 29. 12:18728x90
문자열 처리
문자열을 처리하는 방법들을 살펴보자.
슬라이싱
리스트에서 이미 배웠던 내용이다. 문자열에도 똑같이 적용할 수 있다.
>>> s = 'Monty Python' >>> s[6:10] 'Pyth' >>> s[-12:-7] 'Monty' >>> t = s[:-2] >>> t 'Monty Pyth' >>> t = s[-2:] >>> t 'on' >>> s[:-2] + s[-2:] 'Monty Python'
'Monty Python' 문자열의 각각의 인덱스 번호는 아래와 같다.
다양한 문자열 처리 메서드, 함수
split()
문자열을 잘라주는 메소드이다. 인자가 없으면 공백을 기준으로 잘라준다.
>>> s = 'Welcome to Python' >>> s.split() ['Welcome', 'to', 'Python']
>>> s = '2021.8.15' >>> s.split('.') ['2021', '8', '15']
join()
문자열을 붙여주는 메소드이다.
','.join(['apple', 'grape', 'banana'])
리스트를 ', '로 붙이라는 뜻이다.
lower()
대문자를 소문자로 변경해주는 메서드이다.
>>> s = 'Hello, World!' >>> s.lower() 'hello, world!'
upper()
소문자를 대문자로 변경해주는 메서드이다.
>>> s = 'Hello, World!' >>> s.upper() 'HELLO, WORLD!'
strip()
앞 뒤의 특정 문자를 모두 제거해주는 메서드이다. 인자가 없으면 공백을 제거한다.
>>> s = " Hello, World! " >>> s.strip() 'Hello, World!' >>> s = " Hello, World! " >>> s.lstrip() # 왼쪽의 공백 문자만 제거한다. 'Hello, World! ' >>> s = " Hello, World! " >>> s.rstrip() # 오른쪽의 공백 문자만 제거한다. ' Hello, World!'
>>> s = "########this is an example#####" >>> s.strip('#')
find()
문자열에서 지정된 부분 문자열을 찾아서 그 인덱스를 반환한다. 찾지 못했을 경우 -1을 반환한다.
>>> s = "pintelligence.tistory.com" >>> s.find(".com") 21 >>> s.find("x") -1
index()
문자열에서 지정된 부분 문자열을 찾아서 그 인덱스를 반환한다. 찾지 못했을 경우 에러가 뜬다.
find()는 문자열에만 쓸 수 있고 index()는 리스트, 튜플에도 사용 가능하다
>>> s = "pintelligence.tistory.com" >>> s.index('t') 3 >>> s.index('tistory') 14
count()
문자열 중에서 부분 문자열이 등장하는 횟수를 반환한다.
>>> s = 'pintelligence.tistory.com' >>> s.count('.') 2
ord(), chr(), max(), min()
ord() 함수는 입력된 문자의 유니코드 값을 반환한다.
chr() 함수는 입력된 유니코드 값에 해당하는 문자를 반환한다.
max(), min() 함수는 각각 유니코드 값을 기준으로 가장 큰 값과 가장 작은 값을 반환한다.
>>> ord(max(s)) 121 >>> ord(min(s)) 46 >>> chr(121), chr(46) ('y', '.')
string 모듈
string 모듈의 ascii_uppercase는 알파벳 대문자를 ascii_lowercase는 알파벳 소문자를 모두 포함하고 있다.
>>> import string >>> src_str = string.ascii_uppercase >>> print('src_str =', src_str) src_str = ABCDEFGHIJKLMNOPQRSTUVWXYZ >>> src_str = string.ascii_lowercase >>> print('src_str =', src_str) src_str = abcdefghijklmnopqrstuvwxyz
워드 클라우드(word cloud)
워드 클라우드(word cloud)는 각 단어의 크기가 빈도 또는 중요성을 나타내는 텍스트 데이터 시각화 기술이다.
matplotlib, pandas, wordcloud 모듈이 필요하다.
C:\> pip install matplotlib pandas wordcloud
워드 클라우드를 사용해보자.
먼저, 위키피디아에서 텍스트를 추출해온다.
import wikipedia # 위키백과 사전의 컨테츠 제목을 명시해 준다. wiki = wikipedia.page('Artificial intelligence') # 이 페이지의 텍스트 컨텐츠를 추출하도록 한다. text = wiki.content
워드 클라우드 생성
from wordcloud import WordCloud wordcloud = WordCloud(width = 2000, height = 1500).generate(text)
화면에 그림
import matplotlib.pyplot as plt plt.figure(figsize=(40, 30)) plt.imshow(wordcloud) plt.show()
신기한 기술인 것 같다. 텍스트 빈도수가 높을수록 더 중요하게 생각하는 것 같다. 음... 그러면 is, are 같은 be동사도 빈도수가 높을 텐데 그런 단어들은 이미지에는 없는 것 같다. 자세한 원리는 잘 모르겠다.. 자연어 처리에 대해서 깊게 공부해 보고 싶다.
matplotlib코드가 잘 이해되지 않지만 지금은 주어진 데이터를 기반으로 화면에 그림을 그려주는 코드라고만 생각하자.
one, using, two, make, use 같은 단어들은 중요한 의미를 갖지 않는다. 이 단어들을 없애기 위해 중지 어를 사용한다.
STOPWORDS를 이용해서 중지어를 만들 수 있다.
is, are 같은 be동사도 여기에 포함되어 있으려나??
import wikipedia import matplotlib.pyplot as plt from wordcloud import WordCloud, STOPWORDS # 위키 피디어 'Artifical intelligence'페이지에서 텍스트를 추출해온다. wiki = wikipedia.page('Artificial intelligence') text = wiki.content # 워드 클라우드 생성 s_words = STOPWORDS.union( {'one', 'using', 'first', 'two', 'make', 'use'} ) wordcloud = WordCloud(width = 2000, height = 1500, stopwords = s_words).generate(text) # 화면에 그림 plt.figure(figsize=(40, 30)) plt.imshow(wordcloud) plt.show()
정규식(regular expression)
정규식(regular expression)이란 특정한 규칙을 가지고 있는 문자열들을 표현하는 데 사용되는 규칙을 가진 언어이다.
파이썬에서 정규식을 사용하려면 re모듈을 포함시켜야 한다.
search()
search()를 사용하면 정규식에 매치되는 문자열을 찾을 수 있다.
>>> import re >>> txt1 = "Life is too short, you need python." >>> txt2 = "The best moments of my life." >>> print(re.search('Life', txt1))# 문장 안에 Life가 있는가 검사함 <re.Match object; span=(0, 4), match='Life'> >>> print(re.search('Life', txt2)) # 문장 안에 Life가 있는가 검사함 None >>> match = re.search('Life', txt1) >>> match.group() 'Life'
<re.Match object; span=(0, 4), match='Life'> 이것은 일치하는 문자열의 구간에 관한 정보이다.
span=(0, 4) : 문자열의 인덱스 정보
match='Life' : 일치하는 문자열
group()은 매치된 매치된 문자열을 반환한다.
메타 문자
정규식에 사용되는 특수한 문자들을 메타 문자라고 한다.
식 기능 설명 ^ 시작 문자열의 시작을 의미함 $ 끝 문자열의 끝을 의미함 . 문자 한 개의 문자 \d 숫자 한 개의 숫자 \w 문자와 숫자 한개의 문자나 숫자 \s 공백 문자 공백 문자(스페이스, 탭, 줄바꿈 등) \S 공백 제외 문자 공백 문자를 제외한 모든 문자 * 반복 앞 문자가 0번 이상 반복 + 반복 앞 문자가 1번 이상 반복 ? 반복 앞 문자가 0회 또는 1회 반복 [abc] 문자 선택 범위 a, b, c 가운데 하나의 문자 [^abc] 문자 제외 범위 a, b, c가 아닌 어던 문자 | 또는 | 앞의 문자 또는 뒤의 문자를 의미함 메타 문자를 사용해보자
import re txt1 = "Life is too short, you need python." txt2 = "The best moments of my life." txt3 = "Life is like a box of chocolates." txt4 = "My Life My Choice." print(re.search('^Life', txt1)) # 제일 첫 단어로 Life가 있는가 검사함 print(re.search('^Life', txt2)) # 제일 첫 단어로 Life가 있는가 검사함 print(re.search('^Life', txt3)) # 제일 첫 단어로 Life가 있는가 검사함 print(re.search('^Life', txt4)) # 제일 첫 단어로 Life가 있는가 검사함 print(re.search('Life|life', txt1)) # Life 혹은 life가 포함되어 있는가 검사함 print(re.search('Life|life', txt2)) # Life 혹은 life가 포함되어 있는가 검사함 print(re.search('[Ll]ife', txt1)) # Life 혹은 life가 포함되어 있는가 검사함 print(re.search('[Ll]ife', txt2)) # Life 혹은 life가 포함되어 있는가 검사함 re.findall('My', txt4)
<re.Match object; span=(0, 4), match='Life'>
None
<re.Match object; span=(0, 4), match='Life'>
None
<re.Match object; span=(0, 4), match='Life'>
<re.Match object; span=(23, 27), match='life'>
<re.Match object; span=(0, 4), match='Life'>
<re.Match object; span=(23, 27), match='life'>*,?, +의 사용 예시를 살펴보자.
import re re.search('AB*', 'A') # 조건에 맞음 re.search('AB*', 'AA') # 조건에 맞음 re.search('AB*', 'J-HOP') # 조건에 맞지 않음 re.search('AB*', 'X-MAN') # 조건에 맞음 re.search('AB*', 'CABBA') # 조건에 맞음 re.search('AB*', 'CABBBBBA') # 조건에 맞음 re.search('AB?', 'A') # 조건에 맞음 re.search('AB?', 'AA') # 조건에 맞음 re.search('AB?', 'J-HOP') # 조건에 맞지 않음 re.search('AB?', 'X-MAN') # 조건에 맞음 re.search('AB?', 'CABBA') # 조건에 맞음 re.search('AB?', 'CABBBBBA') # 조건에 맞음 re.search('AB+', 'A') # 조건에 맞지 않음 re.search('AB+', 'AA') # 조건에 맞지 않음 re.search('AB+', 'J-HOP') # 조건에 맞지 않음 re.search('AB+', 'X-MAN') # 조건에 맞지 않음 re.search('AB+', 'CABBA') # 'ABB'라는 문자열이 조건에 맞음 re.search('AB+', 'CABBBBBA') # 'ABBBBB'라는 문자열이 조건에 맞음
findall()
findall()은 정규식을 만족하는 모든 문자열들을 추출할 수 있다.
>>> txt= 'My life my life my life in the sunshine' >>> re.findall('[Mm]y', txt) ['My', 'my', 'my']
지금까지 배운 것들로
카이사르 암호를 만들어 보자
카이사르 암호는 로마의 장군인 카이사르가 동맹군들과 소통하기 위해 만든 암호인데, 간단한 치환 암호의 일종이다. 이 암호는 암호화하고자 하는 내용을 알파벳별로 일정한 거리만큼 밀어서 다른 알파벳으로 치환하는 방식이다.
출처:https://ko.wikipedia.org/wiki/%EC%B9%B4%EC%9D%B4%EC%82%AC%EB%A5%B4_%EC%95%94%ED%98%B8#/media/%ED%8C%8C%EC%9D%BC:Caesar3.svg 코드로 구현해보자.
import string src_str = string.ascii_uppercase dst_str = src_str[3:] + src_str[:3] def ciper(a): # 암호화 코드를 만드는 함소 idx = src_str.index(a) return dst_str[idx] src = input('문장을 입력하시오: ') print('암호화된 문장 : ', end='') for ch in src: if ch in src_str: print(ciper(ch), end='') else: print(ch, end='')
UN 세계 인권 선언문 분석
UN의 세계 인권 선언문은 https://www.un.org/en/universal-declaration-human-rights/ 에 접속하여 텍스트를 얻을 수 있다. 이 텍스트를 분석해보자.
(숫자) 형태의 30개의 조(article)로 구성되어 있다. 이것을 추출해보자.
import re f = open('./UNDHR.txt') for line in f: line = line.rstrip() if re.search('^\([0-9]+\)', line) : print(line)
(1) Everyone charged with a penal offence has the right to be presumed innocent until proved guilty according to law in a public trial at which he has had all the guarantees necessary for his defence.
(2) No one shall be held guilty of any penal offence on account of any act or omission which did not constitute a penal offence, under national or international law, at the time when it was committed. Nor shall a heavier penalty be imposed than the one that was applicable at the time the penal offence was committed.
...728x90'Deep Learning > 인공지능 입문 코딩' 카테고리의 다른 글
[CHAPTER 11] 데이터 시각화 | matplotlib (0) 2021.06.02 [CHAPTER 10]넘파이(numpy) (0) 2021.05.30 [CHAPTER 8] 딕셔너리와 집합 (0) 2021.05.24 [CHAPTER 7] 리스트, 튜플 (0) 2021.05.23 [CHAPTER 6] 함수 (0) 2021.05.22