본문 바로가기
Study/머신러닝

[2-1] KoNLPy 사용해서 한국어 형태소 분석하기(자연어 처리)

by 투말치 2020. 7. 16.

목차

    반응형

    한국어 형태소를 분석하기위해 KoNLPy 라이브러리를 사용한다. 

    KoNLPy 라이브러리에는 5가지 종류{Hannanum, Kkma, Komoran, Mecab, Okt(Twitter)}의 형태소 분석기가 있다. 파이썬뿐만 아니라 다양한 프로그래밍 언어로 된 형태소 분석을 할 수 있는 라이브러리가 많이 존재한다. 

     

    NLP : National Language Processing의 줄임말로 자연어 처리라는 뜻으로 텍스트에서 의미있는 정보를 분석, 추출, 이해하는 기술이다.

     

    이 글에서는 Okt를 사용해 형태소 분석을 진행한다.

     

    Okt에서 제공하는 함수들

    - morphs() : 텍스트를 형태소 단위로 나눈다.

      옵션 : norm, stem. norm은 normalize의 약자로 문장의 정규화 여부를 정하는 옵션이다. 

      stem은 각 단어에서 어간을 추출할지 정하는 옵션이다. 기본값은 둘다 False.

    - nouns() : 텍스트에서 명사만 추출한다.

    - phrases() : 텍스트에서 어절을 추출한다.

    - pos() : 텍스트를 형태소 단위로 나눈 뒤, 형태소와 품사 정보를 리스트화한 결과를 반환한다.

      pos() 함수도 norm, stem 옵션이 있다.

     

     

    [실습 1 - 간단한 형태소 분석]

    #1 - 간단한 형태소 분석
    from konlpy.tag import Okt
    okt = Okt()
    malist=okt.pos("아버지 가방에 들어가신다.", norm=True, stem=True)
    print(malist)

     

     

    [실습1] 결과 화면

    1. Okt() 메서드를 사용해 Okt 객체를 생성한다.

    2. malist 변수에 해당 텍스트를 형태소로 나눈 뒤, 형태소와 품사 정보를 리스트화한 결과를 저장한다.

    3. 결과를 보면 텍스트에서 '들어가신다' 부분이 '들어가다'라고 출력되었다. 그 이유는 stem 값을 True로 했기 때문이다. stem 값을 True로 하면 원형을 찾아주기 때문에 '들어가시다'의 원형인 '들어가다'가 출력되었다.

    또한, Okt는 결과 화면과 같이 품사 정보를 읽기 쉽게 출력해준다. 

     

     

    [실습 2 - 출현 빈도 분석]

    박경리의 "토지"를 활용해 어떤 명사가 얼마나 나오는 지 분석해보겠다.

    import codecs
    from bs4 import BeautifulSoup
    from konlpy.tag import Okt
    
    
    fp = codecs.open("BEXX0003.txt", "r", encoding="utf-16")
    soup = BeautifulSoup(fp, "html.parser")
    text = soup.select_one('body').text  #body 태그 안의 텍스트 추출(텍스트가 태그 안에 존재하기 때문)
    
    okt=Okt()
    word_dic={} #딕셔너리 변수 선언
    lines=text.split("\n") 
    for line in lines:
        malist=okt.pos(line)  #문장을 형태소로 분석 후 품사 정보와 함께 저장
        for word in malist:  #word 값 예시 => ('마을', 'Noun')
            print(word)
            if word[1]=="Noun":  #품사 정보가 Noun, 즉 품사가 명사라면 딕셔너리 변수에 해당 글자를 딕셔너리 변수에 넣음
                if not (word[0] in word_dic):
                    word_dic[word[0]]=0
                word_dic[word[0]]+=1
    
    keys=sorted(word_dic.items(), key=lambda x:x[1], reverse=True)
    for word, count in keys[:50]:
        print("{0}({1})".format(word, count), end="")
    print()

     

     

    [실습 2] 결과 화면

    1. 박경리의 "토지" 파일은 국립국어원 언어 정보 나눔터 말뭉치 데이터베이스에서 다운로드 받을 수 있다. 

    https://ithub.korean.go.kr/user/total/database/corpusManager.do

     

    ::: 국립국어원 언어정보나눔터 :::

     

    ithub.korean.go.kr

    2. 텍스트가 body 태그 안에 존재하기 때문에 텍스트만 추출하기 위해 BeautifulSoup을 사용한다.

    3. 텍스트를 한 줄씩 분리하고 한 줄씩 형태소를 분석해서 품사 정보와 함께 malist에 저장한다.

    4. 단어가 key값, 해당 단어의 빈도 값이 value로 word_dic 변수에 저장된다.

    5. 빈도 수가 높은 단어부터 출력하기 위해 word_dic변수를 정렬한 다음에 출력한다.

     

     

    참고자료

     

    파이썬을 이용한 머신러닝, 딥러닝 실전 개발 입문_ 쿠지라 히코우즈쿠에 저          

    반응형