불용어(Stopword), 정규 표현식(Regular Expression)

ganta·2021년 3월 3일
0

자연어 전처리

목록 보기
5/8
post-thumbnail

이 글은 Wikidocks의 딥 러닝을 이용한 자연어 치리 입문을 공부한 내용을 정리 한 글입니다.

✔️ 갖고 있는 데이터에서 유의미한 토큰만을 선별하기 위해 큰 의미가 없는 단어 토큰을 제거하는 작업
예시)
I, my, me, over, 조사, 접미사 같은 단어는 자주 나오지만 실제 의미 분석을 하는데 거의 기여하는 바가 없다 -> 이러한 불용어들을 미리 패키지에 정의하고 있다.

NLTK의 불용어 종류

from nltk.corpus import stopwords  
stopwords.words('english')[:5]
['i', 'me', 'my', 'myself', 'we']

NLTK를 통한 불용어 제거하기


from nltk.corpus import stopwords 
from nltk.tokenize import word_tokenize 

example = "I like you"
stop_words = set(stopwords.words('english')) 

word_tokens = word_tokenize(example)

result = [w for w in word_tokens if w not in stop_words] 

print(word_tokens) 
print(result)
['I', 'like', 'you']
['I', 'like']

한국어에서 불용어 제거하기


from nltk.corpus import stopwords 
from nltk.tokenize import word_tokenize 

example = "고기를 잡으러 바다로 가요"
stop_words = "가요" # 불용어 임의 선정
stop_words=stop_words.split(' ')
word_tokens = word_tokenize(example)

result = [w for w in word_tokens if w not in stop_words] 

print(word_tokens) 
print(result)
['고기를', '잡으러', '바다로', '가요']
['고기를', '잡으러', '바다로']

⭐️ 한국어 불용어를 제거하는 더 좋은 경우로는 코드 내에서 작성하기 보단 txt파일, cvs파일로 수많은 불용어를 정리해놓고, 이를 불러와서 사용하는 방법을 취하게 된다.

정규식 표현 예제


정규 표현식

✔️ . 기호
임의의 한 개의 문자를 나타낸다.

import re
r=re.compile("a.c")
print(r.search("aab"))
print(r.search("abc"))
None
<re.Match object; span=(0, 3), match='abc'>

✔️ ? 기호
? 앞의 문자가 존재할 수도 존재를 안할 수도 있는 경우를 나타낸다.

import re
r=re.compile("ab?c")
print(r.search("abbc"))
print(r.search("ac"))
print(r.search("abc"))
None
<re.Match object; span=(0, 2), match='ac'>
<re.Match object; span=(0, 3), match='abc'>

✔️ * 기호
바로 앞의 문자가 0개 이상일 경우를 나타낸다.

import re
r=re.compile("ab*c")
print(r.search("ac"))
print(r.search("abc"))
print(r.search("abbc"))
<re.Match object; span=(0, 2), match='ac'>
<re.Match object; span=(0, 3), match='abc'>
<re.Match object; span=(0, 4), match='abbc'>

✔️ + 기호
앞의 문자가 1개 이상일 경우를 나타낸다.

import re
r=re.compile("ab+c")
print(r.search("ac"))
print(r.search("abc"))
print(r.search("abbc"))
None
<re.Match object; span=(0, 3), match='abc'>
<re.Match object; span=(0, 4), match='abbc'>

✔️ ^ 기호
시작되는 글자를 지정한다.

import re
r=re.compile("^a")
print(r.search("bba"))
print(r.search("a"))
print(r.search("ab"))
None
<re.Match object; span=(0, 1), match='a'>
<re.Match object; span=(0, 1), match='a'>

✔️ {숫자} 기호
해당 문자를 숫자만큼 반복한 것을 나타낸다.

import re
r=re.compile("ab{2}c")
print(r.search("ac"))
print(r.search("abc"))
print(r.search("abbc"))
None
None
<re.Match object; span=(0, 4), match='abbc'>

✔️ {숫자1, 숫자2} 기호
해당 문자를 숫자1이상 숫자2이하 반복한 것을 나타낸다.

import re
r=re.compile("ab{1,2}c")
print(r.search("ac"))
print(r.search("abc"))
print(r.search("abbc"))
print(r.search("abbbc"))
None
<re.Match object; span=(0, 3), match='abc'>
<re.Match object; span=(0, 4), match='abbc'>
None

✔️ {숫자, }기호
해당 문자를 숫자 이상 반복한 것을 나타낸다.

import re
r=re.compile("a{2,}bc")
print(r.search("bc"))
print(r.search("abc"))
print(r.search("aabc"))
None
None
<re.Match object; span=(0, 4), match='aabc'>

✔️ [ ] 기호
[ ]에 문자를 넣으면 그 문자들 중 한 개의 문자와 매치(포함을 하고 있으면 된다.)

import re
r=re.compile("[abc]") 
print(r.search("d"))
print(r.search("dc"))
print(r.search("aabbcc"))
None
<re.Match object; span=(1, 2), match='c'>
<re.Match object; span=(0, 1), match='a'>
import re
r=re.compile("[a-c]") 
print(r.search("d"))
print(r.search("dc"))
print(r.search("aabbcc"))
None
<re.Match object; span=(1, 2), match='c'>
<re.Match object; span=(0, 1), match='a'>

✔️ [^문자] 기호
^기호 뒤어 붙은 문자들을 제외한 모든 문자를 매치

import re
r=re.compile("[^abc]")
print(r.search("d"))
print(r.search("dc"))
print(r.search("aabbcc"))
<re.Match object; span=(0, 1), match='d'>
<re.Match object; span=(0, 1), match='d'>
None

정규 표현식 모듈 함수

✔️ re.match() 와 re.search()
search함수는 표현식 전체에 대하여 문자열이 매치하는지 판별하는 한편 match함수는 문자열의 첫 부분부터 정규 표현식과 매치하는지 파악

import re
r=re.compile("ab.")
print(r.search("ddabc"))
print(r.match("ddabc"))
<re.Match object; span=(2, 5), match='abc'>
None

✔️ split()
입력된 정규 표현식을 기준으로 문자열들을 분리하여 리스트로 리턴

import re
text="aa bb cc dd"
print(re.split(" ",text))
text="aa+bb+cc+dd"
print(re.split("\+",text))
['aa', 'bb', 'cc', 'dd']
['aa', 'bb', 'cc', 'dd']

✔️ findall()
정규 표현식과 매치되는 모든 문자열들을 리스트로 나타낸다.

import re
text="aa bb cc dd"
print(re.findall("[a-z]",text))
print(re.findall("\w+",text))
['a', 'a', 'b', 'b', 'c', 'c', 'd', 'd']
['aa', 'bb', 'cc', 'dd']

✔️ sub()
정규 표현식 패턴과 일치하는 문자열을 찾아 다른 문자열로 대체

import re
text="aa bb cc dd"
print(re.sub("\w+","switch",text))
switch switch switch switch

✔️ 정규 표현식을 이용한 토큰화
NLTK는 정규 표현식을 사용하여 토큰화를 하게 해 주는 RegexpTokenizer를 지원한다.

import nltk
from nltk.tokenize import RegexpTokenizer
tokenizer=RegexpTokenizer("[\w]+")
print(tokenizer.tokenize("Don't forget my name"))
['Don', 't', 'forget', 'my', 'name']
profile
한걸음씩 꾸준히

0개의 댓글