ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 어간 추출(Stemming) & 표제어 추출(Lemmatization)
    Natural Language Processing/딥 러닝을 이용한 자연어 처리 입문 2021. 5. 17. 11:23
    반응형

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

    03) 어간 추출(Stemming) & 표제어 추출(Lemmatization)

    어간 추출과 표제어 추출은 정규화 기법 중 코퍼스에 있는 단어의 개수를 줄일 수 있는 기법

    1. 표제어 추출(Lemmatization)


    표제어 추출은 단어로부터 표제어(Lemma)를 찾아가는 과정임. 표제어 추출은 단어가 다른 형태를 가지더라도 뿌리 단어를 찾아서 단어의 개수를 줄일 수 있는지 판단함. 예를 들어 am, are, is는 서로 다른 스펠링이지만 그 뿌리 단어는 be로 볼 수 있음. 이 때 단어들의 표제어는 be임

    형태소는 '의미를 가진 가장 작은 단위'를 뜻함. 형태소는 어간(stem), 접사(affix) 두 가지 종류가 있음

    1) 어간(stem)

    단어의 의미를 담고 있는 단어의 핵심 부분

    2) 접사(affix)

    단어에 추가적인 의미를 주는 부분

    형태학적 파싱은 이 두 가지 구성 요소를 분리하는 작업을 말함. 예를 들어, cats를 형태학적 파싱을 수행하면 결과로 cat(어간)과 -s(접사)를 분리함

    nltk에서는 표제어 추출을 위한 WordNetLemmatizer 제공함

    from nltk.stem import WordNetLemmatizer
    n = WordNetLemmatizer()
    words=['policy', 'doing', 'organization', 'have', 'going', 'love', 'lives', 'fly', 'dies', 'watched', 'has', 'starting']
    print([n.lemmatize(w) for w in words])
    ['policy', 'doing', 'organization', 'have', 'going', 'love', 'life', 'fly', 'dy', 'watched', 'ha', 'starting']

    표제어 추출은 단어의 형태가 적절히 보존되는 양상을 보이는 특징이 있음. 하지만 위의 결과에서 dy, ha와 같이 의미를 알 수 없는 단어를 출력함. 이는 표제어 추출기(lemmatizer)가 원래 단어의 품사 정보를 알아야만 정확한 결과를 얻을 수 있기 때문임

    WordNetLemmatizer는 입력으로 단어가 동사 품사라는 사실을 알려줄 수 있음. 즉, dies, has가 문장에서 동사로 쓰였다는 것을 알려준다면 표제어 추출기는 품사의 정보를 보존하면서 정확한 lemma를 출력함

    n.lemmatize('dies', 'v')
    'die'

    ※ 표제어 추출과 어간 추출의 차이

    표제어 추출은 문맥을 고려하며 수행했을 때의 결과는 해당 단어의 품사 정보를 보존함(POS 태그 보존). 어간 추출을 수행한 결과는 품사 정보가 보존되지 않음(POS 태그를 고려하지 않음). 어간 추출 결과는 사전에 존재하지 않는 단어일 경우가 많음

    2. 어간 추출(Stemming)


    어간 추출은 어간(stem)을 추출하는 작업. 어간 추출의 결과 단어는 사전에 존재하지 않는 단어일 수 있음

    어간 추출 알고리즘 중 하나인 포터 알고리즘

    from nltk.stem import PorterStemmer
    from nltk.tokenize import word_tokenize
    s = PorterStemmer()
    text="This was not the map we found in Billy Bones's chest, but an accurate copy, complete in all \
        things--names and heights and soundings--with the single exception of the red crosses and the written notes."
    words = word_tokenize(text)
    print(words)
    ['This', 'was', 'not', 'the', 'map', 'we', 'found', 'in', 'Billy', 'Bones', "'s", 'chest', ',', 'but', 'an', 'accurate', 'copy', ',', 'complete', 'in', 'all', 'things', '--', 'names', 'and', 'heights', 'and', 'soundings', '--', 'with', 'the', 'single', 'exception', 'of', 'the', 'red', 'crosses', 'and', 'the', 'written', 'notes', '.']
    print([s.stem(w) for w in words])
    ['thi', 'wa', 'not', 'the', 'map', 'we', 'found', 'in', 'billi', 'bone', "'s", 'chest', ',', 'but', 'an', 'accur', 'copi', ',', 'complet', 'in', 'all', 'thing', '--', 'name', 'and', 'height', 'and', 'sound', '--', 'with', 'the', 'singl', 'except', 'of', 'the', 'red', 'cross', 'and', 'the', 'written', 'note', '.']

    위 결과에는 사전에 없는 단어도 포함됨. 위의 어간 추출은 단순 규칙에 기반하여 이루어지기 때문임

    포터 알고리즘의 어간 추출 규칙

    • ALIZE -> AL
    • ANCE -> 제거
    • ICAL -> IC
    words = ['formalize', 'allowance', 'electricical']
    print([s.stem(w) for w in words])
    ['formal', 'allow', 'electric']

    포터 알고리즘과 랭커스터 스태머(Lancaster Stemmer) 알고리즘 비교

    from nltk.stem import PorterStemmer
    s = PorterStemmer()
    words=['policy', 'doing', 'organization', 'have', 'going', 'love', 'lives', 'fly', 'dies', 'watched', 'has', 'starting']
    print([s.stem(w) for w in words])
    ['polici', 'do', 'organ', 'have', 'go', 'love', 'live', 'fli', 'die', 'watch', 'ha', 'start']
    from nltk.stem import LancasterStemmer
    l = LancasterStemmer()
    words=['policy', 'doing', 'organization', 'have', 'going', 'love', 'lives', 'fly', 'dies', 'watched', 'has', 'starting']
    print([l.stem(w) for w in words])
    ['policy', 'doing', 'org', 'hav', 'going', 'lov', 'liv', 'fly', 'die', 'watch', 'has', 'start']

    두 스태머 알고리즘은 서로 다른 결과를 보임

    ※ 표제어 추출, 어간 추출 수행 결과 차이

    Stemming
    am → am
    the going → the go
    having → hav

    Lemmatization
    am → be
    the going → the going
    having → have

    3. 한국어에서의 어간 추출


    한국어의 5언 9품사 구조

    품사
    체언 명사, 대명사, 수사
    수식언 관형사, 부사
    관계언 조사
    독립언 감탄사
    용언 동사, 형용사

    용언에 해당하는 동사, 형용사는 어간(stem)과 어미(ending)의 결합으로 구성됨

    (1) 활용(conjugation)

    용언의 어간(stem)이 어미(ending)를 가지는 일을 말함

    어간(stem) : 용언을 활용할 때, 원칙적으로 모양이 변하지 않는 부분, 활용에서 어미에 선행하는 부분, 어간의 모양도 바뀔 수 있음(예: 긋다, 긋고, 그어서, 그어라)

    어미(ending) : 용언의 어간 뒤에 붙어서 활용하면서 변하는 부분이며, 여러 문법적 기능을 수행

    활용은 어간이 어미를 취할 때, 어간의 모습이 일정하다면 규칙 활용, 어간이나 어미의 모습이 변하는 불규칙 활용으로 나뉨

    (2) 규칙 활용

    어간이 어미를 취할 때, 어간의 모습이 일정함

    잡/어간 + 다/어미

    이 경우 규칙 기반으로 단순히 분리해주면 어간 추출이 됨

    (3) 불규칙 활용

    어간이 어미를 취할 때, 어간의 모습이 바뀌거나 취하는 어미가 특수한 어미일 경우를 말함

    • 어간의 모습이 바뀜: '듣-, 돋-, 잇-, 오르-, 노랗-' 등이 '듣/들-, 돕/도우-, 곱/고우-, 잇/이-, 올/올-, 노랗/노라-'
    • 일반적 어미가 아닌 특수한 어미를 취햐는 경우: '오르+아/어->올라, 하+아/어->하여, 이르+아/어->이르러, 푸르+아/어->푸르러'

    이 경우 단순 분리만으로 어간 추출이 되지않고 좀 더 복잡한 규칙이 필요함

    반응형

    댓글

Designed by Tistory.