윈도우에 mecab 설치하기

<1단계: C언어 기반의 mecab 설치>
C 드라이브에 mecab 폴더를 만든다. (“C:/mecab”)
mecab-ko-msv를 윈도우 버전에 따라 32bit (mecab-ko-msvc-x84.zip) /  64bit (mecab-ko-msvc-x64.zip)선택하여 다운로드한 후 압축을 푼다.

<2단계: mecab 사전 철치>
사전 링크에서 mecab-ko-dic-msvc.zip 기본 사전을 다운로드받아서 (“C:/mecab”)에 압축을 푼다.

<3단계: python용 mecab 설치>
– 해당 경로에서 버전에 맞는 라이브러리를 다운로드 한다.
(예시, 64bit window에 3.6 파이썬은 mecab_python-0.996_ko_0.9.2_msvc-cp35-cp35m-win_amd64.whl를 다운로드 받는다.)
– 다운로드 받은 라이브러리를 설치한다.
> pip install mecab_python-0.996_ko_0.9.2_msvc-cp35-cp35m-win_amd64.whl

Elasticsearch 찾아서 항목 지우기 예시

for day in data:
    query = {"query": {
             "range": {
                "day": {
                    "gte":day,
                    "lte":day,
            }}}}
    result = es.delete_by_query(index='content', doc_type='_doc', body=query)

    item = data[day]
    doc = {"day": day,
           "p0": item['p0'],
           "p1": item['p1'],
           "p2": item['p2'],
           "p3": item['p3'],
           "p4": item['p4'],
           "p5": item['p5'],
           "p6": item['p6'],
           "p7": item['p7'],
           "@timestamp": edate + 'T00:00:00.0Z'}
    es.index(index="content", doc_type="_doc", body=doc)
data = 
{
   "2020-07-13":{
      "p0":7,
      "p1":0,
      "p2":0,
      "p3":40,
      "p4":7,
      "p5":0,
      "p6":7,
      "p7":0
   },
   "2020-07-14":{
      "p0":6,
      "p1":0,
      "p2":0,
      "p3":43,
      "p4":4,
      "p5":0,
      "p6":2,
      "p7":0
   }
}

tinydb 예시

참고) tinydb document: https://buildmedia.readthedocs.org/media/pdf/tinydb/latest/tinydb.pdf

# json 테스트 입력 파일
{
  "_default":{
    "1": {"type": "tag", "name": "A0", "scopeKind": "struct1"},
    "2": {"type": "tag", "name": "A0", "scopeKind": "struct2"},
    "3": {"type": "tag", "name": "A0", "scopeKind": "struct3"},
    "4": {"type": "tag", "name": "A1", "scopeKind": "struct4"},
    "5": {"type": "tag", "name": "A1", "scopeKind": "struct5"}
  }
}

Example #1

from tinydb import TinyDB, Query
import pprint
pp = pprint.PrettyPrinter(indent=4)

db = TinyDB('./test_json_1.dic')

filter = Query()
# 항목 제거
db.remove(filter.scopeKind == 'struct4')
# 항목 업데이트
db.update({'scopeKind': 'struct7'}, filter.name == 'A1')
# 항목 삽입
db.insert({ 'name': 'user', 'permissions': [{'type': 'read'}]})
# 출력 확인
pp.pprint(db.all())
# json 테스트 출력 파일
[   {'name': 'A0', 'scopeKind': 'struct1', 'type': 'tag'},
    {'name': 'A0', 'scopeKind': 'struct2', 'type': 'tag'},
    {'name': 'A0', 'scopeKind': 'struct3', 'type': 'tag'},
    {'name': 'A1', 'scopeKind': 'struct7', 'type': 'tag'},
    {'name': 'user', 'permissions': [{'type': 'read'}]}]

Example #2

from tinydb import TinyDB, Query
import pprint
pp = pprint.PrettyPrinter(indent=4)
db = TinyDB('./test_json_2.dic')
filter = Query()

# 항목 제거
db.remove(filter.word == "you've")
# 항목 업데이트
db.update({'tag': 'NNP'}, filter.word == '예')
# 항목 삽입
db.insert({'word': 'zzz', 'tag':'NNG'})

# 출력 확인
data = db.all()
pp.pprint(data)
# json 테스트 입력 파일
{
"_default":{
"1": {"word":"예","tag":"NNG"},
"2": {"word":"한","tag":"MM"},
"3": {"word":"다음","tag":"NNG"},
"4": {"word":"돈","tag":"NNG"},
"5": {"word":"사","tag":"NNG"},
"6": {"word":"아","tag":"NNG"},
"7": {"word":"you've","tag":"NNG"}
}
}

자연어처리 (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

Feature Weight Algorithm

1. TF-IDF

TFIDF 알고리즘은 정보 검색 분야에서 가장 중요한 알고리즘이었습니다. 검색, 문서 분류와 관련된 분야에서 널리 사용되었으며, 정보 검색 상관 관계의 척도였습니다. TFIDF 알고리즘의 기본 개념은 다음과 같은 두 가지 측면을 포함합니다.

  • TF (빈도) – 문서의 용어의 빈도가 높을수록 용어의 가중치를 많이 반영함
  • IDF (역문서 빈도)- 주어진 문서 집합에서 용어를 포함하는 문서의 수가 많을수록 용어의 가중치를 낮게 반영함
N: 문서 집합 D의 크기, 또는 전체 문서의 수
n: 해당 단어가 포함된 문서의 수