ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 토큰화(Tokenization)
    Natural Language Processing/딥 러닝을 이용한 자연어 처리 입문 2021. 5. 14. 22:07
    반응형

    https://wikidocs.net/21698 참고하여 공부한 내용 정리

    Chap2. 텍스트 전처리

    1) 토큰화(Tokenization)


    • 토큰화란 코퍼스(corpus)에서 토큰(token) 단위로 나누는 작업

    1. 단어 토큰화(Word Tokenization)


    sent = 'Time is an illusion Lunchtime double so'
    print('토큰화 전: ', sent)
    print('토큰화 후: ', sent.split(' '))
    토큰화 전:  Time is an illusion Lunchtime double so
    토큰화 후:  ['Time', 'is', 'an', 'illusion', 'Lunchtime', 'double', 'so']

    띄어쓰기 단위를 기준으로 토큰화

    2. 토큰화 선택


    • nltk의 word_tokenize
    from nltk.tokenize import word_tokenize
    print(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."))
    ['Do', "n't", 'be', 'fooled', 'by', 'the', 'dark', 'sounding', 'name', ',', 'Mr.', 'Jone', "'s", 'Orphanage', 'is', 'as', 'cheery', 'as', 'cheery', 'goes', 'for', 'a', 'pastry', 'shop', '.']

    Don't 를 Do와 n't로 분리함

    • nltk의 WordPunctTokenizer
    from nltk.tokenize import WordPunctTokenizer
    print(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."))
    ['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를 Don과 '와 t로 분리함

    • keras의 text_to_word_sequence
    from tensorflow.keras.preprocessing.text import text_to_word_sequence
    print(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."))
    ["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와 같은 경우 아포스트로피는 보존함

    3. 토큰화에서 고려해야할 사항


    1) 구두점이나 특수 문자를 단순 제외해서는 안 된다.
    • 마침표(.)는 문장의 경계를 알 수 있음
    • 단어 자체에서 구두점을 갖는 경우: m.p.h, Ph.D, AT&T
    • 달러($)는 가격을 의미, 슬래시(/)는 날짜 의미
    2) 줄임말과 단어 내에 띄어쓰기가 있는 경우

    what're의 경우 what are의 줄임말이고 New York의 경우 하나의 단어이지만 중간에 띄어쓰기가 있음

    이런경우 하나의 토큰으로 볼 수 있어야 함

    3) 표준 토큰화 예제

    TreebankWordTokenizer 토큰화 방법은 하이푼으로 구성된 단어는 하나로 유지하고 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))
    ['Starting', 'a', 'home-based', 'restaurant', 'may', 'be', 'an', 'ideal.', 'it', 'does', "n't", 'have', 'a', 'food', 'chain', 'or', 'restaurant', 'of', 'their', 'own', '.']

    home-based 하나의 토큰으로 취급, doesn't의 경우 does와 n't로 분리됨

    4. 문장 토큰화(Sentence Tokenization)


    토큰 단위가 문장(sentence)인 경우

    ! ? . 기준으로 문장을 토큰화 할 수 있지만 . 의 경우 문장의 끝이 아니더라도 등장할 수 있음(ex> Ph.D, 이메일 ...)

    • 영어 문장 토큰화: nltk의 sent_tokenize
    from nltk.tokenize import sent_tokenize
    text = "I am actively looking for Ph.D. students. and you are a Ph.D student."
    print(sent_tokenize(text))
    ['I am actively looking for Ph.D. students.', 'and you are a Ph.D student.']

    sent_tokenize는 단순히 마침표를 구분자로하여 구분하지 않음

    • 한국어 문장 토큰화: kss사용
    import kss
    text = '딥 러닝 자연어 처리가 재미있기는 합니다. 그런데 문제는 영어보다 한국어로 할 때 너무 어려워요. 농담아니에요. 이제 해보면 알걸요?'
    print(kss.split_sentences(text))
    ['딥 러닝 자연어 처리가 재미있기는 합니다.', '그런데 문제는 영어보다 한국어로 할 때 너무 어려워요.', '농담아니에요.', '이제 해보면 알걸요?']

    5. Binary Classifier


    문장 토큰화에서 마침표 처리를 위해

    1. 마침표가 단어의 일부분인 경우(약어)
    2. 마침표가 문장의 구분자일 경우

    두 개의 클래스로 분류할 수 있어야 함

    6. 한국어에서의 토큰화의 어려움


    영어의 경우 New York과 같은 합성어나 he's와 같은 줄임말을 예외처리하면 띄어쓰기 토큰화를 수행해도 단어 토큰화가 잘 작동함. 한국어의 경우 띄어쓰기 단위가 되는 단위를 '어절'이라 하고 어절 토큰화라고 함. 어절 토큰화는 단어 토큰화와 다름

    1) 한국어는 교착어

    한국어는 영어와는 다르게 조사가 존재함. '그'라는 단어는 '그가', '그는', '그를' 등 '그' 뒤에 다양한 조사가 붙게 됨. 같은 의미의 단어인데 '그'에 서로 다른 조사가 붙어 다른 단어로 인식이 되면 자연어 처리에 있어서 매우 번거로움

    영어처럼 독립적인 단어의 경우 띄어쓰기 단위로 토큰화를 하면 되지만 한국어는 어절 단위로 토큰화를 하면 조사가 붙어서 독립적인 단어로 구성되지 못 함

    이 때 형태소(morpheme) 토큰화를 적용해야 함.

    형태소에는 두 가지 형태소가 존재함

    1. 자립 형태소: 접사, 어미, 조사와 상관없이 자립하여 사용할 수 있는 형태소. 그 자체로 단어가 됨. 체언(명사, 대명사, 수사), 수식언(관형사, 부사), 감탄사 등
    2. 의존 형태소: 다른 형태소와 결합하여 사용되는 형태소. 접사, 어미, 조사, 어간

    예를 들어 '에디가 딥러닝책을 읽었다' 라는 문장을 형태소 단위로 분리하면 다음과 같음

    ​ 자립 형태소: 에디, 딥러닝 책 / 의존 형태소: -가, -을, 읽-, -었, -다

    한국어에서 영어에서의 단어 토큰화와 유사한 형태를 얻으려면 어절 토큰화가 아닌 형태소 토큰화를 수행해야 함

    2) 한국어는 띄어쓰기가 영어보다 잘 지켜지지 않음

    한국어의 경우 띄어쓰기가 지켜지지 않아도 글을 쉽게 이해할 수 있음. 영어는 그렇지 않음

    7. 품사 태킹(Part-of-speech tagging)


    단어는 표기는 같지만 품사에 따라서 의미가 달라짐. 예를 들어, 영어 단어인 'fly'는 동사로는 '날다'이지만 명사로는 '파리'를 의미함. 한국어에서 '못'은 명사, 부사로 쓰일 수 있음

    8. NLTK와 KoNlPy를 이용한 영어, 한국어 토큰화 실습


    • 영어 코퍼스 품사 태깅
    from nltk.tag import pos_tag
    text = "I am actively looking for Ph.D. students. and you are a Ph.D. student."
    x = word_tokenize(text)
    pos_tag(x)
    [('I', 'PRP'),
     ('am', 'VBP'),
     ('actively', 'RB'),
     ('looking', 'VBG'),
     ('for', 'IN'),
     ('Ph.D.', 'NNP'),
     ('students', 'NNS'),
     ('.', '.'),
     ('and', 'CC'),
     ('you', 'PRP'),
     ('are', 'VBP'),
     ('a', 'DT'),
     ('Ph.D.', 'NNP'),
     ('student', 'NN'),
     ('.', '.')]
    • 한국어 코퍼스 품사 태깅: 형태소 분석기로 Okt, Mecab, Komoran, Hannanum, Kkma가 있음
    • morphs: 형태소 추출
    from konlpy.tag import Okt
    okt = Okt()
    print(okt.morphs('열심히 코딩한 당신, 연휴에는 여행을 가봐요'))
    ['열심히', '코딩', '한', '당신', ',', '연휴', '에는', '여행', '을', '가봐요']
    • pos: 품사 태깅
    print(okt.pos("열심히 코딩한 당신, 연휴에는 여행을 가봐요"))
    [('열심히', 'Adverb'), ('코딩', 'Noun'), ('한', 'Josa'), ('당신', 'Noun'), (',', 'Punctuation'), ('연휴', 'Noun'), ('에는', 'Josa'), ('여행', 'Noun'), ('을', 'Josa'), ('가봐요', 'Verb')]
    • nouns: 명사 추출
    print(okt.nouns("열심히 코딩한 당신, 연휴에는 여행을 가봐요")) 
    ['코딩', '당신', '연휴', '여행']
    반응형

    댓글

Designed by Tistory.