본문 바로가기

java

[Java] 코모란(Komoran) 형태소분석기 사용하기

 

문장에서 가장 많이 나오는 단어에 해당되는 인덱스 컬럼을 가져오고 싶어서 match 검색 함수를 사용했다

select  a.tags as tags, match (tags) against (?'serch Text' IN BOOLEAN MODE) as score 
from adjuster_member a
group by a.id order by score desc

match (tags) against 에 관한 설명

 

링크 - https://kmongcom.wordpress.com/2014/03/28/mysql-%ED%92%80-%ED%85%8D%EC%8A%A4%ED%8A%B8fulltext-%EA%B2%80%EC%83%89%ED%95%98%EA%B8%B0/

 

 

하지만 match  사용법을 잘 몰라서 인지 인덱스에 여행, 노력, 목표, 바다 이렇게 등록 돼있으면

 

'여행을 가려는 노력이 목표가 되면 바다로 가자' 

이런 문장에서 '여행을' '목표가'..  '여행' '목표' 랑은 다른 단어로 인식되어  검색이 안되는 문제가 있었다

 

그떄 활용하게 된 형태소분석기

 

Pom.xml 

우선 코모란을 설정하기 위해서 pom.xml 디펜던시(dependency)를 설정해야 하는데 코모란 디펜던시를 위해서 레파지토리도 추가해야 한다.

 

Repository

<repositories>
    <repository>
        <id>jitpack.io</id>
        <url>https://jitpack.io</url>
    </repository>
</repositories>

 

Dependency

<dependency>
    <groupId>com.github.shin285</groupId>
    <artifactId>KOMORAN</artifactId>
    <version>3.3.4</version>
</dependency>

위와 같이 pom.xml 설정이 완료되면, pom.xml을 업데이트하여, 디펜던시 jar 파일을 다운로드 한다.

 

그림 1. repository에 KOMORAN이 있는 모습

 

repository -> com -> github -> shin285 -> KOMORAN -> 3.3.4 폴더에 가면, 그림 1과 같이 jar 파일이 있는 것을 확인할 수 있다.

 

사용 예제

import kr.co.shineware.nlp.komoran.constant.DEFAULT_MODEL;
import kr.co.shineware.nlp.komoran.core.Komoran;
import kr.co.shineware.nlp.komoran.model.KomoranResult;
import kr.co.shineware.nlp.komoran.model.Token;

import java.util.List;

public class NLP01 {
    public void action() {
        Komoran komoran = new Komoran(DEFAULT_MODEL.FULL);
        String document = "데이터분석은 참 재미있는 것 같아요";

        KomoranResult analyzeResultList = komoran.analyze(document);
        System.out.println(analyzeResultList.getPlainText());

        List<Token> tokenList = analyzeResultList.getTokenList();
        for(Token token : tokenList) {
            System.out.format("(%2d, %2d) %s/%s\n", token.getBeginIndex(),
                    token.getEndIndex(), token.getMorph(), token.getPos());
        }

        List<String> nounList = analyzeResultList.getNouns();
        for(String noun : nounList) {
            System.out.println(noun);
        }
    }
}

 

위 사용 예제를 보면, System.out 출력 내용이 3개가 되는데 각각의 결과는 아래와 같다.

 

데이터/NNG 분석/NNP 은/JX 참/MAG 재미있/VA 는/ETM 것/NNB 같/VA 아요/EC
( 0,  3) 데이터/NNG
( 3,  5) 분석/NNP
( 5,  6) 은/JX
( 7,  8) 참/MAG
( 9, 12) 재미있/VA
(12, 13) 는/ETM
(14, 15) 것/NNB
(16, 17) 같/VA
(17, 19) 아요/EC
데이터
분석

 

코드 설명

Komoran komoran = new Komoran(DEFAULT_MODEL.FULL);

코드에 대해서 설명을 하자면, 우선 KOMORAN에 내장되어 있는 디폴트 Full 모델을 호출한다. 

 

KomoranResult analyzeResultList = komoran.analyze(document);

그리고 komoran의 메소드인 analyze에 인자값으로 텍스트를 넣어서 분석 결과를 KomoranResult 형태로 담는다.

 

System.out.println(analyzeResultList.getPlainText());

위와 같이 getPlainText를 그대로 출력하게 되면, 

 

데이터/NNG 분석/NNP 은/JX 참/MAG 재미있/VA 는/ETM 것/NNB 같/VA 아요/EC

pos tagging이 같이 들어있는 텍스트 형태로, 형태소 분석 결과를 그대로 출력한다. 

 

List<Token> tokenList = analyzeResultList.getTokenList();
for(Token token : tokenList) {
    System.out.format("(%2d, %2d) %s/%s\n", token.getBeginIndex(),
            token.getEndIndex(), token.getMorph(), token.getPos());
}

getTokenList의 메소드를 호출하면, token 형태로 결과를 담게 되는데 이 토큰에는 형태소가 문자열의 어느 위치에서 생성된 것인지, 그리고 형태소 분석 결과가 같이 출력된다.

( 0,  3) 데이터/NNG
( 3,  5) 분석/NNP
( 5,  6) 은/JX
( 7,  8) 참/MAG
( 9, 12) 재미있/VA
(12, 13) 는/ETM
(14, 15) 것/NNB
(16, 17) 같/VA
(17, 19) 아요/EC

특정 품사를 기반으로 개발을 해야 할 경우, getPos에서 어떤 품사가 뽑혔는지를 보면서 개발을 하면 되기에 품사들이 필요할 경우 가장 많이 사용되는 방식이다.

 

List<String> nounList = analyzeResultList.getNouns();
for(String noun : nounList) {
    System.out.println(noun);
}

마지막으로 getNouns를 하면, String List 형태로 리턴이 되는데, 명사만 가져오는 것이기에 이런 심플한 구조로 되어 있다.

데이터
분석

 

참고자료

https://docs.komoran.kr/firststep/tutorial.html

[] 코모란, https://www.shineware.co.kr/products/komoran/

 

 

 

출처 : https://needjarvis.tistory.com/740

 

===================실습===========================

maven 이 아닌 gradle 사용해서 pom.xml 이 아닌 build.gradle 에 의존성 설정

plugins {
    id 'java'
}

group 'kr.co.shineware.komoran.tutorials'
version '0.0.1-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
    maven { url 'https://jitpack.io' }
}

dependencies {
    implementation 'com.github.shin285:KOMORAN:3.3.4'
}

객체 생성할떄  DEFAULT_MODEL.FULL 가아닌 DEFAULT_MODEL.EXPERIMENT 쓰는 자료도 있었는데 

DEFAULT_MODEL.EXPERIMENT 은 에러나서 FULL 로 사용헀다(차이는 모름)

 

Komoran komoran = new Komoran(DEFAULT_MODEL.FULL);

 

Komoran komoran = new Komoran(DEFAULT_MODEL.EXPERIMENT);

 

* 나머진 위 자료와 같습니다