stopwords for konlpy - hexists/konlpy GitHub Wiki

stopwords for konlpy

stopwords PR이 아직 merge 되지 않았습니다.
PR이 merge 된 뒤 이 글을 보면 더 좋을 것 같아 적극적인 공유는 잠시 미룹니다.

stopwords

stopwords, 한국어로 불용어는 텍스트를 분석할 때 의미가 없어 사용하지 않는 단어를 의미합니다.
보통 문서에서 일반적으로 나타나는 단어를 의미하며, 관사나 전치사 혹은 조사 등이 있습니다.
예를 들어, 영어에서 'a, the'와 같은 단어나 한국어에서 '이, 가'와 같은 단어입니다.

stopwords를 얼마나 잘 다루느냐에 따라 더 적절한 분석을 할 수 있습니다. 단어의 빈도가 분석시 중요한 요소라고 할 때, 고빈도의 stopwords를 제외하면 더 유의미한 결과를 얻을 수 있습니다.

보통 stopwords는 입력 문서에 따라 정의해서 사용하지만, 미리 정의된 stopwords가 있다면 분석 작업을 좀 더 쉽게 할 수 있습니다.

대표적인 자연어처리 도구인 NLTK에서는 11개 언어를 대상으로 2,400개의 stopwords를 제공합니다. 미리 제공된 stopwords를 통해 분석시 큰 의미가 없는 단어들을 처리합니다. 아쉽게도 NLTK는 한국어 stopwords를 제공하지 않습니다. 그래서, 한국어를 위한 stopwords를 제공하면 좋겠다는 생각이 들었습니다.

한국어 stopwords 개발

한국어 stopwords는 크게 3단계 과정으로 개발했습니다.

1) nltk stopwords 제공 방법 조사
2) 한국어 stopwords 자료 조사 및 수집
3) stopwords 기능 개발

먼저, NLTK에서 stopwords를 어떻게 제공하는지를 확인해봤습니다. 그리고, 한국어 stopwords 개발을 위해 자료들을 조사하고 수집했습니다. 마지막으로 konlpy에서 stopwords를 제공하기 위해 코드를 분석하고 개발했습니다.

nltk stopwords 제공 방법 조사

NLTK는 아래처럼 stopwords를 사용할 수 있습니다.

>>> from nltk.corpus import stopwords  
>>> stopwords.words('english')

이렇게 호출을 하면, list 형태로 stopwords를 불러옵니다. stopwords는 사용자가 약간의 코드를 더해서 필요한 형태로 사용하게 됩니다. 입력을 tokenize 다음 stopwords에 포함된 경우를 제외하거나, stopwords가 포함된 token에 penalty를 주는 등 여러가지 형태로 활용합니다.

stopwords는 nltk의 corpus class에 위치합니다. corpus class에서 여러 종류의 corpus를 사용할 수 있는데, 그 중 하나로 stopwords corpus가 제공되고 있습니다. stopwords의 출처는 Porter el al로 나오는데, Porter Stemmer에서 가져온 것으로 보입니다. (이 부분에 대해서는 좀 더 확인이 필요합니다.)

Corpus	Compiler	Contents
Stopwords Corpus	Porter et al	2,400 stopwords for 11 languages

한국어 stopwords 자료 조사 및 수집

한국어 stopwords를 제공하기 위해 검색을 통해 다양한 자료들을 수집했습니다. 대표적인 자료들은 아래와 같습니다. 이외에도 여러 자료들이 있었지만 중복되는 것들입니다.

source unit license
bab2min morph 저자에게 사용 허락 받음
ranks.nl word MIT로 추정
spikeekips gist word 저자에게 사용 허락 받음
6 github word apache 2.0
stopwords-iso github word MIT
many-stop-words word MIT

형태소 단위로 제공되는 bab2min의 stopwords와 단어 단위로 수집된 다른 stopwords들이 있습니다. 각기 다른 format으로 저장되어 있고, 자료들간의 중복도 많아 하나로 사용하기 위해 전처리 과정이 필요합니다.

  • bab2min stopwords

    이	VCP	0.018279601
    있	VA	0.011699048
    하	VV	0.009773658
    ...
    
  • ranks.nl stopwords

    아
    휴
    아이구
    ...
    

위 자료들을 사용하기 위해 라이센스를 확인 또는 저자의 허락이 구했습니다. konlpy에서 사용할 때 문제 없음을 확인했습니다. 이 글을 빌어 흔쾌히 stopwords 사용을 허락해주신 bab2min, spikeekips께 감사드립니다.

stopwords 기능 개발

사용자가 익숙하게 사용했던 형태로 konlpy에서도 사용하는 것이 좋을 것 같아 nltk에서 제공하는 형태로 개발했습니다. 함수의 프로토 타입을 정의하고 몇몇 필요한 기능을 개발했습니다.

사용성 측면에서 단어 단위의 stopwords와 형태소 단위의 stopwords를 제공하는 것이 좋을 것 같아, 2가지 형태의 stopwords를 제공할 수 있도록 했습니다. 형태소 단위의 경우 분석기의 종류에 따라 다른 품사를 사용하기 때문에, 이를 각각 다룰 수 있도록 분석기에 맞는 stopwords를 준비하고, analyzer를 지정해서 사용하도록 개발했습니다.

>>> from konlpy.corpus import stopwords
>>> stopwords.words()
>>> stopwords.morph(analyzer='kkma')

또한, 사용자가 필요에 따라 더하고 빼서 사용할 수 있는 기능도 개발했습니다.

>>> stopwords.include('word', ['헐', '네'])
>>> stopwords.exclude('word', ['진짜'])

위 기능들을 konlpy.corpus에 stopwords라는 class를 통해 구현했습니다.

별도로 수집된 stopwords를 konlpy에서 사용할 수 있도록 하나의 파일로 합치는 전처리 프로그램을 개발하고, 형태소 단위의 stopwords 제공을 위해 analyzer에서 사용하는 품사로 변환하는 프로그램을 개발했습니다. (이 프로그램들은 konlpy에 포함하는 것이 적절한지 판단할 수 없어, 다른 repo에 저장한 상태입니다. maintainer에게 해당 내용을 문의한 상태입니다.)

Usage stopwords

konlpy에서 stopwords를 아주 간단하게 사용할 수 있습니다.

  • stopwords 불러오기

    >>> from konlpy.corpus import stopwords
    
  • stopwords 사용하기(단어 단위)

    >>> stopwords.words()
    ['!', '"', '$', ... ]
    
  • stopwords 사용하기(형태소 단위)

    >>> stopwords.morphs(analyzer='kkma')
    ['가/VV', '가지/VV', '같/VA', ... ]
    
  • stopwords 추가하기

    >>> stopwords.include('word', ['헐', '네'])
    
  • stopwords 제외하기

    >>> stopwords.exclude('word', ['진짜'])
    

Futher Works

  • stopwords를 활용하는 example 작성합니다. 어떻게 쓰는지 어떤 점이 좋은지 설명하는 글을 통해 활용도를 높이고 싶습니다.
  • 다양한 문서에서 stopwords 수집하여, stopwords를 보강하고 싶습니다.

References