자연어 처리 - 토큰화(Tokenization)
2024. 7. 17. 18:24ㆍCNN, RNN, LSTM
📍 자연어 처리 기초 - 토큰화(Tokenization)
- 자연어 처리에서 크롤링 등으로 얻어낸 코퍼스 데이터가 필요에 맞게 전처리되지 않은 상태라면, 해당 데이터를 사용하고자하는 용도에 맞게 토큰화(tokenization) & 정제(cleaning) & 정규화(normalization)하는 일을 해야함
- 주어진 코퍼스(corpus)에서 토큰(token)이라 불리는 단위로 나누는 작업을 토큰화(tokenization)라고 부릅니다
✅ 단어 토큰화(Word Tokenization)
- 토큰의 기준을 단어(word)로 하는 경우, 단어 토큰화(word tokenization)
- 단어(word)는 단어 단위 외에도 단어구, 의미를 갖는 문자열 포함
- 입력: Time is an illusion. Lunchtime double so!
- 출력: 출력 : "Time", "is", "an", "illustion", "Lunchtime", "double", "so"
✅ 토큰화 기준
- 토큰화의 기준을 생각해봐야 하는 경우가 발생
- 입력: Don't be fooled by the dark sounding name, Mr. Jone's Orphanage is as cheery as cheery goes for a pastry shop.
- '가 문제가 되는 경우: Don't와 Jone's를 어떻게 해야할까?
- Don't
- Don t
- Dont
- Do n't
- Jone's
- Jone s
- Jone
- Jones
- NLTK는 영어 코퍼스를 토큰화하기 위한 도구들을 제공
import nltk
nltk.download('punkt')

from nltk.tokenize import word_tokenize
from nltk.tokenize import WordPunctTokenizer
# word_tokenize 실습
print('단어 토큰화1 : ', word_tokenize("Don't be fooled by the dark sounding name, Mr. Jone's Orphanage is as cheery as cheery goes for a pastry shop"))

- 📌 word_tokenize는 Don't를 Do와 n't로 분리하였으며, 반면 Jone's는 Jone과 's로 분리한 것을 확인할 수 있습니다.
# WordPunctTokenizer 실습
print('단어 토큰화2 : ', WordPunctTokenizer().tokenize("Don't be fooled by the dark sounding name, Mr. Jone's Orphanage is as cheery as cheery goes for a pastry shop"))

