KEEP GOING

[nlp] 자연어처리 기초 용어 모음집(token, pos tagging, stopword, corpus, stemming, ...) 본문

인공지능/nlp

[nlp] 자연어처리 기초 용어 모음집(token, pos tagging, stopword, corpus, stemming, ...)

jmHan 2023. 4. 28. 19:01
반응형

목차

     

    0. nlp(자연어처리)

    인간의 언어를 컴퓨터가 이해할 수 있도록 처리하는 기술 

     

     

    1. nltk

    토크나이징, 어간 추출, 품사 태깅 등 자연어 처리에 사용하는 파이썬 모듈
    import nltk
    
    print(dir(nltk.corpus)) # 말뭉치 목록 확인

     

     

    2. 말뭉치(corpus)

    자연어처리를 위한 목적으로 정리해놓은 문서 집합 
    import nltk 
    
    nltk.download('movie_reviews') # 말뭉치 중 'movie_reviews' 다운로드 
    from nltk.corpus import movie_reviews

    nltk.corpus 패키지는 다양한 연구용 말뭉치를 제공합니다.

    말뭉치 자료를 사용하려면 nltk.download 명령으로 다운받으면 됩니다.

     

     

    3. 토크나이징(tokenizing)

    자연어 분석을 위해 주어진 긴 문자열(=코퍼스)을 작은 단위(=토큰)로 나누는 것
    from konlpy.tag import Okt #한글 형태소 분석기
    
    docs = ['예상대로 테슬라는 재고가 늘었고 가격 인하로 이익률이 떨어지며 순이익이 줄었다.', 
            '테슬라는 현재 전세계 전기차시장의 약 5분의 1을 점하고 있다.',
            '물론 전기차시장의 경쟁이 치열해지면 테슬라의 시장점유율은 하락할 것으로 전망된다.']
    
    t = Okt()
    tokens = [t.morphs(doc) for doc in docs] #각 문장마다 형태소 추출
    
    for token in tokens:
        print(token)

    문자열을 토큰으로 분리하는 함수인 tokenizer를 사용하거나 정규표현식을 통해 문자열을 토큰화할 수 있습니다.

     


    4. konlpy

    한국어 기반의 자연어 처리 시 사용하는 파이썬 패키지
    from konlpy.tag import Okt
    from konlpy.tag import Kkma

    *konlpy 패키지를 구성하는 클래스로는 Twitter(=Okt), Kkma, Komoran 등이 있습니다.

     


    5. 형태소 분석

    형태소를 비롯하여 어근, 접미사/접두사, 품사 등 다양한 언어적 속성 및 구조를 파악하는 것 

     

    *형태소(morpheme) - 일정한 의미를 가지는 말의 가장 작은 단위 

    형태소 분석의 예로는 어간 추출(stemming), 표제어 추출(lemmatizing), 품사 태깅(Part-Of-Speech tagging)이 있습니다. 

     


    6. 어간 추출(stemming)

    접미사나 어미를 제거하여 핵심 의미를 담은 기본형을 찾아 주는 방식 
    from nltk.stem import PorterStemmer, LancasterStemmer, SnowballStemmer, RegexpStemmer
    
    p = PorterStemmer()
    l = LancasterStemmer()
    s = SnowballStemmer()
    r = RegexpStemmer()
    
    words = ['eat', 'ate', 'eats', 'eaten', 'eating']
    
    print('Porter stemmer:', [p.stem(w) for w in words])
    print('Lancaster stemmer:', [l.stem(w) for w in words])
    print('Snowball stemmer:', [l.stem(w) for w in words])
    print('Regexp stemmer:', [l.stem(w) for w in words])

    nltk의 어간 추출 패키지로는 PorterStemmer, LancasterStemmer, SnowballStemmer 등이 있습니다. 

    정해진 규칙으로 어미를 자르기 때문에 어간 추출 후에 나타나는 결과 단어들은 사전적 단어가 아닐 수 있습니다. 

     


    7. 표제어 추출(lemmatizing)

    단어의 표제어 즉, 사전적 단어를 찾는 것 (am, are, is -> be)
    # import nltk
    from nltk.stem import WordNetLemmatizer
    
    # nltk.download('wordnet')
    lemmatizer = WordNetLemmatizer()
    
    words = ['feet', 'worse', 'expressions', 'corpora', 'lives', 'watched']
    
    for word in words:
        result_word = lemmatizer.lemmatize(word)
        print('표제어 추출 전: {}, 표제어 추출 후: {}'.format(word, result_word))
    
    print(lemmatizer.lemmatize('watched', 'v'))

    표제어추출기(lemmatizer)가 품사 정보를 미리 알고 있어야 표제어 추출이 잘 진행될 수 있습니다.

    watched의 품사를 동사(v)로 명시하니 정확한 결과를 출력했습니다. 

     

     

    8. 품사 태깅(Part-Of-Speech tagging)

    단어에 품사를 부착한 것 

    *품사 - 문법에 따라 단어를 몇 가지로 묶어 놓은 것 

    from konlpy.tag import Okt
    
    docs = ['예상대로 테슬라는 재고가 늘었고 가격 인하로 이익률이 떨어지며 순이익이 줄었다.', 
            '테슬라는 현재 전세계 전기차시장의 약 5분의 1을 점하고 있다.',
            '물론 전기차시장의 경쟁이 치열해지면 테슬라의 시장점유율은 하락할 것으로 전망된다.']
    
    t = Okt()
    poses = [t.pos(doc) for doc in docs] #각 문장마다 품사를 붙여 반환 
    
    for pos in poses:
        print(pos)

    각 단어에 태깅된 품사의 의미는 tagset 속성을 통해 파악할 수 있습니다.

    print(t.tagset)

     


    9. 불용어(stopword)

    분석에 있어 의미가 없는 단어들

     

    nltk에서는 stopwords라는 패키지로 불용어를 정의하고 있으며 개발자가 직접 불용어를 정의할 수도 있습니다.

    from nltk.corpus import stopwords
    from nltk.tokenize import word_tokenize
    from konlpy.tag import Okt
    # nltk.download('punkt')
    # nltk.download('stopwords')
    
    stop_words = stopwords.words('english')
    doc = 'A 17-year-old girl named Suzume helps a mysterious young man close doors \
           from the outer side that are releasing disasters all over in Japan.'
    
    tokens = word_tokenize(doc)
    
    result = []
    for token in tokens:
        if token not in stop_words:
            result.append(token)
    
    print('불용어 제거 전:', tokens)
    print('불용어 제거 후:', result)

     

     

     

    10. N-gram

    연속된 n개의 단어 나열 

    토큰이 1개이면 유니그램(unigram), 2개이면 바이그램(bigram), 3개일 경우 트라이그램(trigram)이라고 합니다.  

    n이 4 이상일 경우는 4-gram과 같이 숫자를 붙여서 부릅니다. 

     

    예를 들어 Thank you for visiting keepgoing blog라는 문장이 존재할 경우, n-gram을 나타내면 다음과 같습니다.

     

    유니그램 Thank, you, for, visiting, keepgoing, blog

    바이그램 Thank you, for visiting, keepgoing blog

    트라이그램 Thank you for, visiting keepgoing blog

     

     

    반응형
    Comments