Loading the catalog…
Loading the catalog…
딥러닝 스터디 4차 세션 과제 | 위키독스 「09-01 토큰화(Tokenization)」 들어가며 4.1~4.2에서는 RNN과 LSTM에 torch.randn(1, 10, 5) 를 넣었다. "단어 10개, 단어마다 5차원 벡터"라고 가정한 가짜 입력 이었다. 이번 편부터는 진짜 문장을 다룬다. 문장이 모델에 들어가기까지는 세 단계를 거친다. "아 더빙.. 진짜 짜증나네요 목소리" → ['아', '더', '빙', '진짜', '짜증', '나', '네요', '목소리'] ← 4.3 토큰화 (이번 편) → [20, 57, 881, 26, ...] → 벡터 ← 4.4 nn.Embedding → LSTM → 긍정 / 부정 ← 4.5 첫 단계는 문장을 어디서 자를지 정하는 것 이다. 1. 토큰화란 주어진 텍스트(코퍼스)를 토큰(token) 이라는 단위로 나누는 작업을 토큰화(tokenization) 라고 한다. 토큰이 단어면 단어 토큰화 , 문장이면 문장 토큰화 다. 가장 단순한 방법은 구두점을 지우고 띄어쓰기로 자르는 것 이다. 입력: Time is an illusion. Lunchtime double so! 출력: Time / is / an / illusion / Lunchtime / double / so 이 문장은 이걸로 충분하다. 하지만 실제 문장에서는 이 방법이 금방 막힌다. 구두점을 지우면 안 되는 경우가 있고, 띄어쓰기만으로 단어가 나뉘지 않는 언어도 있다. 이번 편은 그 경우들을 하나씩 본다. 2. 같은 문장, 다른 토큰 — 아포스트로피 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 / Don t / Dont / Do n't Jone's Jone's / Jone s / Jone / Jones 도구마다 고르는 답이 다르다. 세 가지를 같은 문장에 돌려 보면 이렇다. from nltk.tokenize import word_tokenize, WordPunctTokenizer from tensorflow.keras.preprocessing.text import text_to_word_sequence word_tokenize(s) # 25개 WordPunctTokenizer().tokenize(s) # 28개 text_to_word_sequence(s) # 21개 word_tokenize : n't (not), 's (소유격)처럼 뜻이 있는 단위 로 뗀다. 영어 문법을 아는 토크나이저다. WordPunctTokenizer : 구두점을 무조건 따로 뗀다. 그래서 Don , ' , t 처럼 뜻 없는 조각이 생긴다. text_to_word_sequence : 소문자로 바꾸고 구두점을 지운 뒤 띄어쓰기로 자른다. 아포스트로피만 남겨서 don't , jone's 가 통째로 한 토큰이다. 정답은 없다. 토큰화는 문제에 맞는 단위를 고르는 일 이다. 3. 토큰화에서 고려할 것들 구두점과 특수 문자를 함부로 지우면 안 된다 예 기호가 하는 일 Ph.D , AT&T , m.p.h 마침표·앰퍼샌드가 단어의 일부다 $45.55 마침표를 기준으로 자르면 45 와 55 로 쪼개진다 01/02/06 슬래시가 날짜를 만든다 123,456,789 쉼표가 숫자의 자릿수를 나눈다 1절의 "구두점을 지우고 띄어쓰기로 자르기"는 이런 토큰들을 다 망가뜨린다. 줄임말과 단어 안의 띄어쓰기 줄임말 : I'm 의 'm 처럼 아포스트로피 뒤에 붙는 조각을 접어(clitic) 라고 한다. we're = we are 이다. 띄어쓰기가 있어도 한 단어 인 경우: New York , rock 'n' roll . 표준이 하나 있다 — 펜 트리뱅크 펜 트리뱅크(Penn Treebank) 토큰화 규칙의 핵심은 두 가지다. 하이픈으로 이어진 단어는 하나로 둔다. home-based 아포스트로피 줄임말은 뗀다. doesn't → does + n't from nltk.tokenize import TreebankWordTokenizer TreebankWordTokenizer().tokenize( "Starting a home-based restaurant may be an ideal. it doesn't have a food chain or restaurant of their own.") # ['Starting', 'a', 'home-based', 'restaurant', 'may', 'be', 'an', 'ideal.', 'it', 'does', "n't", ..., 'own', '.'] 🔍 ideal. 의 마침표는 안 떨어졌다. 트리뱅크 토크나이저는 문자열 맨 끝의 마침표만 뗀다. 문장이 하나 들어온다고 가정하기 때문이다. 그래서 보통은 문장 토큰화를 먼저 하고, 문장마다 단어 토큰화를 한다. word_tokenize 는 안에서 이 순서대로 처리한다. 4. 문장 토큰화 — 마침표는 문장 끝이 아니다 문장을 자르는 기준은 보통 . , ? , ! 이다. ? 와 ! 는 비교적 분명하지만, 마침표는 문장 끝이 아닐 때가 많다. IP 주소, 이메일, 약어 속의 마침표에서 자르면 문장이 엉뚱하게 쪼개진다. nltk의 sent_tokenize 는 이런 경우를 학습해 두었다. from nltk.tokenize import sent_tokenize sent_tokenize("I am actively looking for Ph.D. students. and you are a Ph.D student.") # ['I am actively looking for Ph.D. students.', 'and you are a Ph.D student.'] Ph.D. 의 마침표에서는 자르지 않고, students. 에서만 잘랐다. 한국어는 KSS(Korean Sentence Splitter) 를 쓴다. import kss kss.split_sentences('딥 러닝 자연어 처리가 재미있기는 합니다. 그런데 문제는 영어보다 한국어로 할 때 너무 어렵습니다. 이제 해보면 알걸요?') # ['딥 러닝 자연어 처리가 재미있기는 합니다.', '그런데 문제는 영어보다 한국어로 할 때 너무 어렵습니다.', '이제 해보면 알걸요?'] 5. 한국어 토큰화가 어려운 이유 교착어 — 조사가 붙는다 영어는 띄어쓰기 단위가 거의 단어다. 한국어에서 띄어쓰기 단위는 어절 이다. 어절에는 단어에 조사 가 붙어 있다. 이렇게 단어에 조사·어미가 붙어서 문법 기능을 하는 언어를 교착어 라고 한다. 위 그림의 1은 대명사 '그'다. 어절로 자르면 그가 , 그에게 , 그를 , 그와 , 그는 이 전부 다른 단어 가 된다. 모델 입장에서는 이 다섯 개가 서로 관계없는 토큰이다. 그래서 한국어는 형태소 단위로 잘라서 '그'를 떼어 낸다. 형태소 — 뜻을 가진 가장 작은 말 단위 뜻 예 (에디가 책을 읽었다) 자립 형태소 혼자 쓰일 수 있다. 명사, 대명사, 수사, 관형사, 부사, 감탄사 에디, 책 의존 형태소 다른 형태소와 붙어야 쓰인다. 조사, 어미, 접사, 어간 -가, -을, 읽-, -었, -다 용언의 어간 읽- 도 혼자서는 못 쓰기 때문에 의존 형태소다. 띄어쓰기가 잘 안 지켜진다 제가이렇게띄어쓰기를전혀하지않고글을썼다고하더라도글을이해할수있습니다. 한국어는 띄어쓰기를 안 해도 꽤 읽힌다. 글자를 모아 쓰기 때문이다. 영어는 Tobeornottobethatisthequestion 처럼 붙여 쓰면 읽기 어렵다. 그래서 한국어 데이터는 띄어쓰기가 틀린 경우가 많다. 띄어쓰기 기준 토큰화는 더 믿을 수 없다. 4.5의 실제 리뷰에 너무재밓었다그래서보는것을추천한다 가 있다. 형태소 분석기는 이 리뷰를 너무 / 재 / 밓었다그래서보는것을추천한다 로 잘랐다. 오타와 붙여 쓰기 때문에 뒷부분이 통째로 한 토큰이 됐다. 진짜 데이터는 이렇게 지저분하다. 6. 품사 태깅 같은 글자도 품사에 따라 뜻이 다르다. 영어 fly : 동사면 '날다', 명사면 '파리' 한국어 못 : 명사면 '망치로 박는 못', 부사면 '~하지 못하다' 그래서 토큰마다 품사를 붙이는 품사 태깅(part-of-speech tagging) 을 하기도 한다. from nltk.tag import pos_tag pos_tag(word_tokenize("I am actively looking for Ph.D. students. and you are a Ph.D. student.")) # [('I', 'PRP'), ('am', 'VBP'), ('actively', 'RB'), ('looking', 'VBG'), ('for', 'IN'), # ('Ph.D.', 'NNP'), ('students', 'NNS'), ('.', '.'), ...] 태그 뜻 태그 뜻 PRP 인칭 대명사 IN 전치사 VBP 동사 (현재형) NNP 고유 명사 VBG 동사 (현재분사) NNS / NN 복수 / 단수 명사 RB 부사 DT 한정사 4.1의 입출력 구조로 보면 다 대 다 다. 토큰마다 태그가 하나씩 나온다. 7. 한국어 형태소 분석 — KoNLPy KoNLPy 는 한국어 형태소 분석기를 모아 둔 파이썬 패키지다. Okt, Mecab, Komoran, Hannanum, Kkma(꼬꼬마)가 들어 있고, 메서드 이름은 공통이다. 메서드 하는 일 morphs(text) 형태소 단위로 자른 리스트 pos(text) (형태소, 품사) 튜플 리스트 nouns(text) 명사만 from konlpy.tag import Okt, Kkma okt, kkma = Okt(), Kkma() s = "열심히 코딩한 당신, 연휴에는 여행을 가봐요" okt.morphs(s) # ['열심히', '코딩', '한', '당신', ',', '연휴', '에는', '여행', '을', '가봐요'] kkma.morphs(s) # ['열심히', '코딩', '하', 'ᄂ', '당신', ',', '연휴', '에', '는', '여행', '을', '가보', '아요'] okt.nouns(s) # ['코딩', '당신', '연휴', '여행'] 꼬꼬마가 더 잘게 자른다. 코딩한 → 코딩 / 하 / ᄂ , 가봐요 → 가보 / 아요 . 명사 추출 결과는 둘이 같다. 분석기마다 틀리는 곳이 다르다. Okt는 한 을 조사(Josa)로 태깅했다. 실제로는 하다 의 활용( 하 + ᄂ )이다. 어떤 분석기를 쓸지는 문제에 맞게 고른다. 4.5에서는 Mecab 을 쓴다. 다른 분석기보다 훨씬 빨라서, 리뷰 14만 5천 개를 10초 정도에 자른다. 쓰는 법은 똑같이 mecab.morphs(sentence) 한 줄이다. 📌 실습 팁. nltk 3.9 이상에서는 nltk.download('punkt') 만으로는 word_tokenize 가 LookupError 를 낸다. nltk.download('punkt_tab') 이 필요하다. pos_tag 도 nltk.download('averaged_perceptron_tagger_eng') 가 필요하다. 정리 개념 한 줄 토큰화 텍스트를 모델이 다룰 단위(토큰)로 자른다 정답 없다. 도구마다 규칙이 다르고 문제에 맞게 고른다 영어의 난점 아포스트로피( n't , 's ), 기호가 든 토큰( Ph.D , $45.55 ) 트리뱅크 규칙 하이픈은 유지, 줄임말은 분리, 끝 마침표만 분리 문장 토큰화 마침표 ≠ 문장 끝. sent_tokenize , 한국어는 kss 교착어 한국어는 어절에 조사가 붙는다 → 형태소로 잘라야 같은 단어가 모인다 형태소 자립(명사 등) / 의존(조사·어미·접사·어간) 품사 태깅 토큰마다 품사를 붙인다 ( pos_tag , okt.pos ) KoNLPy morphs / pos / nouns . 4.5는 Mecab 말로 설명할 때의 한 문장 "토큰화는 문장을 모델에 넣을 단위로 자르는 일이고 정답은 없습니다. 영어는 아포스트로피와 마침표 처리가 도구마다 다르고, 한국어는 조사가 붙는 교착어라서 띄어쓰기 대신 형태소 분석기로 잘라야 '그가'와 '그를'이 같은 '그'로 모입니다." 다음 편은 이렇게 자른 토큰을 숫자 벡터로 바꾸는 nn.Embedding 이다.
What RADAR observed and classified to build this opportunity. It is what the source published, not a verification that the offer is still active.
4.3 토큰화 tokenization. 딥러닝 스터디 4차 세션 과제 | 위키독스 「09-01 토큰화(Tokenization)」 들어가며 4.1~4.2에서는 RNN과 LSTM에 torch.randn(1, 10, 5) 를 넣었다. "단어 10개, 단어마다 5차원 벡터"라고 가정한 가짜 입력 이었다. 이번 편부터는 진짜 문장을 다룬다. 문장이 모델에 들어가기까지는 세 단계를 거친다. "아 더빙.. 진짜 짜증나네요 목소리" → ['아', '더', '빙', '진짜', '짜증', '나', '네요', '목소리'] ← 4.3 토큰화 (이번 편) → [20, 57, 881, 26, ...] → 벡터 ← 4.4 nn.Embedding → LSTM → 긍정 / 부정 ← 4.5 첫 단계는 문장을 어디서 자를지 정하는 것…
Open source