- 📌 WordPunctTokenizer는 구두점을 별도로 분류하는 특징을 갖고 있기 때문에, 앞서 확인했던 word_tokenize와는 달리 Don't를 Don과 '와 t로 분리하였습니다
✅ 토큰화에서 고려해야할 사항
1. 구두점이나 특수 문자를 단순 제외해서는 안 된다
- 갖고있는 코퍼스에서 단어들을 걸러낼 때, 구두점이나 특수 문자를 단순히 제외하면 안 됩니다
- 마침표(.)와 같은 경우는 문장의 경계를 알 수 있는데 도움이 되겠죠?
- m.p.h나 Ph.D나 AT&T
- $45.55와 같은 가격을 의미 하기도 하고, 01/02/06은 날짜를 의미
- 123,456,789
2. 줄임말과 단어 내에 띄어쓰기가 있는 경우
- 토큰화 작업에서 종종 영어권 언어의 아포스트로피(')는 압축된 단어를 다시 펼치는 역할
- what're는 what are의 줄임말 -> re는 접어(clitic)
- 사용 용도에 따라서, 하나의 단어 사이에 띄어쓰기가 있는 경우에도 하나의 토큰으로 봐야하는 경우도 있을 수 있으므로, 토큰화 작업은 저러한 단어를 하나로 인식할 수 있는 능력도 가져야합니다.
3. Penn Treebank Tokenization
규칙 1. 하이푼으로 구성된 단어는 하나로 유지한다. 규칙 2. doesn't와 같이 아포스트로피로 '접어'가 함께하는 단어는 분리해준다.
from nltk.tokenize import TreebankWordTokenizer
tokenizer = TreebankWordTokenizer()
text = "Starting a home-based restaurant may be an ideal. it doesn't have a food chain or restaurant of their own."
print('트리뱅크 워드토크나이저 : ', tokenizer.tokenize(text))

- 📌 결과를 보면, 각각 규칙1과 규칙2에 따라서 home-based는 하나의 토큰으로 취급하고 있으며, dosen't의 경우 does와 n't는 분리되었음을 볼 수 있습니다.
✅ 문장 토큰화(Sentence Tokenization)
- 코퍼스 내에서 문장 단위로 구분하는 작업으로 때로는 문장 분류(sentence segmentation)라고도 부릅니다.
- 코퍼스가 정제되지 않은 상태라면, 코퍼스는 문장 단위로 구분되어 있지 않아서 이를 사용하고자 하는 용도에 맞게 문장 토큰화가 필요하겠죠?
- 그렇다면 문장 단위 구분의 기준은 무엇일까요?
- 마침표, 느낌표, 물음표는 모호함!
- EX1) IP 192.168.56.31 서버에 들어가서 로그 파일 저장해서 aaa@gmail.com로 결과 좀 보내줘. 그 후 점심 먹으러 가자.
- EX2) Since I'm actively looking for Ph.D. students, I get the same question a dozen times every year.
- 사용하는 코퍼스가 어떤 국적의 언어인지, 또는 해당 코퍼스 내에서 특수문자들이 어떻게 사용되고 있는지에 따라서 직접 규칙들을 정의
# sent_tokenize는 영어 문장의 토큰화를 수행
from nltk.tokenize import sent_tokenize
text = "His barber kept his word. But keeping such a huge secret to himself was driving him crazy. Finally, the barber went up a mountain and almost to the edge of a cliff. He dug a hole in the midst of some reeds. He looked about, to make sure no one was near."
print('문장 토큰화1 : ', sent_tokenize(text))

📌 문장 중간에 마침표가 다수 등장하는 경우는?
text = "I am actively looking for Ph.D. students. and you are a Ph.D student."
print('문장 토큰화2 : ', sent_tokenize(text))

✅ 한국어 문장 토큰화 도구
- KSS(Korean Sentence Splitter)
pip install kss

- 📌 어순 => 어순이 별로 안 중요하다
- 나는 점심을 먹었습니다.
- 나는 먹었습니다. 점심을
- 점심을 먹었습니다.
- 저는 점심을 먹었습니다.
- 교착어
- 조사 : 은, 는, 이, 가 => 같은 단어라도 variation이 많다!
- 조사나 접사를 분리하는 것이 중요한 과제
- 띄어쓰기가 안 지켜진다 / 안 중요하다
- 띄어쓰기가 지켜진 코퍼스가 잘 없다 -> 토큰 분리가 어렵다
import kss
text = '딥 러닝 자연어 처리가 재미있기는 합니다. 그런데 문제는 영어보다 한국어로 할 때 너무 어렵습니다. 이제 해보면 알걸요?'
print('한국어 문장 토큰화 : ', kss.split_sentences(text))

