[NLP] 토큰화(Tokenization) / 토크나이징(Tokenizing)
Tokenization
토큰화 (Tokenization)
- 텍스트 문서(corpus, 말뭉치)에서 하나의 특정 기본 단위(토큰, token)로 나누는 작업
토크나이징을 위한 파이썬 라이브러리
- 영어 토크나이징 라이브러리
- 한글 토크나이징 라이브러리
영어 Tokenizing
NLTK
설치하기
!pip install nltk
import nltk
nltk.download('popular')
단어 토크나이징
from nltk. tokenize import word_tokenize
tokens = word_tokenize("Hello World!, This is a dog.")
print(tokens)
['Hello', 'World', '!', ',', 'This', 'is', 'a', 'dog', '.']
words = [word for word in tokens if word.isalpha()]
print(words)
['Hello', 'World', 'This', 'is', 'a', 'dog']
문장 토크나이징 (Sentence tokenizing)
from nltk.tokenize import sent_tokenize
text = "Welcome to Python. This is Python World."
print(sent_tokenize(text))
['Welcome to Python', 'This is Python World.']
keras
- keras를 사용하여 단어 토크나이징 하기
- 공백으로 단어를 분할함
- 특수문자 필터링
- 소문자로 변환
from tensorflow.keras.preprocessing.text import *
print(text_to_word_sequence("Welcome to Python!!! This is Python World."))
['welcom', 'to', 'python', 'this', 'is', 'python', 'world']
spaCy
import spacy
# Load English tokenizer, tagger, parser and NER
nlp = spacy.load("en_core_web_sm")
# Process whole documents
text = ("When Sebastian Thrun started working on self-driving cars at "
"Google in 2007, few people outside of the company took him "
"seriously. "I can tell you very senior CEOs of major American "
"car companies would shake my hand and turn away because I wasn't "
"worth talking to," said Thrun, in an interview with Recode earlier "
"this week.")
doc = nlp(text)
word_tokenized = [token.text for token in doc]
print(word_tokenized)
sent_tokenized = [sent.text for sent in doc.sents]
print(sent_tokenized)
영어 토크나이징에서 고려할 사항
- 구두점이나 특수 문자를 단순히 제외할 것인가?
- 마침표(.)는 문장의 경계를 알 수 있는데…
- 단어 자체에 구두점을 갖고 있는 경우가 있는데… (m.p.h / Ph.D . AT&T등)
- 달러($)는 가격을 표시하는데… ($99.99)
- 슬래시(/)는 날짜는 표시하는데… (09/15/2022)
- 컴마(,)가 숫자를 표시하는데… (123,456,789)
- 줄임말이 있는 경우?
- 어퍼스트로피(‘)는 줄임말을 표시하는데… (You’re / They’re / Kim’s Pizza 등)
- rock ‘n’ roll
- 복합 명사?
- New York
- 대문자를 소문자로 무조건 변환?
- US –> us
영어 토크나이징 (표준)
- TreebankWordTokenizer (https://www.nltk.org/_modules/nltk/tokenize/treebank.html)
from nltk.tokenize import TreebankWordTokenizer
tokenizer = TreebankWordTokenizer()
text1 = "Starting a home-based restaurant may be an ideal."
text2 = "it doesn't have a food chain or restaurant of their own."
text3 = "I live in US."
text4 = "You love rock'n'roll and Kim's Pizza."
text5 = "The price is $99.99."
print('text1 :',tokenizer.tokenize(text1))
print('text2 :',tokenizer.tokenize(text2))
print('text3 :',tokenizer.tokenize(text3))
print('text4 :',tokenizer.tokenize(text4))
print('text5 :',tokenizer.tokenize(text5))
text1 : ['Starting', 'a', 'home-based', 'restaurant', 'may', 'be', 'an', 'ideal', '.']
text2 : ['it', 'does', 'n't', 'have', 'a', 'food', 'chain', 'or', 'restaurant', 'of', 'their', 'own', '.']
text3 : ['I', 'live', 'in', 'US', '.']
text4 : ['You', 'love', 'rock'n'roll', 'and', 'Kim', ''s', 'Pizza', '.']
text5 : ['The', 'price', 'is', '$', '99.99', '.']
한글 Tokenizing
한글의 특성
- 교착어
- 나 : 나는 /나에게/ 나를 /나와
- 형태소 (morpheme) 단위로 분리해야 한다!!!
- 형태소: 의미를 가지는 가장 작은 단위
- 자립 형태소
- 체언(명사, 대명사, 수사)
- 수식언(관형사, 부사)
- 감탄사
- 의존 형태소
- 접사, 어미, 조사, 어간
- 띄어쓰기가 어렵고 잘 지켜지지 않음
KoNLPy
- 한글 형태소 단위 word tokenizer
KoNLPy 및 mecab 형태소 분석기 설치하기
!apt-get install g++ openjdk-8-jdk python3-dev python3-pip curl
!python3 -m pip install --upgrade pip
!python3 -m pip install konlpy
!apt-get install curl git
!bash <(curl -s https://raw.githubusercontent.com/konlpy/konlpy/master/scripts/mecab.sh)
한글 형태소 단위 단어 토크나이징 하기
from konlpy.tag import Otk, Komoran, Mecab, Hannanum, Kkma
text = "우리는 민족중흥의 역사적 사명을 띠고 이땅에 태어났다"
tokenizer = Okt()
tokenizer.morphs(text)
tokenizer.pos(text)
tokenizer = Kkma()
tokenizer.pos(text)
tokenizer = Komoran()
tokenizer.pos(text)
tokenizer = Hannanum()
tokenizer.pos(text)
token_mecab = Mecab()
token_mecab.pos(text)
mecab을 사용한 품사 태깅(pos(part-of-speech) tagging)하기
KSS(Korean Sentence Splitter)
import kss
text1 = "환영합니다. 파이썬 월드. 지금부터 시작합니다."
text2 = "환영합니다 파이썬 월드~! 지금부터 시작합니다^^"
print('text :', kss.split_sentences(text1))
print('text :', kss.split_sentences(text2))
text1 : ['환영합니다.', '파이썬 월드. 지금부터 시작합니다.']
text2 : ['환영합니다', '파이썬 월드~! 지금부터 시작합니다^^']
- 한글 형태소 분석기 성능 비교 (블로그)
https://ratsgo.github.io/from%20frequency%20to%20semantics/2017/05/10/postag/
https://soohee410.github.io/compare_tagger
https://needjarvis.tistory.com/692
https://velog.io/@metterian/%ED%95%9C%EA%B5%AD%EC%96%B4-%ED%98%95%ED%83%9C%EC%86%8C-%EB%B6%84%EC%84%9D%EA%B8%B0POS-%EB%B6%84%EC%84%9D-3%ED%8E%B8.-%ED%98%95%ED%83%9C%EC%86%8C-%EB%B6%84%EC%84%9D%EA%B8%B0-%EB%B9%84%EA%B5%90
불용어 처리 stopword
불용어 (stopword) 확인하기
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
stop_words_list = stopwords.words('english')
print('불용어 개수 :', len(stop_words_list))
print('불용어 10개 출력 :', stop_words_list[:10])
불용어 개수 : 179
불용어 10개 출력 : ['i', 'me', 'my', 'myself', 'we', 'our', 'ours', 'ourselves', 'you', "you're"]
불용어 (stopword) 제거하기
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)
불용어 제거 전 : ['Family', 'is', 'not', 'an', 'important', 'thing', '.', 'It', "'s", 'everything', '.']
불용어 제거 후 : ['Family', 'important', 'thing', '.', 'It', "'s", 'everything', '.']
댓글남기기