자연어처리 (NLP) 도구들

1. 한국어 형태소 분석기

한국어 텍스트를 분석할 때 가장 기본적으로 수행하는 형태소 분석기 & 품사태거

2. 다른 텍스트 분석 도구들

3. 말뭉치 (코퍼스)

4. 그 밖의 도움도는 사이트

konlpy 품사태거 성능 비교

성능 비교 (1회 실행 시간 – 10개 문장에 대해서 1000번 실행 후, 총 실행 시간을 1,000으로 나눔)
– 품질 비교는 해보지 않았지만, 실행 시간만으로는 mecab 분석기가 압도적으로 빠르네요…

품사 부착기pos 평균 시간morphs, nouns, pos 평균 시간순위
kkma0.0237280.0560484
komoran0.0017710.0045862
mecab0.0000830.0002231
twitter0.0076740.0117523
# 속도 측정
testList = [
    "파일 단위로 단어를 등록하는 경우에는 등록한 이후 pip install customized_konlpy를 다시 실행시켜줘야 반영이 된다.",
    "한국어 정보처리를 위한 파이썬 패키지입니다.",
    "자세히 보아야 아름답다. 너도 그렇다",
    "기존 트위터 분석기 사전에 존재하지 않는 단어를 추가할 때 사용한다.",
    "자신이 분석하는 domain specific 단어를 추가할 때 유용하다",
    "단어 선택/필터/치환/결합 목록을 파일에 저장하고 로딩해서 실행하기",
    "ckonlpy는 기존의 다른 형태소 분석기와 다르게 사용자 맞춤형으로 단어 추가/필터/변형/결합 등 data cleansing을 분석가 구미에 맞게 수정할 수 있는 파이썬 패키지이다.",
    "더불어, 지속적으로 업데이트가 되고 있고 질문을 올리면 만드신 분이 feedback도 잘 주어서 앞으로도 더 발전해 나갈것으로 보인다.",
    "실제로 한국어 Text Mining을 하였을 때 ckonlpy를 쓰면서 성능이 많이 좋아졌다.",
    "ckonlpy 말고도 soyspacing, KR-WordRank 등 한국어 관련 여러가지 라이브러리를 개발하고 계신데, 앞으로 이런것들이 잘 통합되어서 한국어 Text 분석의 디딤돌이 되었으면 좋겠다."
]

kkma = Kkma()
komoran = Komoran()
mecab = Mecab()
twitter = Twitter()

posTaggerList = [kkma, komoran, mecab, twitter]
for i in range(len(posTaggerList)):
    start_time = time.time()
    import random
    for j in range(1000):
        index = random.randrange(10)
        posTaggerList[i].morphs(testList[index])
        posTaggerList[i].nouns(testList[index])
        posTaggerList[i].pos(testList[index])
    print("%s: [%f seconds]" % (type(posTaggerList[i]), (time.time() - start_time) / 1000))

konlpy 사용 방법

KoNLPy는 한국어 정보처리를 위한 파이썬 패키지입니다.

설치

우분투

1. Install dependencies
# Install Java 1.7 or up
$ sudo apt-get install g++ openjdk-7-jdk python-dev python3-dev

2. Install KoNLPy
$ pip install konlpy # Python 2.x
$ pip3 install konlpy # Python 3.x