✅ 한국어에서의 토큰화의 어려움
- 영어는 New York과 같은 합성어나 he's 와 같이 줄임말에 대한 예외처리만 한다면, 띄어쓰기(whitespace)를 기준으로 하는 띄어쓰기 토큰화를 수행해도 단어 토큰화가 잘 작동합니다
- 거의 대부분의 경우에서 단어 단위로 띄어쓰기가 이루어지기 때문에 띄어쓰기 토큰화와 단어 토큰화가 거의 같기 때문
- 한국어의 경우에는 띄어쓰기 단위가 되는 단위를 '어절'이라고 하는데 어절 토큰화는 한국어 NLP에서 지양되고 있습니다.
- 근본적인 이유는 한국어가 영어와는 다른 형태를 가지는 언어인 교착어라는 점에서 기인
- 교착어란 조사, 어미 등을 붙여서 말을 만드는 언어
📢 교착어의 특성
- 영어와는 달리 한국어에는 조사라는 것이 존재
- 그라는 단어 하나에도 '그가', '그에게', '그를', '그와', '그는'과 같이 다양한 조사가 '그'라는 글자 뒤에 띄어쓰기 없이 바로 붙게됩니다.
- 따라서, 대부분의 한국어 NLP에서 조사는 분리해줄 필요가 있습니다.
한국어 토큰화에서는 형태소(morpheme) 란 개념을 반드시 이해해야 합니다. 형태소(morpheme)란 뜻을 가진 가장 작은 말의 단위를 말합니다. 이 형태소에는 두 가지 형태소가 있는데 자립 형태소와 의존 형태소입니다.
- 자립 형태소: 접사, 어미, 조사와 상관없이 자립하여 사용할 수 있는 형태소. 그 자체로 단어가 됩니다. 체언(명사, 대명사, 수사), 수식언(관형사, 부사), 감탄사 등이 있습니다
- 의존 형태소 : 다른 형태소와 결합하여 사용되는 형태소. 접사, 어미, 조사, 어간을 말합니다.
- 문장 : 에디가 책을 읽었다.
- 단위 토큰화를 수행
- ['에디가', '책을', '읽었다']
- 형태소 단위 분해
- 자립 형태소 : 에디, 책
- 의존 형태소 : -가, -을, 읽-, -었, -다
- 단위 토큰화를 수행
📢 한국어는 띄어쓰기가 영어보다 잘 지켜지지 않는다
- 사용하는 한국어 코퍼스가 뉴스 기사와 같이 띄어쓰기를 철저하게 지키려고 노력하는 글이라면 좋겠지만, 많은 경우에 띄어쓰기가 틀렸거나 지켜지지 않는 코퍼스가 많습니다.
- 한국어는 영어권 언어와 비교하여 띄어쓰기가 어렵고 잘 지켜지지 않는 경향이 있습니다. 그 이유는 여러 견해가 있으나, 가장 기본적인 견해는 한국어의 경우 띄어쓰기가 지켜지지 않아도 글을 쉽게 이해할 수 있는 언어라는 점입니다.
- EX1) 제가이렇게띄어쓰기를전혀하지않고글을썼다고하더라도글을이해할수있습니다.
- EX2) Tobeornottobethatisthequestion
- 결론적으로 한국어는 수많은 코퍼스에서 띄어쓰기가 무시되는 경우가 많아 자연어 처리가 어려워졌다는 것입니다.
📢 품사 태깅(Part-of-speech tagging)
- 단어는 표기는 같지만 품사에 따라서 단어의 의미가 달라지기도 합니다.
- 영어 단어 'fly'는 동사로는 '날다'라는 의미를 갖지만, 명사로는 '파리'라는 의미
- 결국 단어의 의미를 제대로 파악하기 위해서는 해당 단어가 어떤 품사로 쓰였는지 보는 것이 주요 지표
- 단어 토큰화 과정에서 각 단어가 어떤 품사로 쓰였는지를 구분해놓기도 하는데, 이 작업을 품사 태깅(part-of-speech tagging)이라고 부름!
nltk.download('averaged_perceptron_tagger')

# NLTK에서는 Penn Treebank POS Tags라는 기준을 사용하여 품사를 태깅
from nltk.tokenize import word_tokenize
from nltk.tag import pos_tag
text = "I am actively looking for Ph.D. students. and you are a Ph.D. student."
tokenized_sentence = word_tokenize(text)
print('단어 토큰화 : ', tokenized_sentence)
print('품사 태깅 : ', pos_tag(tokenized_sentence))

