검색
검색
공개 노트 검색
회원가입로그인

[이솦] 파이선으로 배우는 AI 기초 17

요약
  • 정규표현식은 데이터 전처리에서 매우 중요한 도구로, 특수 기호를 포함한 다양한 문자열 패턴을 찾아내거나 변형하는 데 사용된다.
  • 파이썬의 re 모듈을 통해 정규표현식을 사용할 수 있으며, match(), search(), findall() 등의 다양한 메소드를 제공한다.
  • 실제 예시를 통해 문자열 데이터에서 특정 패턴을 찾아내는 방법을 배울 수 있으며, 이는 인공지능의 자연어 처리 및 데이터 분석에 활용될 수 있다.

이솦 | EBS 소프트웨어·인공지능 교육

인공지능에서 자연어를 처리하는 부분은 문서 데이터를 확보후 만든다. 예를 들어서 챗봇을 만들때도 많은 채팅자료가 필요하다. 위키피디아나 웹에서 텍스트 문서를 수집하면 특수 기호나 실제 필요없는 데이터가 같이 들어온다. 필요한 데이터만 수집하고 싶다면?

이럴때 정규표현식 (regular expression)을 써야한다.

오늘은 펭투더수, 에투더디에서 펭수와 에디를 찾아보자.

정규표현식

우리가 알고 있는 학술논문은 누군가의 견해를 모아서 정리하고 의견을 주장하는 형태이다.

[텍스트 문장]
"국밥맨은 인공지능에 대하여 다음과 같이 설명했다 (국밥맨, 2021).
이에 반해 펭수는 그 부분의 정의는 새로 해야 한다고 주장하였다 (펭수, 2022).
이 두 연구자 외에 인공지능의 효과성에 대한 다른 견해도 있다 (홍길동, 2022)."

여기에 보면 국밥맨, 펭수, 홍길동이 한 말들이 있다. 이 인용한 말들을 리스트로 작성시 정규표현식을 사용하면 아주 편리하다. 정규 표현식은 데이터 전처리 부분에서 자주 사용되는 기법이다.

import re
text = "국밥맨은 인공지능에 대하여 다음과 같이 설명했다 (국밥맨, 2021).
이에 반해 펭수는 그 부분의 정의는 새로 해야 한다고 주장하였다 (펭수, 2022).
이 두 연구자 외에 인공지능의 효과성에 대한 다른 견해도 있다 (홍길동, 2022)."
result = re.findall(r'\([A-Za-z가-힝]+\d+\)', text)
print(result)

이코드로 설명은 다음과 같다.

  1. import re: Python의 정규 표현식 모듈 re를 가져옵니다. 정규 표현식을 사용하기 위한 필수적인 단계입니다.

  2. text = "...": 분석할 텍스트를 변수 text에 저장합니다. 여기에는 장병철, 펭수, 홍길동 세 명의 연구자와 그들의 연구 연도가 포함되어 있습니다.

  3. result = re.findall(r'([A-Za-z가-힝]+,d+)', text): 핵심 부분으로, re.findall() 함수를 사용하여 text에서 특정 패턴을 찾아 리스트 형태로 result에 저장합니다.

    • re.findall(pattern, string): 문자열에서 정규 표현식 패턴과 일치하는 모든 부분을 찾아 리스트로 반환합니다.

    • r'([A-Za-z가-힝]+,d+)': 정규 표현식 패턴입니다. 자세히 살펴보면:

      • r'...': Raw String임을 나타냅니다. 백슬래시(\)를 특수 문자로 해석하지 않고 그대로 사용합니다.

      • ( ... ): 괄호 ( 와 ) 자체를 찾습니다.

      • [A-Za-z가-힝]+: 알파벳 대문자, 소문자, 그리고 한글 자모 '가'부터 '힝'까지 하나 이상(+) 반복되는 문자열을 찾습니다. 여기서는 연구자 이름에 해당합니다.

      • ,: 쉼표를 찾습니다.

      • d+: 숫자 하나 이상(+) 반복되는 문자열을 찾습니다. 여기서는 연구 연도에 해당합니다.

  4. print(result): result 리스트를 출력합니다. 즉, 정규 표현식과 일치하는 부분들을 출력합니다.

중간에 표현식 패턴이 구글 코랩에서는 되지 않아 코드를 수정했다.

import re
text = "국밥맨은 인공지능에 대하여 다음과 같이 설명했다 (국밥맨, 2021). 이에 반해 펭수는 그 부분의 정의는 새로 해야 한다고 주장하였다 (펭수, 2022). 이 두 연구자 외에 인공지능의 효과성에 대한 다른 견해도 있다 (홍길동, 2022)."
result = re.findall(r'\(([\w가-힣]+),\s*(\d+)\)', text)
print(result)

1번 이상 반복되는 한글과 숫자 반복을 찾음으로 년도를 뽑아 주게 된다.

정규 표현식에서 사용되는 메타 문자는 이것이다.

.^$*+?{}[]₩|() 이다

파이썬에서 정규 표현식을 사용하려면 re모듈을 불러와야 한다. re모듈에는 정규표현식을 지원해 주는 다양한 함수들이 포함되어 있다.

파이썬에서 정규 표현식을 지원하는 re모듈에는 다음 메소드가 있다.

method목적
match()문자열의 처음부터 정규식과 매치되는지 조사한다.
search()문자열 전체를 검색하여 정규식와 매치되는지 조사한다.
findall()정규식와 매치되는 모든 문자열 (string)을 리스트로 돌려준다.

