# 텍스트 전처리(Text preprocessing)
- 용도에 맞게 텍스트를 사전에 처리하는 작업
# 토큰화(Tokenization)
- 주어진 corpus에서 토큰(token) 단위로 나누는 작업
- 토큰의 단위는 상황에 따라 다르지만 보통 의미 있는 단위로 토큰을 정의함
- 토큰화 작업 전, 후에 텍스트 데이터를 용도에 맞게 정제 및 정규화하는 일을 함
# 정제(Cleaning)
- 갖고 있는 코퍼스로부터 노이즈 데이터를 제거
# 정규화(Normalization)
- 표현 방법이 다른 단어들을 통합시켜서 같은 단어로 만들어줌
# 단어 토큰화(Word Tokenization)
- 이때의 단어는 단어 단위 외에도 단어구, 의미를 갖는 문자열로 간주되기도 함
- 구두점이나 특수문자를 전부 제거하면 토큰이 의미를 잃어버리는 경우가 발생하기도 함
- 토큰화 중 생기는 선택의 순간
- 어떤 용도로 사용할 것인지에 따라 용도에 영향이 없는 기준으로 결정하면 됨
- NLTK(Natural Language Toolkit)
- 파이썬 프로그래밍 언어로 작성된 영어용 기호 및 통계 자연어 처리를 위한 라이브러리 및 프로그램 모음
- 영어 코퍼스를 토큰화하기 위한 도구 제공
- word_tokenize
- Don't => 'Do', "n't"
- Jone's => 'Jone', "'s"
- WordPunctTokenizer
- 구두점을 별도로 분류하는 특징을 갖고 있음
- Don't => 'Don', "'", 't'
- Jone's => 'Jone', "'", 's'
- Keras
- 파이썬으로 작성된 오픈 소스 신경망 라이브러리
- text_to_word_sequence
- 모든 알파벳을 소문자로 바꾸면서 콤마, 느낌표 등의 구두점 제거
- But! don't나 jone's와 같은 경우 '는 보존
import nltk
nltk.download('punkt')
from nltk.tokenize import word_tokenize
from nltk.tokenize import WordPunctTokenizer
from tensorflow.keras.preprocessing.text import text_to_word_sequence
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."))
# 단어 토큰화1 : ['Do', "n't", 'be', 'fooled', 'by', 'the', 'dark', 'sounding', 'name', ',', 'Mr.', 'Jone', "'s", 'Orphanage', 'is', 'as', 'cheery', 'as', 'cheery', 'goes', 'for', 'a', 'pastry', 'shop', '.']
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."))
# 단어 토큰화2 : ['Don', "'", 't', 'be', 'fooled', 'by', 'the', 'dark', 'sounding', 'name', ',', 'Mr', '.', 'Jone', "'", 's', 'Orphanage', 'is', 'as', 'cheery', 'as', 'cheery', 'goes', 'for', 'a', 'pastry', 'shop', '.']
print('단어 토큰화3 :',text_to_word_sequence("Don't be fooled by the dark sounding name, Mr. Jone's Orphanage is as cheery as cheery goes for a pastry shop."))
# 단어 토큰화3 : ["don't", 'be', 'fooled', 'by', 'the', 'dark', 'sounding', 'name', 'mr', "jone's", 'orphanage', 'is', 'as', 'cheery', 'as', 'cheery', 'goes', 'for', 'a', 'pastry', 'shop']
- 고려해야할 상황
- 구두점이나 특수 문자를 단순 제외해서는 안 됨
- 단어 자체에 구두점을 갖고 있는 경우 존재
ex) Ph.D, m.p.h - 소수점을 의미하는 용도로 구두점 사용
ex) 45.55 - 가격을 의미하는 용도로 $ 사용
ex) $45 - 날짜를 의미하는 용도로 / 사용
ex) 01/02/06 - 콤마가 숫자 사이에 들어가는 경우
ex) 123,456,789
- 단어 자체에 구두점을 갖고 있는 경우 존재
- 줄임말과 단어 내에 띄어쓰기가 있는 경우
- 토큰화 작업이 영어에서 '로 압축된 단어를 다시 펼치는 역할을 하기도 함
ex) what're => what are (이때, re를 접어(clitic)이라고 함) - 띄어쓰기가 존재하는 단어
ex) rock 'n' roll
ex) New York
- 토큰화 작업이 영어에서 '로 압축된 단어를 다시 펼치는 역할을 하기도 함
- 표준 토큰화 예제
- Penn Treebank Tokenization 규칙
- 하이픈으로 구성된 단어는 하나로 유지한다.
- doesn't와 같이 '로 접어가 함께하는 단어는 분리해준다.
ex) doesn't => 'does', "n't"
- Penn Treebank Tokenization 규칙
- 구두점이나 특수 문자를 단순 제외해서는 안 됨
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))
# 트리뱅크 워드토크나이저 : ['Starting', 'a', 'home-based', 'restaurant', 'may', 'be', 'an', 'ideal.', 'it', 'does', "n't", 'have', 'a', 'food', 'chain', 'or', 'restaurant', 'of', 'their', 'own', '.']
# 문장의 토큰화(Sentence Tokenization) = 문장 분류(sentence segmetation)
- 토큰의 단위 = 문장
- ?나 !는 문자의 구분을 위한 꽤 명확한 구분자(boundary) 역할을 하지만 마침표는 그렇지 않음
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. - 사용하는 코퍼스가 어떤 국적의 언어인지, 또는 해당 코퍼스 내에서 특수 문자들이 어떻게 사용되고 있는지에 따라 직접 규칙들을 정의해볼 수 있음
- But! 코퍼스 데이터에 오타나 문장의 구성이 엉망인 경우 등에 의해 정확도 100%를 얻기 쉽지 않음
- 영어 문장 토큰화
- NLTK의 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))
# 문장 토큰화1 : ['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.']
text = "I am actively looking for Ph.D. students. and you are a Ph.D student."
print('문장 토큰화2 :',sent_tokenize(text))
# 문장 토큰화2 : ['I am actively looking for Ph.D. students.', 'and you are a Ph.D student.']
- 한국어 문장 토큰화
- KSS(Korean Sentence Splitter) = 한글 문장 분리기
from kss import split_sentences
text = '딥 러닝 자연어 처리가 재미있기는 합니다. 그런데 문제는 영어보다 한국어로 할 때 너무 어렵습니다. 이제 해보면 알걸요?'
print('한국어 문장 토큰화 :',split_sentences(text))
# 한국어 문장 토큰화 : ['딥 러닝 자연어 처리가 재미있기는 합니다.', '그런데 문제는 영어보다 한국어로 할 때 너무 어렵습니다.', '이제 해보면 알걸요?']
# 한국어에서의 토큰화 어려움
- 교착어 특성
- 같은 단어임에도 서로 다른 조사가 붙어서 다른 단어로 인식이 되면 자연어 처리가 힘들고 번거로워지는 경우가 많음
=> 한국어 NLP(Natural Language Processing, 자연어 처리)에서 조사는 분리해줄 필요가 있음
=> 형태소 토큰화
- 같은 단어임에도 서로 다른 조사가 붙어서 다른 단어로 인식이 되면 자연어 처리가 힘들고 번거로워지는 경우가 많음
- 한국어는 띄어쓰기가 영어보다 잘 지켜지지 않음
from konlpy.tag import Okt
from konlpy.tag import Kkma
okt = Okt()
kkma = Kkma()
print('OKT 형태소 분석 :',okt.morphs("열심히 코딩한 당신, 연휴에는 여행을 가봐요"))
# OKT 형태소 분석 : ['열심히', '코딩', '한', '당신', ',', '연휴', '에는', '여행', '을', '가봐요']
print('OKT 품사 태깅 :',okt.pos("열심히 코딩한 당신, 연휴에는 여행을 가봐요"))
# OKT 품사 태깅 : [('열심히', 'Adverb'), ('코딩', 'Noun'), ('한', 'Josa'), ('당신', 'Noun'), (',', 'Punctuation'), ('연휴', 'Noun'), ('에는', 'Josa'), ('여행', 'Noun'), ('을', 'Josa'), ('가봐요', 'Verb')]
print('OKT 명사 추출 :',okt.nouns("열심히 코딩한 당신, 연휴에는 여행을 가봐요"))
# OKT 명사 추출 : ['코딩', '당신', '연휴', '여행']
print('꼬꼬마 형태소 분석 :',kkma.morphs("열심히 코딩한 당신, 연휴에는 여행을 가봐요"))
# 꼬꼬마 형태소 분석 : ['열심히', '코딩', '하', 'ㄴ', '당신', ',', '연휴', '에', '는', '여행', '을', '가보', '아요']
print('꼬꼬마 품사 태깅 :',kkma.pos("열심히 코딩한 당신, 연휴에는 여행을 가봐요"))
# 꼬꼬마 품사 태깅 : [('열심히', 'MAG'), ('코딩', 'NNG'), ('하', 'XSV'), ('ㄴ', 'ETD'), ('당신', 'NP'), (',', 'SP'), ('연휴', 'NNG'), ('에', 'JKM'), ('는', 'JX'), ('여행', 'NNG'), ('을', 'JKO'), ('가보', 'VV'), ('아요', 'EFN')]
print('꼬꼬마 명사 추출 :',kkma.nouns("열심히 코딩한 당신, 연휴에는 여행을 가봐요"))
# 꼬꼬마 명사 추출 : ['코딩', '당신', '연휴', '여행']
# 참고글
02-01 토큰화(Tokenization)
자연어 처리에서 크롤링 등으로 얻어낸 코퍼스 데이터가 필요에 맞게 전처리되지 않은 상태라면, 해당 데이터를 사용하고자하는 용도에 맞게 토큰화(tokenization) & 정제(c…
wikidocs.net
'딥러닝' 카테고리의 다른 글
[개념] 한국어 전처리 패키지(Text Preprocessing Tools for Korean Text) (0) | 2023.01.25 |
---|---|
[개념] 어간 추출(Stemming) 및 표제어 추출(Lemmatization) (0) | 2023.01.22 |
[개념] 문서 단어 행렬(Document-Term Matrix, DTM) (0) | 2023.01.20 |
[개념] Bag of Words (0) | 2023.01.19 |
[개념] TF-IDF (0) | 2023.01.18 |