📌 Penn Treebank POG Tags에서 PRP는 인칭 대명사, VBP는 동사, RB는 부사, VBG는 현재부사, IN은 전치사, NNP는 고유 명사, NNS는 복수형 명사, CC는 접속사, DT는 관사를 의미
- 한국어 자연어 처리를 위해서는 KoNLPy(코엔엘파이)라는 파이썬 패키지를 사용
- 코엔엘파이를 통해서 사용할 수 있는 형태소 분석기로 Okt(Open Korea Text), 메캅(Mecab), 코모란(Komoran), 한나눔(Hannanum), 꼬꼬마(Kkma) 존재
pip install konlpy

from konlpy.tag import Okt
from konlpy.tag import Kkma
okt = Okt()
kkma = Kkma()
print('OKT 형태소 분석 : ', okt.morphs("열심히 코딩한 당신, 연휴에는 여행을 가봐요"))
print('OKT 품사 태깅 : ', okt.pos("열심히 코딩한 당신, 연휴에는 여행을 가봐요"))
print('OKT 명사 추출 : ', okt.nouns("열심히 코딩한 당신, 연휴에는 여행을 가봐요"))

📌 1) morphs : 형태소 추출 2) pos : 품사 태깅(Part-of-speech tagging) 3) nouns : 명사 추출
- 코엔엘파이의 형태소 분석기들은 공통적으로 이 메소드들을 제공
- 조사를 기본적으로 분리하고 있음
# 꼬꼬마
print('꼬꼬마 형태소 분석 : ', kkma.morphs("열심히 코딩한 당신, 연휴에는 여행을 가봐요"))
print('꼬꼬마 품사 태깅 : ', kkma.pos("열심히 코딩한 당신, 연휴에는 여행을 가봐요"))
print('꼬꼬마 명사 추출 : ', kkma.nouns("열심히 코딩한 당신, 연휴에는 여행을 가봐요"))

📍 자연어 처리 기초 - 텍스트 데이터의 정제와 정규화
- 정제(cleaning) : 갖고 있는 코퍼스로부터 노이즈 데이터를 제거한다.
- 정제 작업은 토큰화 작업에 방해가 되는 부분들을 배제시키고 토큰화 작업을 수행하기 위해서 토큰화 작업보다 앞서 이루어지기도 하지만, 토큰화 작업 이후에도 여전히 남아있는 노이즈들을 제거하기위해 지속적으로 이루어지기도 합니다.
- 사실 완벽한 정제 작업은 어려운 편이라서, 대부분의 경우 이 정도면 됐다.라는 일종의 합의점을 찾습니다!
- 정규화(normalization) : 표현 방법이 다른 단어들을 통합시켜서 같은 단어로 만들어준다.
✅ 1. 규칙에 기반한 표기가 다른 단어들의 통합
- 필요에 따라 직접 코딩을 통해 정의할 수 있는 정규화 규칙의 예로서 같은 의미를 갖고있음에도, 표기가 다른 단어들을 하나의 단어로 정규화하 는 방법을 사용할 수 있습니다.
- USA와 US는 같은 의미를 가지므로 하나의 단어로 정규화해볼 수 있습니다.
✅ 2. 대, 소문자 통합
- 영어권 언어에서 대, 소문자를 통합하는 것은 단어의 개수를 줄일 수 있는 또 다른 정규화 방법
- 대부분의 글은 소문자로 작성되기 때문에 대, 소문자 통합 작업은 대부분 대문자를 소문자로 변환하는 소문자 변환작업
- 소문자 변환이 왜 유용할까?
- Automobile이라는 단어가 문장의 첫 단어였기때문에 A가 대문자였다고 생각해봅시다. 여기에 소문자 변환을 사용하면, automobile을 찾는 질의(query)의 결과로서 Automobile도 찾을 수 있게 됩니다.
- 대문자와 소문자를 무작정 통합해서는 안 됩니다. -> 사람 이름, 회사 이름
✅ 3. 불필요한 단어의 제거
- 정제 작업에서 제거해야하는 노이즈 데이터(noise data)는 자연어가 아니면서 아무 의미도 갖지 않는 글자들(특수 문자 등)을 의미하기도 하지만, 분석하고자 하는 목적에 맞지 않는 불필요 단어들을 노이즈 데이터라고 하기도 합니다.
- 불필요 단어들을 제거하는 방법으로는 불용어 제거와 등장 빈도가 적은 단어, 길이가 짧은 단어들을 제거하는 방법이 있습니다.
- (1) 등장 빈도가 적은 단어
- 텍스트 데이터에서 너무 적게 등장해서 자연어 처리에 도움이 되지 않는 단어들이 존재
- 100,000개의 메일 데이터에서 총 합 5번 밖에 등장하지 않은 단어가 있다면 이 단어는 직관적으로 분류에 거의 도움이 되지 않을 것임을 알 수 있습니다.
- (2) 길이가 짧은 단어
- 영어권 언어에서는 길이가 짧은 단어를 삭제하는 것만으로도 어느정도 자연어 처리에서 크게 의미가 없는 단어들을 제거하는 효과를 볼 수 있다고 알려져 있습니다.
- 그러나 한국어에서는 길이가 짧은 단어라고 삭제하는 이런 방법이 크게 유효하지 않을 수 있습니다
- (3) 불용어 제거
- 실제 의미 분석을 하는데는 거의 기여하는 바가 없는 단어들이 불용어
- NLTK에서는 위와 같은 100여개 이상의 영어 단어들을 불용어로 패키지 내에서 미리 정의
- 불용어는 개발자가 직접 정의할 수도 있습니다.
- (1) 등장 빈도가 적은 단어
# 길이가 짧은 단어 제거 실습
import re
text = "I was wondering if anyone out there could enlighten me on this car."
# 길이가 1~2인 단어들을 정규 표현식을 이용하여 삭제
shortword = re.compile(r'\W*\b\w{1,2}\b')
print(shortword.sub('', text))