match

그럼 문자열에 특정 문자열이 포함되어 있는지 확인해 보자.

import re
print(re.match('Hello', 'Hello Liza'))

이렇게 하면 hello 라는 글자를 뒤쪽 글자열에서 찾아 준다. match() 함수는 찾을 문자열이 문장 (글자열)의 처음부터 있는지 확인한다.

<re.Match object; span=(0, 5), match='Hello'> 결과로 나와서 매치 됨을 알수 있다. 없는 걸로 하면 none이 출력된다.

search()함수는 문자열이 중간에 있어도 찾는다.

import re
print(re.search('^Hello', 'Hello Liza'))

여기에서 ^의 기능은 여기가 제일 처음이라는 뜻이다. $는 제일 마지막이라는 뜻이다.+

숫자처리

숫자도 문자처럼 처리하면 된다.

print(re.match('[0-9]*', '4567'))

0-9까지의 숫자의 범위중에서 *를 붙여 주면 뒤에 있는 숫자열중에서 반복되는 숫자가 0개 이상 있는지 찾아 준다.

print(re.match('[0-9]+', '4567'))

이렇게 바꾸면 + 해당되는 숫자가 1개 이상 있는지 확인한다.

print(re.match('[0-9]*', 'abcd'))

이렇게 하면 0개도 찾을수 있어서 0개라고 나온다.

print(re.match('[0-9]+', 'abcd'))

이렇게 해야 none라고 나온다.

그럼 *, +를 문자열에도 사용하면 어떻게 될까?

print(re.match('a*b', 'b'))

a가 0번 이상 반복되고 그 다음에 b가 나온다는 뜻 a는 없지만 0개 이상이라서 실행된다.

print(re.match('a+b', 'bab'))

b앞에 한개 이상의 a가 있어야 한다는 뜻이다. 이렇게 하면 none이 출력되는데 a+b는 b앞에 한개 이상의 a가 있어야 하는 동시에 a앞에는 아무것도 없어야 한다.

print(re.match('[a-z]*a+b', 'baba'))
print(re.match('[a-z]+a+b', 'baba'))

a-z까지의 문자열이 나오고 그 후에 a가 나오면 되서 매치는 bab가 된다.

문자, 숫자의 갯수 지정도 가능하다. 1개가 아니라 2개나 3개가 나와야 한다든지 이다.

print(re.match('m{3}', 'mmmoney'))

m이 3번 반복되는 의미이다. 결과는 mmm을 찾아 준다. 주의할점은 m 앞에는 아무것도 없어야 한다. (뭔가 있으면 그 앞에 범위를 넣어주면 될듯)

print(re.match('[0-9]{3}-[0-9]{4}-[0-9]{4}','010-1234-1234'))

0-9까지의 숫자 3개, 4개, 4개가 나오는 것이고 숫자를 넣어주면 매치되는지 찾아 준다. 즉 전화번호를 정규식으로 표현해 준것이다.

이제 숫자와 문자를 조합해 보자.

print(re.match('[a-zA-Z0-9]+', 'Seoul2020'))

소문자, 대문자, 숫자후 1개 이상 찾아 주는것을 넣고 넣어주면 찾아 주게 된다. 하지만 중간에 대문자를 빼주면 none이 출력된다.

정규표현식은 영어뿐 아니라 한글에서도 적용가능하다. 다만 영어는 알파벳이지만 한글은 조합할수 있는 모든 경우를 표현해 줘야 한다.

print(re.match('[가-힝]+', '홍길동'))

[가-힝]으로 표시하면 한글로 조합할수 있는 모든 글자라는 의미이다.

import re
!import ujson
from collections import Counter
!from konlpy.tag import Hannanum

def split_sentences(text):
    sentences = re.split("(?<=[.?!])", text) 
    return sentences 
return sentences

위 코드는 웹에 게제된 신문 기사를 가져와서 확인하는 실제 코드의 일부이다.

다른 건 몰라도 여기에 정규식이 보인다. sentences = re.split("(?<=[.?!])", text)

문장을 한줄씩 자르기 위한 정규표현식이다. 공백 말고 문장이 어떻게 끝나 보면 .?!이다. 이 표시가 나오면 문장을 끝어 주라는 의미이다. 실제로는 더 복잡하다.

실습

펭투더수, 에투더디에서 투더를 찾아보자.

import re

Ist = ['펭투더수', '에투더디', '포안녕비', '포투디비']

reg = re.compile(r'[가-힣](투더)[가-힣]')
for m in Ist:
    if reg.match(m): 
        print (m) 

compile 정규식에서 앞쪽에 범위 넣어주고 투더 넣고 뒤쪽에 범위 넣어 주고 for 문으로 반복 시켜 주면 된다.

요약

정규표현식은 데이터 전처리를 위한 필수 요소이다.

.^$*+?{}[]₩|() 등의 메타 문자를 활용해야 한다.

re모듈의 match(), search()함수는 꼭 기억하자.

메타 문자가 익숙하지 않겠지만, 익숙해 지면 전처리에 쉽게 할수 있다.

이제 기본적인 파이썬 문법은 거의다 습득했다. ( 벌써?????)

공유하기
카카오로 공유하기
페이스북 공유하기
트위터로 공유하기
url 복사하기
조회수 : 191
heart
T
페이지 기반 대답
AI Chat