본문 바로가기

[NLP] 자연어 처리/[NLP] 전처리

[NLP] 정규 표현식 - 실습(python)


 

김기현의 자연어 처리 딥러닝 캠프 - 파이토치편

 

kh-kim.gitbook.io

자연어 처리 공부를 위해 해당 책을 선정하였으며, 책을 메인으로 공부하며 구글링과 함께 정리를 한 게시글입니다.


sentence = "Hello Ki, I would like to introduce regular expression in this section.\n" + \
           "~~\n" + \
           "Thank you!\n" + \
           "Sincerely,\n\n" + \
           "Ki: +82-10-1234-5678"

데이터에 있는 전화번호와 이름을 없앨 예정입니다.

해당 데이터의 경우 마지막 줄을 삭제해도 되겠지만 전화번호와 이름을 무조건 마지막에 온다는 법은 없습니다.

 

데이터를 얼추 살펴보면 규칙은 다음과 같습니다.

  • 이름이 전화번호 앞에 나올 수도 있다.
  • 이름 뒤에 콜론(:)이 나올 수도 있다.
  • 콜론 앞/뒤로는 (탭을 포함한) 공백이 다수 존재할 수도 있다.
  • 전화번호는 국가번호를 포함할 수도 있다.
  • 국가번호는 최대 3자리이다.
  • 국가번호의 앞에는 '+'가 붙을 수도 있다.
  • 전화번호 사이에는 공백이 없다.
  • 전화번호 사이에 '-'가 들어갈 수도 있다.
  • 지역번호 자리의 맨 처음에 나오는 0은 빠질 수도 있다. 즉, 2자리가 될 수도 있다.
  • 지역번호 다음 번호 그룹은 3에서 4자리 숫자이다.
  • 마지막은 항상 4자리 숫자이다.

 

앞의 규칙을 정규 표현식으로 표현해보겠습니다.

 

정규 표현식 : ([\w]+\s*:?\s*)?

  • 이름이 전화번호 앞에 나올 수도 있다.                                  [\w]+
  • 이름 뒤에 콜론(:)이 나올 수도 있다.                                      :?
  • 콜론 앞/뒤로는 (탭을 포함한) 공백이 다수 존재할 수도 있다.     \s*:\s*

정규 표현식 : (\+?[0-9]{1,3}\-?)?

  • 전화번호는 국가번호를 포함할 수도 있다.                                                      (국가번호)?
  • 국가번호는 최대 3자리이다.                                                                         [0-9]{1,3}
  • 국가번호의 앞에는 '+'가 붙을 수도 있다.                                                         \+? 국가번호
  • 전화번호 사이에는 공백이 없다.

정규 표현식 : [0-9]{2,3}\-?[0-9]{3,4}\-?[0-9]{4}

  • 전화번호 사이에 '-'가 들어갈 수도 있다.                                                           \-?
  • 지역번호 자리의 맨 처마에 나오는 0은 빠질 수도 있다. 즉, 2자리가 될 수도 있다.      [0-9]{2,3}
  • 지역번호 다음 번호 그룹은 3에서 4자리 숫자이다.                                              [0-9]{3,4}
  • 마지막은 항상 4자리 숫자이다.                                                                      [0-9]{4}

최종 정규 표현식 : ([\w]+\s*:?\s*)?(\+?[0-9]{1,3}\-?)?[0-9]{2,3}\-?[0-9]{3,4}\-?[0-9]{4}


import re

sentence = "Hello Ki, I would like to introduce regular expression in this section.\n" + \
           "~~\n" + \
           "Thank you!\n" + \
           "Sincerely,\n\n" + \
           "Ki: +82-10-1234-5678"

regex = r"([\w]+\s*:?\s*)?(\+?[0-9]{1,3}\-?)?[0-9]{2,3}\-?[0-9]{3,4}\-?[0-9]{4}"

print('----------------------------------------------')
print(sentence)
print('----------------------------------------------')
print(re.sub(regex, "Removed!!!", sentence))

 

 

올바르게 제거가 된 것을 볼 수 있다.

'[NLP] 자연어 처리 > [NLP] 전처리' 카테고리의 다른 글

[NLP] NLTK, NLTK data 설치  (0) 2021.02.01
[NLP] 전처리 - 1  (0) 2021.01.22