from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
from konlpy.tag import Okt
📢 1. NLTK에서 불용어 확인하기
nltk.download('stopwords')

stop_words_list = stopwords.words('english')
print('불용어 개수 :', len(stop_words_list))
print('불용어 10개 출력 :',stop_words_list[:10])

📢 2. NLTK를 통해서 불용어 제거하기
example = "Family is not an important thing. It's everything."
stop_words = set(stopwords.words('english'))
word_tokens = word_tokenize(example)
result = []
for word in word_tokens:
if word not in stop_words:
result.append(word)
print('불용어 제거 전 : ', word_tokens)
print('불용어 제거 후 : ', result)

📢 3. 한국어에서 불용어 제거하기
- 한국어에서 불용어를 제거하는 방법으로는 간단하게는 토큰화 후에 조사, 접속사 등을 제거하는 방법이 있습니다.
- 불용어를 제거하려고 하다보면 조사나 접속사와 같은 단어들뿐만 아니라 명사, 형용사와 같은 단어들 중에서 불용어로서 제거하고 싶은 단어들이 생기기도 합니다.
- 직접 불용어 제거 사전을 정의해봅시다.
okt = Okt()
example = "고기를 아무렇게나 구우려고 하면 안 돼. 고기라고 다 같은 게 아니거든. 예컨대 삼겹살을 구울 때는 중요한 게 있지."
stop_words = "를 아무렇게나 구 우려 고 안 돼 같은 게 구울 때 는"
stop_words = set(stop_words.split(' ')) # 불용어 사전 만들기
word_tokens = okt.morphs(example) # 형태소 분석
result = [word for word in word_tokens if not word in stop_words]
print('불용어 제거 전 : ', word_tokens)
print('불용어 제거 후 : ', result)

