< 공부한 내용 >
1. 정규표현식
2. 텍스트 전처리
3. 텍스트 전처리 함수 구현
1. 정규표현식
'''
정규 표현식 (인터넷에 검색해보면 더 많이 찾을 수 있음)
[주요 메타문자]
. : 임의의 한 문자
.x : 임의의 한 문자 뒤에 x가 오는 문자열(ex : abc, mbc -> .bc)
^x : x로 시작하는 문자열(접두어 추출)
x$ : x로 끝나는 문자열(접미어 추출)
x. : x 다음에 임의의 한 문자가 오는 문자열(ex : t1, t2, ta -> t.)
x* : x가 0번 이상 반복
x+ : x가 1개 이상 반복
x? : x가 0 또는 1개 존재
x{m, n} : x가 m~n 사이 연속
x{m, } : x가 m 이상 연속
x{,n} : x가 n 이하 연속
[x] : x문자 한 개 일치
[문자 클래스]
\\w : 숫자, 한글, 영어 한글자
\\d : 숫자 [0-9]
'''
# 파이썬에서 제공하는 모듈 가져오는 방법
# 방법1 : 정규표현식 모듈(함수 or 클래스)
import re
# 방법2 : from 모듈 import 함수1, 함수2, ...
from re import findall, match, sub
# 방법1)
re.findall() # 모듈.함수()
# 방법2)
findall() # 함수()
# 1. findall('pattern', string) -> 문자열
st1 = '1234 abc홍길동 ABC_555_6 이사도시'
# 1) 숫자 찾기
print(findall('1234', st1)) # ['1234']
print(findall('[0-9]', st1)) # ['1', '2', '3', '4', '5', '5', '5', '6']
print(findall('[0-9]{3,}', st1)) # ['1234', '555']
print(findall('\\d{3,}', st1)) # ['1234', '555']
# 2) 문자열 찿기
print(findall('[가-힣]{3,}', st1)) # ['홍길동', '이사도시']
print(findall('[a-z]{3}', st1)) # ['abc']
print(findall('[a-z]{4}', st1)) # [] - 불일치 : 빈 list
print(findall('[a-z|A-Z]{3}', st1)) # ['abc', 'ABC']
# 단어에서 한글 이름 찾기
st_list = st1.split() # sep= ' '
print(st_list) # ['1234', 'abc홍길동', 'ABC_555_6', '이사도시']
names = [ ] # 빈 list - 한글 이름 저장
for word in st_list :
name = findall('[가-힣]{3,}', word) # [], ['홍길동']
if name : # [ ] -> False
names.append(name[0]) # ['홍길동']
print(names) # ['홍길동', '이사도시']
# 3) 특수한 문자열 찾기
st2 = 'test1abcABC 123mbc 45test'
# 접두어(^)/접미어($)
print(findall('^test', st2)) # ['test']
print(findall('test$', st2)) # ['test']
# 종료 문자 찾기 : *bc => .bc 로 표현
print(findall('.bc', st2)) # ['abc', 'mbc']
# 시작 문자 찾기 : t* => t. 로 표현
print(findall('t.', st2)) # ['te', 't1', 'te']
# 단어 찾기(\\w) : 숫자, 한글, 영문자 (특수문자, 공백 제외)
st3 = 'test^홍길동 abc 대한*민국 123$tbc'
words = findall('\\w{3,}', st3)
print(words) # ['test', '홍길동', 'abc', '123', 'tbc']
# 4) 문자열 제외 : x+ (x가 1개 이상 반복)
# (1) t가 1개 이상 반복 -> 제외
# [^제외할문자] : ^ 꺽쇠는 제외를 의미
print(findall('[^t]+', st3)) # ['es', '^홍길동 abc 대한*민국 123$', 'bc']
# 2) 특수문자 제외
print(findall('[^^*$]+', st3)) # ['test', '홍길동 abc 대한', '민국 123', 'tbc']
# 2. match('pattern', string)
# - 패턴 일치 여부 반환 : object 반환(일치), NULL 반환(불일치)
jumin = '123456-1234567'
result = match('\\d{6}-[1-4]\\d{6}', jumin)
print(result) # <re.Match object; span=(0, 14), match='123456-1234567'>
if result :
print('정상적인 주민번호')
else :
print('잘못된 주민번호')
# 3. sub('pattern', 'repl', string)
# - 텍스트 전처리용
st3 = 'test^홍길동 abc 대한*민국 123$tbc'
text = sub('[\^*$]', '', st3) # R의 gsub()
print(text) # test홍길동 abc 대한민국 123tbc
2. 텍스트 전처리
# 모듈 import
from re import match, findall, sub
# 텍스트 전처리
texts = ['AFAB54747,asabag?', 'abTTa $$;a12:2424.', 'uysfsfA,A124&***$?'] # 문단
# 1. 소문자 변경
string = "ABCd"
type(string) # <class 'str'>
print(string.lower()) # abcd
print(string.upper()) # ABCD
type(texts) # <class 'list'>
# texts.lower() - AttributeError
# list 내포
texts_re = [ text.lower() for text in texts ]
print(texts_re) # ['afab54747,asabag?', 'abtta $$;a12:2424.', 'uysfsfa,a124&***$?']
# 2. 숫자 제거 : 변수 = [ 실행문 for 변수 in 열거형객체 ]
texts_re2 = [''.join(findall('[^0-9]', text)) for text in texts_re]
print(texts_re2)
# 3. 문장부호 제거 : sub('pattern', repl, string)
punc_str = '[,.?!;:]'
texts_re3 = [ sub(punc_str, '', text) for text in texts_re2]
print(texts_re3) # ['afabasabag', 'abtta $$a', 'uysfsfaa&***$']
# 4. 특수문자 제거
spec_str = '[@#$%^&*()]'
texts_re4 = [sub(spec_str, '', text) for text in texts_re3]
print(texts_re4) #['afabasabag', 'abtta a', 'uysfsfaa']
# 5. 공백제거 : 'abtta a' -> 'abtta', 'a' -> 'abttaa'
texts_re5 = [''.join(text.split()) for text in texts_re4]
print(texts_re5) # ['afabasabag', 'abttaa', 'uysfsfaa']
3. 텍스트 전처리 함수 구현
# 함수 정의
def plus(x, y) :
add = x + y
return add
# 함수 호출
add = plus(10, 20)
print('add=', add)
from re import findall, sub
# 텍스트 전처리2
texts = [' 우리나라 대한민국, 우리나라%$ 만세', '비아그&라 500GRAM 정력 최고!', '나는 대한민국 사람', '보험료 15000원에 평생 보장 마감 임박', '나는 홍길동']
# 텍스트 전처리 함수
def clean_text(text) : # 여기서 사용되는 text는 'string' 기준이여야 함. list 말고 그 안에 하나, string 형태로!
# 1~6단계
texts_re = text.lower() # 소문자화
texts_re2 = sub('[0-9]', '', texts_re) # 숫자제거
texts_re3 = sub('[,.?!;:]', '', texts_re2) # 문장부호 제거
texts_re4 = sub('[@#$%^&*()]', '', texts_re3) # 특수문자 제거
texts_re5 = sub('[a-z]', '', texts_re4) # 영문자 제거
texts_re6 = ' '.join(texts_re5.split()) # white space 제거(단어 구분)
return texts_re6 # 반환값
# 함수 호출
clean_text(texts[0]) # '우리나라 대한민국 우리나라 만세'
result = [ ]
for i in texts :
result.append(clean_text(i))
print(result)
# ['우리나라 대한민국 우리나라 만세', '비아그라 정력 최고', '나는 대한민국 사람', '보험료 원에 평생 보장 마감 임박', '나는 홍길동']
----------------------------------------------------- example -----------------------------------------------------
'Python 과 머신러닝 > I. 기초 문법' 카테고리의 다른 글
Python 기초 5장. 함수 (2) (0) | 2019.09.30 |
---|---|
Python 기초 5장. 함수 (1) (0) | 2019.09.30 |
Python 기초 3장. 자료구조 (0) | 2019.09.30 |
Python 기초 2장. 제어문 (0) | 2019.09.30 |
Python 기초 1장. 변수와 연산자, print, 문자열처리 (0) | 2019.09.30 |
댓글