형태소 분석기, Okt(Open Korean Text) (구)트위터 형태소분석기

    Okt(Open Korean Text)는 트위터에서 만든 오픈소스 한국어 처리기인 twitter-korean-text를 이어받아 만들고 있는 프로젝트이다. 

     

    형태소 분석기 OKT

     

    기존 형태소 분석기인 트위터 형태소 처리기의 깃헙(github)을 들어가면

    github.com/twitter/twitter-korean-text

     

    twitter/twitter-korean-text

    Korean tokenizer. Contribute to twitter/twitter-korean-text development by creating an account on GitHub.

    github.com

    기존 트위터 형태소 분석기에 다음과 같은 내용이 있다.

     

    트위터 형태소 분석기 캡쳐 화면

     

    트위터에서 넘어온 깃허브 주소는 아래와 같고

    github.com/open-korean-text/open-korean-text

     

    open-korean-text/open-korean-text

    Open Korean Text Processor - An Open-source Korean Text Processor - open-korean-text/open-korean-text

    github.com

    트위터 형태소 분석기의 개념은 그대로 이어 받은 프로젝트이다.

     

    형태소 처리기

    트위터 형태소 분석기는 자신들을 형태소 분석기라 말을 하지 않고, 형태소 처리기라고 한다. 사실 프로젝트를 하다보면 너무나도 정교한 형태소 분석은 오히려 독이 될 수 있다.

     

    1. 너무나도 정교하게 형태소 분석을 수행하지만, 너무 잘게 쪼개져서 오히려 의미분석을 하기 힘들다
    2. 자연어 프로젝트를 할 때 사실 대부분은 명사와 부사, 동사 정도만 사용한다.
    3. 분석이 너무 정교해지면 속도가 기하급수적으로 느려진다.

     

    사실 가장 큰 문제는 3번째인 속도라고 할 수 있다. 형태소 분석기중 유명한 꼬꼬마(Kkma)는 필드에서 사실 보기 힘든데 속도가 너무 느리기 때문에 현업에서 쓰기 힘들다. 그러다보니 명사, 부사, 동사 정도만 잘 추출하고 속도가 잘 나오는 것이 프로젝트에 유리하며, 이러한 Goal갖고 만들었다 생각한다.

     

    형태소 분석기 처리 속도 비교

    형태소 분석기 속도 비교, kolnpy.org

     

    kolnpy 사이트에 있는 속도 비교 항목을 보면, 비록 Okt가 제일 빠르지는 않지만 꼬꼬마, 코모란이 로딩에 5초 정도 걸리는 것에 비해 1.48초라는 합리적인 속도가 소비되며, 가장 중요한 10만 문자의 분석 시간에 Mecab(은전한닢)보다는 느리지만, 2.47초로 코모란보다 10배, 꼬꼬마보다는 17배 정도 빠른 속도를 보여주고 있다. 

     

     

    실행 코드

    라이브러리 추가 및 클래스 선언

    from konlpy.tag import Okt
    okt = Okt()

     

    정규화(normalization) 처리

    text = '안녕하세욬ㅋㅋㅋ 반가워요 샤릉해'
    print(okt.normalize(text))
    
    > 안녕하세요ㅋㅋㅋ 반가워요 사랑해

    normalize는 정규화 처리를 해주는 펑션이다. 쉽게 생각해서 어지럽힌 문장을 깔끔하게 만들어준다는 생각을 하면 된다. 예시에서 "안녕하세욬ㅋ"의 경우 "안녕하세요ㅋ"로 "샤릉해"는 "사랑해"로 변환하였다.

     

    정규화 처리를 하게 되면, 단어의 개수를 줄일 수 있어서 자연어 처리 성능을 얻을 수 있고, Input과 Output의 차이점을 토대로 해당 문장에 정규화 처리가 필요하다는 insight등을 얻을 수도 있을 것이다.

     

    어구 추출(Phrase Extraction)

    text = "장중 큰 변동 폭을 보이던 코스피가 사흘 만에 소폭 반등했다."
    print(okt.phrases(text))
    
    > ['장중', '장중 큰 변동', '장중 큰 변동 폭', '코스피', '사흘', '소폭', '소폭 반등', '변동', '반등']

    phrases 펑션을 사용하면 어구만을 뽑아주는 기능도 제공한다.

     

    형태소 분석

    text = '안녕하세요. 오래간만이네요~~. 어제 재미있었어요.'
    print(okt.morphs(text))    # stem, default False
    
    > ['안녕하세요', '.', '오래간만', '이네요', '~~.', '어제', '재미있었어요', '.']

    형태소 기반으로 리스트 형태로 리턴을 해주는 펑션이 morphs인데 문제는 여기에 태그가 없기 때문에 어떤 형태소가 어떤 품사인지 알 수가 없다.

     

    형태소 분석(Pos Tagger)

    text = '안녕하세요. 오래간만이네요~~. 어제 재미있었어요.'
    print(okt.pos(text))
    > [('안녕하세요', 'Adjective'), ('.', 'Punctuation'), ('오래간만', 'Adverb'), ('이네요', 'Verb'), ('~~.', 'Punctuation'), ('어제', 'Noun'), ('재미있었어요', 'Adjective'), ('.', 'Punctuation')]
    
    print(okt.pos(text, join=True))
    > ['안녕하세요/Adjective', './Punctuation', '오래간만/Adverb', '이네요/Verb', '~~./Punctuation', '어제/Noun', '재미있었어요/Adjective', './Punctuation']

    품사를 리턴해주는 일반적인 형태소 분석은 pos라는 펑션으로 호출을 해야 한다. 이때 default를 호출 할 경우 리스트 안 튜플 형태로 결과가 제공되고, join=True를 넣을 경우 튜플없이 문자열안에 슬래쉬(/) 구분자로 리턴 된다. 

     

    명사(Noun) 추출

    text = "장중 큰 변동 폭을 보이던 코스피가 사흘 만에 소폭 반등했다."
    print(okt.nouns(text))
    
    > ['장', '변동', '폭', '보', '코스피', '사흘', '폭', '반등']

    명사 데이터를 리스트로 제공받길 원하면 nouns 펑션을 호출하면 된다. 우리나라 말은 명사 자체가 행동값까지 포함이 되는 경우가 많다. 예를 들어 공부하다의 경우 "공부하다" 그 자체가 "study"가 되지만 우리나라는 공부+하다로 분리되어

     

    ('공부', 'Noun'), ('하다', 'Verb')

    이와 같은 형태로 분리 된다. 결국 명사만 추출하더라도 왠만한 자연어처리는 상당히 많이 할 수 있다.

     

    참고자료

    https://konlpy.org/ko/v0.5.2/morph/
    https://github.com/open-korean-text/open-korean-text

     

    연관자료

    [Java] 자바로 한글 자모(초성,중성,종성) 분리(추출)하기 (+개념)

    형태소 분석의 개념과 konlpy로 사용 하기

    [Python] 파이썬을 이용한 자모(초성/중성/종성) 분리 및 결합하기

    댓글

    Designed by JB FACTORY