📍 자연어 처리 기초 - 정규식
- 파이썬에서 지원하고 있는 정규 표현식 모듈 re의 사용 방법
- NLTK를 통한 정규 표현식을 이용한 토큰화
- 1) 정규 표현식 문법
- . => 한 개의 임의의 문자를 나타냅니다. (줄바꿈 문자인 \n는 제외)
- ? => 앞의 문자가 존재할 수도 있고, 존재하지 않을 수도 있습니다. (문자가 0개 또는 1개)
-
- => 앞의 문자가 무한개로 존재할 수도 있고, 존재하지 않을 수도 있습니다. (문자가 0개 이상)
-
- => 앞의 문자가 최소 한 개 이상 존재합니다. (문자가 1개 이상)
- ^ => 뒤의 문자열로 문자열이 시작됩니다.
- $ => 앞의 문자열로 문자열이 끝납니다.
- {숫자} => 숫자만큼 반복합니다.
- {숫자 1, 숫자 2} => 숫자1 이상 숫자2 이하만큼 반복합니다. ?, *, +를 이것으로 대체할 수 있습니다.
- {숫자,} => 숫자 이상만큼 반복합니다.
- => 대괄호 안의 문자들 중 한 개의 문자와 매치합니다. [amk]라고 한다면 a 또는 m 또는 k 중 하나라도 존재하면 매치를 의미합니다. [a-z]와 같이 범위를 지정할 수도 있습니다. [a-zA-Z]는 알파벳 전체를 의미하는 범위이며, 문자열에 알파벳이 존재하면 매치를 의미합니다.
- [^문자] => 해당 문자를 제외한 문자를 매치합니다.
- \\ => 역 슬래쉬 문자 자체를 의미합니다
- \d => 모든 숫자를 의미합니다. [0-9]와 의미가 동일합니다.
- \D => 숫자를 제외한 모든 문자를 의미합니다. [^0-9]와 의미가 동일합니다.
- \s => 공백을 의미합니다. [ \t\n\r\f\v]와 의미가 동일합니다.
- \S => 공백을 제외한 문자를 의미합니다. [^ \t\n\r\f\v]와 의미가 동일합니다.
- \w => 문자 또는 숫자를 의미합니다. [a-zA-Z0-9]와 의미가 동일합니다.
- \W => 문자 또는 숫자가 아닌 문자를 의미합니다. [^a-zA-Z0-9]와 의미가 동일합니다.
- 정규표현식 모듈 함수
- re.compile()
- 정규표현식을 컴파일하는 함수입니다. 다시 말해, 파이썬에게 전해주는 역할을 합니다. 찾고자 하는 패턴이 빈번한 경우에는 미리 컴파일해놓고 사용하면 속도와 편의성면에서 유리합니다.
- re.search()
- 문자열 전체에 대해서 정규표현식과 매치되는지를 검색합니다.
- re.match()
- 문자열의 처음이 정규표현식과 매치되는지를 검색합니다.
- re.split()
- 정규 표현식을 기준으로 문자열을 분리하여 리스트로 리턴합니다.
- re.findall()
- 문자열에서 정규 표현식과 매치되는 모든 경우의 문자열을 찾아서 리스트로 리턴합니다. 만약, 매치되는 문자열이 없다면 빈 리스트가 리턴됩니다.
- re.finditer()
- 문자열에서 정규 표현식과 매치되는 모든 경우의 문자열에 대한 이터레이터 객체를 리턴합니다.
- re.sub()
- 문자열에서 정규 표현식과 일치하는 부분에 대해서 다른 문자열로 대체합니다.
r = re.compile("a.c") # a와 c 사이에 1개의 문자가 올 수 있다
r.search("kkk") # 아무런 결과도 출력되지 않는다.
r.search("abc") # a와 c 사이에 b가 위치

r.search("akc") # a와 c 사이에 k가 위치

r = re.compile("ab?c") # 문자의 개수가 0 또는 1개
r.search("abbc") # 아무런 결과도 출력되지 않는다.
r.search("ac")

r = re.compile("ab*c") # 바로 앞에 위치한 문자가 0개 이상 -> 갯수 제한 없다!
r.search("a") # 아무런 결과도 출력되지 않는다.
r.search("ac")

