일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Batch Normalization
- 비지도학습
- 감정은 습관이다
- Normalization
- ifnull
- 정밀도
- 재현율
- DecisionTree
- NULLIF
- LAG
- 빠르게 실패하기
- NVL
- sorted
- layer normalization
- 데이터 분석
- 평가 지표
- beautifulsoup
- 웹서비스 기획
- SQL
- 백엔드
- recall
- 지도학습
- 데이터 전처리
- five lines challenge
- CASE WHEN
- 결정트리
- 강화학습
- 오차 행렬
- 데이터 프로젝트
- nvl2
- Today
- Total
Day to_day
[하루한끼_데이터] 데이터 전처리 2 : 정규표현식 본문
캐글 데이터를 사용하기 위해서 전처리 단계가 필수적으로 요구된다.
저번엔 데이터를 살펴보고 어떻게 데이터 전처리를 할 것 인가를 봤고, 이번엔 정규표현식으로 활용한 데이터 전처리를 진행해보았다.
사실 정규표현식이 무엇인지도 모르는 상태였으며, 단지 정규표현식을 이용해서 문자열의 규칙을 찾아서 하는 편이 쉽다는 이야기를 들어 시도해보았다. (그래서 코드가 깔끔하진.. 못하다ㅠ)
블로그 글이랑 공식문서들을 보면서 하나씩 해보긴 했는데 글을 쓰는 지금도 어렵다고 느낀다...
생각지도 못한 부분에서 시간을 굉장히 잡아먹었던 기분이다.
그러면 우선 정규표현식이 어떤 것인지에 대해서 알아보자
정규 표현식
정규표현식은 패턴(규칙)을 갖는 문자열의 집합을 표현하는 데에 사용되는 기법.
주로 복잡한 문자열에서 특정한 패턴과 일치하는 문자열을 찾고 대체하기 위해서 사용된다.
정규표현식을 알기 전엔 파이썬 find() 함수를 통해서 하나씩 찾으려 했었다.
그런데 데이터에 내가 필요한 문자 이외에 다른 노이즈가 많다면 find로 찾기가 어려워진다.
메타 문자
원래 그 문자가 가진 뜻이 아닌 특별한 용도로 사용하는 문자
정규표현식에서 사용되는 메타 문자
. ^ $ * + ? { } [ ] \ | ( )
메타 문자를 사용해서 정규표현식의 문법에 맞게 활용한다.
정규표현식의 문법
패턴 | 설명 |
\w | 영어 소문자, 영어 대문자, 숫자, _(언더바) |
\W | \w의 반대 |
\d | 숫자 |
\D | \d의 반대 = 숫자 제외 모든 문자 |
\s | 공백, 탭 (\t), 줄바꿈(\r\n) |
\S | \S의 반대 = 공백, 탭, 줄바꿈 제외 모든 문자 |
. | 모든 문자 (공백 포함, 줄바꿈 제외) |
[] | [] 안 패턴을 or 조건으로 지정 |
[0-9] | 숫자 |
[a-z] | 영어 소문자 |
[A-Z] | 영어 대문자 |
[ㄱ-ㅣ] | 한글 자음 및 모음 |
[가-힣] | 한글 문자 |
[^] | 대괄호 안 패턴 제외 |
^ | 패턴의 시작 위치 지정 |
$ | 패턴의 끝 위치 지정 |
+ | 앞 패턴이 1~무한대번 연속 일치 |
* | 앞 패턴이 0~무한대번 연속 일치 |
? | 앞 패턴이 0~1번 일치 = 있거나 없거나 |
{n} | 앞 패턴이 n번 연속 일치 |
{n,} | 앞 패턴이 n~무한대 연속 일치 |
{n,m} | 앞 패턴이 n~m번 연속 일치 (n<m) |
A(?=B) | 패턴A 뒤의 문자열이 패턴B와 일치하면 패턴A 지정 (전방탐색) |
A(?!B) | 패턴A 뒤의 문자열이 패턴B와 일치하지 않으면 패턴A 지정 |
(?<=A)B | 패턴B 앞의 문자열이 패턴A와 일치하면 패턴B 지정 (후방탐색) |
(?<!A)B | 패턴B 앞의 문자열이 패턴A와 일치하지 않으면 패턴B 지정 |
정규표현식 기본 문법 및 예시
^The | The로 시작하는 문자열 |
of despair$ | of despair로 끝나는 문자열 |
^abc$ | abc로 시작하고 abc로 끝나는 문자열 (abc 라는 문자열도 해당됨) |
notice | notice가 들어 있는 문자열 |
ab* | a 다음에 b가 0개 이상 (a, ab, abbb 등등) |
ab+ | a 다음에 b가 1개 이상 (ab, abbb 등등) |
ab? | a 다음에 b가 있거나 없거나 (ab 또는 a) |
ab{2} | a 다음에 b가 2개 있는 문자열 (abb) |
ab{2,} | a 다음에 b가 2개 이상 (abb, abbbb 등등) |
ab{3,5} | a 다음에 b가 3개에서 5개 사이 (abbb, abbbb, 또는 abbbbb) |
*, +,? 는 각각 {0,}, {1,}, {0,1}과 같다고 할 수 있다.
hi|hello | hi나 hello가 들어 있는 문자열 |
(b|cd)ef | bef 또는 cdef |
(a|b)*c | a와 b가 섞여서 여러번 나타나고 그뒤에 c가 붙어있는 패턴 |
. (점) | 임의의 한 문자 |
^.{3}$ | 3문자로만 되어 있는 문자열 |
[ ] | 괄호 안에 있는 내용 중 임의의 한 문자 |
[^ ] | 첫문자로 ^를 쓰면 괄호 내용의 부정. 즉 괄호 안에 포함되지 않는 한 문자 |
[ab] | a 또는 b (a|b 와 동일한 표현) |
[a-d] | 소문자 a에서 d까지 (a|b|c|d 또는 [abcd] 와 동일) |
^[a-zA-Z] | 영문자로 시작하는 문자열 |
[0-9]% | % 문자 앞에 하나의 숫자가 붙어 있는 패턴 |
%[^a-zA-Z]% | 두 % 문자 사이에 영문자가 없는 패턴 |
특수 문자 자체를 검색하기 및 사용하기 | |||
\^ | ^ | \. | . |
\[ | [ | \$ | $ |
\( | ( | \) | ) |
\| | | | \* | * |
\+ | + | \? | ? |
\{ | { | \\ | \ |
\n | 줄넘김 문자 | \r | 리턴 문자 |
\w | 알파벳과 _ (언더바) | \W | 알파벳과 _ 가 아닌 것 |
\s | 빈 공간(space) | \S | 빈 공간이 아닌 것 |
\d | 숫자 | \D | 숫자가 아닌 것 |
\b | 단어와 단어 사이의 경계 | \B | 단어 사이의 경계가 아닌 것 |
\t | Tab 문자 | \xnn | 16진수 nn에 해당하는 문자 |
우선 나 같은 경우엔 데이터 중간에 끼어있는 쓸모없는 것들을 "제거"하는 것이 목적이다.
먼저 파이썬 정규 표현 모듈 re를 import 해준다.
import re
문자열을 바꾸기 위해서는 sub 메서드를 이용해서 정규식과 매치되는 부분을 다른 문자로 바꾸면 된다.
re.sub 기본 문법
re.sub(pattern, repl, string, count)
pattern : 매치시킬 패턴
repl : 변경할 문자
string : 적용 문자열
count : 치환 개수(최댓값)
count의 경우 생략해도 상관없다. (한 두 개만 찾는 것이 아닌 모든 것을 치환할 것이므로 생략)
re.sub 예시
a = re.sub(r'\nIngredients\n', '', df["ingredients"][0])
pattern : \nIngredients\n
repl : ' ' (없는 문자, 즉 지운다는 이야기)
string : ingredients의 첫 번째 행
이런 식으로 원하는 부분을 지우는 작업을 for 문을 이용해서 전처리를 진행했다.
사용 예시
import re
j=[]
for i in range(1365):
a = re.sub(r'\nIngredients\n', '', df_drop_set3["ingredients"][i]) # \nIngredients\n 삭제
b = re.sub(r'\bScale\b', '', a) # \bScale\b 삭제
c = re.sub(r'\b1x2x3x\b', '', b)# \b1x2x3x\b 삭제
d = re.sub(r'\bUnits\b', '', c) # \bUnits\b 삭제
e = re.sub(r'\bUSM\b', '', d) # \bUSM\b 삭제
f = re.sub(r'\n\n{1,}', '', e) # 연속되는 \n 삭제
g = re.sub(r'^\n', '', f) # \n로 시작하는 것 삭제
h = re.sub(' +(?= )', '', g) # 연속되는 빈칸 삭제
j.append(h)
df_drop_set3["new"] = j
df_drop_set3["new"]
사실 처음 써보는 거라 정규표현식이 익숙지 않아서 많이 길어졌는데 계속 프로젝트마다 활용해보며 익혀가야겠다.
이런 식으로 써서 전처리는 마무리!
전처리를 우선 끝냈으니 웹서비스에 데이터로 넣을 수는 있다!
하지만 아직 이미지에 대한 부분이 해결되지 않았으니, 이미지를 얻기 위해서 크롤링을 진행할 예정이다.
(현재 img_url 칼럼은 사실 레시피 url로 이 url을 이용해서 크롤링을 진행할 예정)
레시피 이미지 크롤링을 위한 img_url csv 만들기
df_set7["img_url"].to_csv("img_url.csv")
Ref
'Project' 카테고리의 다른 글
[하루한끼_데이터] 문서 간 유사도 검사를 통한 추천 시스템 만들기 #1 (0) | 2022.12.20 |
---|---|
[하루한끼_데이터] 이미지 url 크롤링 (0) | 2022.11.09 |
[하루한끼_데이터] 데이터 전처리 1 (0) | 2022.11.02 |
[하루한끼_백엔드] Express Request 확장하기 (1) | 2022.11.01 |
[하루한끼_백엔드] 타입스크립트 기본 문법 (0) | 2022.10.27 |