3. MeCab 설치하기 (선택사항)
$ sudo apt-get install curl
$ bash <(curl -s https://raw.githubusercontent.com/konlpy/konlpy/master/scripts/mecab.sh)

※ Mecab 실행시, ” NameError: name ‘Tagger’ is not defined ” 오류가 난다면 아래와 같이 직접 설치한다.

  • (venv)git clone https://bitbucket.org/eunjeon/mecab-python-0.996.git
  • (venv)cd mecab-python-0.996/
  • (venv)python3 setup.py build
  • (venv)python3 setup.py install

CentOS

1. Install dependencies
$ sudo yum install gcc-c++ java-1.7.0-openjdk-devel python-devel

$ wget http://peak.telecommunity.com/dist/ez_setup.py # Python 2.x
$ sudo python ez_setup.py
$ sudo easy_install pip

$ wget https://www.python.org/ftp/python/3.4.3/Python-3.4.3.tar.xz # Python 3.x
$ tar xf Python-3.*
$ cd Python-3.*
$ ./configure
$ make # Build
$ sudo make altinstall

2. Install KoNLPy
$ pip install konlpy # Python 2.x
$ pip3.4 install konlpy # Python 3.x

3. MeCab 설치하기 (선택사항)
$ sudo yum install curl
$ bash <(curl -s https://raw.githubusercontent.com/konlpy/konlpy/master/scripts/mecab.sh)

맥 OS

1. Install KoNLPy
$ pip install konlpy # Python 2.x
$ pip3 install konlpy # Python 3.x

2. MeCab 설치하기 (선택사항)
$ bash <(curl -s https://raw.githubusercontent.com/konlpy/konlpy/master/scripts/mecab.sh)

간단한 사용 방법

kkma 분석기

import time
from konlpy.tag import Kkma
text = '한국어 정보처리를 위한 파이썬 패키지입니다.'

kkma = Kkma()

start_time = time.time()
print(kkma.morphs(text))
# ['한국어', '정보', '처리', '를', '위하', 'ㄴ', '파이', '썰', 'ㄴ', '패키지', '이', 'ㅂ니다', '.']

print(kkma.nouns(text))
# ['한국어', '정보', '정보처리', '처리', '파이', '패키지']

print(kkma.pos(text))
# [('한국어', 'NNG'), ('정보', 'NNG'), ('처리', 'NNG'), ('를', 'JKO'), ('위하', 'VV'), ('ㄴ', 'ETD'), ('파이', 'NNG'), ('썰', 'VV'), ('ㄴ', 'ETD'), ('패키지', 'NNG'), ('이', 'VCP'), ('ㅂ니다', 'EFN'), ('.', 'SF')]

print("[%s seconds]" %(time.time() - start_time))
# [5.366621971130371 seconds]

Mecab 분석기

import time
from konlpy.tag import Kkma, Komoran, Mecab, Twitter
text = '한국어 정보처리를 위한 파이썬 패키지입니다.'

mecab = Mecab()

start_time = time.time()
print(mecab.morphs(text))
# ['한국어', '정보', '처리', '를', '위한', '파이썬', '패키지', '입니다', '.']

print(mecab.nouns(text))
# ['한국어', '정보', '처리', '파이썬', '패키지']

print(mecab.pos(text))
# [('한국어', 'NNG'), ('정보', 'NNG'), ('처리', 'NNG'), ('를', 'JKO'), ('위한', 'VV+ETM'), ('파이썬', 'NNP'), ('패키지', 'NNG'), ('입니다', 'VCP+EF'), ('.', 'SF')]

print("[%s seconds]"%(time.time() - start_time))
# [0.0006389617919921875 seconds]

Komoran 분석기

import time
from konlpy.tag import Komoran
text = <strong>'한국어 정보처리를 위한 파이썬 패키지입니다.'

komoran = Komoran()

start_time = time.time()
print(komoran.morphs(text))
# ['한국어', '정보', '처리', '를', '위하', 'ㄴ', '파이썬', '패키지', '이', 'ㅂ니다', '.']

print(komoran.nouns(text))
# ['한국어', '정보', '처리', '파이썬', '패키지']

print(komoran.pos(text))
# [('한국어', 'NNP'), ('정보', 'NNG'), ('처리', 'NNG'), ('를', 'JKO'), ('위하', 'VV'), ('ㄴ', 'ETM'), ('파이썬', 'NNP'), ('패키지', 'NNP'), ('이', 'VCP'), ('ㅂ니다', 'EF'), ('.', 'SF')]

print("[%s seconds]" %(time.time() - start_time))
# [0.035352230072021484 seconds]

Twitter 분석기

import time
from konlpy.tag import Twitter
text = '한국어 정보처리를 위한 파이썬 패키지입니다.'

twitter = Twitter()

start_time = time.time()
print(twitter.morphs(text))
# ['한국어', '정보처리', '를', '위', '한', '파이썬', '패키지', '입니다', '.']

print(twitter.nouns(text))
# ['한국어', '정보처리', '위', '파이썬', '패키지']

print(twitter.pos(text))
# [('한국어', 'Noun'), ('정보처리', 'Noun'), ('를', 'Josa'), ('위', 'Noun'), ('한', 'Josa'), ('파이썬', 'Noun'), ('패키지', 'Noun'), ('입니다', 'Adjective'), ('.', 'Punctuation')]


print("[%s seconds]" %(time.time() - start_time))
# [4.22565221786499 seconds]

사용자 사전 추가 방법

kkma 분석기

1. 사전 포함 jar 파일 압축 해제한다.

$ cd .conda/envs/keyword/lib/python3.6/site-packages/konlpy/java
$ mkdir kkma 
$ cd kkma
$ jar xvf ../kkma-2.0.jar

 dic/ecat/ChemFormula.dic
 dic/ecat/CompNoun.dic
 dic/ecat/JunkWord.dic
 dic/ecat/UOM.dic
 dic/ecat/VerbJunkWord.dic
 dic/ecat/VerbNoun.dic
 dic/kcc.dic
 dic/noun.dic
 dic/person.dic
 dic/prob/lnpr_morp.dic
 dic/prob/lnpr_pos.dic
 dic/prob/lnpr_pos_g_exp.dic
 dic/prob/lnpr_pos_g_morp_inter.dic
 dic/prob/lnpr_pos_g_morp_intra.dic
 dic/prob/lnpr_syllable_bi.dic
 dic/prob/lnpr_syllable_uni_noun.dic
 dic/raw.dic
 dic/simple.dic
 dic/verb.dic
2. dic 디렉토리로 이동하여 여러 사전 파일 중에서 noun.dic 파일을 수정한다.

$ cd dic 
$ vi noun.dic
// ==============================================================
// 명사
// ==============================================================
// 일반 명사
각/NNG
간/NNG
감/NNG
값/NNG
강/NNG
3. 상위 디렉토리로 올라가서, jar 파일을 다시 압축하고 기존의 것을 대체한다.

$ cd ..
$ jar cvf kkma-2.0.jar *
$ mv kkma-2.0.jar ../

Komoran 분석기

1. 사전의 포맷
cat './user_dic.txt' 

정보처리 NNG
2. 클래스 생성 시 사용자 사전 파일 할당
komoran = Komoran(userdic='./user_dic.txt')
komoran.pos(sentence)

Mecab 분석기

# Mecab 사전 경로
$ ls /usr/local/lib/mecab/dic/mecab-ko-dic

char.bin
dicrc
left-id.def
matrix.bin
model.bin
pos-id.def
rewrite.def
right-id.def
sys.dic
unk.dic

1. mecab-ko와 mecab-ko-dic 을 다운받아 설치합니다.
mecab-ko-dic 을 꼭 컴파일까지 하셔야 이후에 사전 추가가 가능합니다.

2. 1번에서 받은 파일을 mecab-ko-dic/userdic 디렉토리 안에 csv 확장자로 사전 파일을 추가한다.

userdic/
├── nnp.csv
├── person.csv
└── place.csv
  • nnp.csv (일반적인 고유명사 추가)
    • 대우,,,,NNP,*,F,대우,*,*,*,*,*
    • 구글,,,,NNP,*,T,구글,*,*,*,*,*
  • person.csv (인명 추가)
    • 까비,,,,NNP,인명,F,까비,*,*,*,*,*
  • place.csv (지명 추가)
    • 세종,,,,NNP,지명,T,세종,*,*,*,*,*
    • 세종시,,,,NNP,지명,F,세종시,Compound,*,*,세종+시,세종/NNP/지명/1/1+세종시/Compound/지명/0/2+시/NNG/*/1/1

3. 추가한 사전을 컴파일 한다.
$ mecab-ko-dic/tools/add-userdic.sh

아래와 같이 user-xxx.csv 사전이 추가된 모습을 볼 수 있다. 사실 아래 파일은 컴파일 되기 직전의 파일이며, 실제로 sys.dic 파일에 바이너리로 컴파일 되어 들어가게 된다.

mecab-ko-dic
├── ....
├── user-nnp.csv
├── user-person.csv
├── user-place.csv
└── ...

4. 실행을 하여 설치를 한다.
$ make install