r = re.compile("ab+c") # 문자가 1개 이상
r.search("ac") # 아무런 결과도 출력되지 않는다.
r.search("abc")

r.search("abbbbc")

r = re.compile("^ab")
# 아무런 결과도 출력되지 않는다.
r.search("bbc")
r.search("zab")
r.search("abfsafsafz")

r = re.compile("ab{2}c")
# 아무런 결과도 출력되지 않는다.
r.search("ac")
r.search("abc")
r.search("abbbbbc")
r.search("aabbca")

r = re.compile("ab{2,8}c")
# 아무런 결과도 출력되지 않는다.
r.search("ac")
r.search("abc")
r.search("abbbbbbbbbc")
r.search("abbc")

r.search("abbbbbbbbc")

r = re.compile("[a-f]") # [abc]는 [a-c]와 같다.
r.search("zzz") # 아무런 결과도 출력되지 않는다.
r.search("f")

r.search("aaaaaaa")

r = re.compile("[a-zA-Z]")
# 아무런 결과도 출력되지 않는다.
r.search("111")
r.search("aBC")

r = re.compile("[^abc]")
# 아무런 결과도 출력되지 않는다.
r.search("a")
r.search("ab")
r.search("b")
r.search("d")

r.search("1")

📢 (1) re.match() 와 re.search()의 차이
- search()가 정규 표현식 전체에 대해서 문자열이 매치하는지를 본다면, match()는 문자열의 첫 부분부터 정규 표현식과 매치하는지를 확인합니다.
- 문자열 중간에 찾을 패턴이 있더라도 match 함수는 문자열의 시작에서 패턴이 일치하지 않으면 찾지 않습니다.
r = re.compile("ab.")
r.match("kkkabc") # 아무런 결과도 출력되지 않는다.
r.search("kkkabc")

r.match("abckkk")

📢 (2) re.split()
- split() 함수는 입력된 정규 표현식을 기준으로 문자열들을 분리하여 리스트로 리턴합니다.
- 토큰화에 유용
# 공백 기준 분리
text = "사과 딸기 수박 메론 바나나"
re.split(" ", text)

# 줄바꿈 기준 분리
text = """사과
딸기
수박
메론
바나나"""
re.split("\n", text)

# '+'를 기준으로 분리
text = "사과+딸기+수박+메론+바나나"
re.split("\+", text)

📢 (3) re.findall()
- indall() 함수는 정규 표현식과 매치되는 모든 문자열들을 리스트로 리턴합니다. 단, 매치되는 문자열이 없다면 빈 리스트를 리턴합니다.
text = """이름 : 김철수
전화번호 : 010 - 1234 - 1234
나이 : 30
성별 : 남"""
re.findall("\d+", text)

re.findall("\d+", "문자열입니다.")

📢 (4) re.sub()
- sub() 함수는 정규 표현식 패턴과 일치하는 문자열을 찾아 다른 문자열로 대체할 수 있습니다. 아래와 같은 정제 작업에 많이 사용되는데, 영어 문장에 각주 등과 같은 이유로 특수 문자가 섞여있는 경우에 특수 문자를 제거하고 싶다면 알파벳 외의 문자는 공백으로 처리하는 등의 용도로 쓸 수 있습니다.
text = "Regular expression : A regular expression, regex or regexp[1] (sometimes called a rational expression)[2][3] is, in theoretical computer science and formal language theory, a sequence of characters that define a search pattern."
preprocessed_text = re.sub('[^a-zA-Z]', ' ', text)
print(preprocessed_text)

'CNN, RNN, LSTM' 카테고리의 다른 글
PC (0) | 2024.07.23 |
---|---|
문자 단위 RNN (Char RNN) (1) | 2024.07.16 |
순환 신경망 (0) | 2024.07.16 |
Pytorch (0) | 2024.07.15 |