[OpenAPI] KOMORAN 형태소 분석기 샘플코드 및 사용 후기

    728x90
    반응형

    2023.03.19

    KOMORAN 형태소 분석기

    출처: SHINEWARE 공식 홈페이지

    출처: KOMORAN 문서

    출처: 품사표(KOMORAN 문서)

     

     

    소개

    KOMORAN은 Shineware의 기술로만 연구 및 개발된 한국어 형태소 분석기로서 Java Library 형태(jar)로 제공됩니다.

    KOMORAN 3.0은 기존 KOMORAN 2.0 대비 속도, 정확도가 개선되었으며 타 형태소 분석기와 달리 여러 어절을 하나의 품사로 분석 가능함으로써 형태소 분석기의 적용 분야에 따라 공백이 포함된 고유명사(영화 제목, 음식점명, 노래 제목, 전문 용어 등)를 더 정확하게 분석할 수 있습니다.

     

     

    특징

    1) PureJava: 100% Java로만 개발되었기 때문에 자바가 설치된 환경이라면 어디서든지 사용 가능합니다.

    2) 외부 라이브러리 독립적: 자체 제작한 Library들만을 사용하여 외부 Library와의 의존성 문제가 없습니다.

    3) 경량화: 자소 단위 처리, TRIE 사전 등으로 약 50MB 메모리 상에서도 동작 가능합니다.

    4) Easy To Use: Library 적용 후 소스 코드 내 1줄만 추가하여 형태소 분석기를 사용할 수 있습니다.

    5) 사전 관리 용이: 일반 텍스트 파일의 형태로 구성되어 가독성이 높으며 바로 편집이 가능합니다.

    6) 새로운 분석 결과: 타 형태소 분석기와 달리 공백이 포함된 형태소 단위로 분석이 가능합니다.

     

     

    품사표(PoS Table)

    1) KOMORAN 형태소 분석기는 분석된 형태소를 품사로 분리한 결과표를 제공한다.

    2) KOMORAN은 21세기 세종계획 의 품사 기준을 따르고 있다. 전체 품사들은 아래 표와 같으며, 세분류를 기준으로 출력된다.

    체언 명사NN 일반명사NNG
    고유명사NNP
    의존명사NNB
    대명사NP 대명사NP
    수사NR
    용언 동사VV 동사VV
    형용사VA 형용사VA
    보조용언VX 보조용언VX
    지정사VC 긍정지정사VCP
    부정지정사VCN
    수식언 관형사MM 관형사MM
    부사MA 일반부사MAG
    접속부사MAJ
    독립언 감탄사IC 감탄사IC
    관계언 격조사JK 주격조사JKS
    보격조사JKC
    관형격조사JKG
    목적격조사JKO
    부사격조사JKB
    호격조사JKV
    인용격조사JKQ
    보조사JX 보조사JX
    접속조사JC 접속조사JC
    의존형태 어미E 선어말어미EP
    종결어미EF
    연결어미EC
    명사형전성어미ETN
    관형형전성어미ETM
    접두사XP 체언접두사XPN
    접미사XS 명사파생접미사XSN
    동사파생접미사XSV
    형용사파생접미사XSA
    어근XR 어근XR
    기호 마침표,물음표,느낌표SF 마침표,물음표,느낌표SF
    쉼표,가운뎃점,콜론,빗금SP 쉼표,가운뎃점,콜론,빗금SP
    따옴표,괄호표,줄표SS 따옴표,괄호표,줄표SS
    줄임표SE 줄임표SE
    붙임표(물결,숨김,빠짐)SO 붙임표(물결,숨김,빠짐)SO
    외국어SL 외국어SL
    한자SH 한자SH
    기타기호(논리수학기호,화폐기호)SW 기타기호(논리수학기호,화폐기호)SW
    명사추정범주NF 명사추정범주NF
    용언추정범주NV 용언추정범주NV
    숫자SN 숫자SN
    분석불능범주NA 분석불능범주NA

     

     

    build.gradle 설정

    repositories {
    	mavenCentral()
    	maven { url 'https://jitpack.io' }
    }
    
    dependencies {
    	implementation 'com.github.shin285:KOMORAN:3.3.4'
    }

    1) repositories { maven { url 'https://jitpack.io' } }를 추가한다.

    2) dependencies { implementation 'com.github.shin285:KOMORAN:3.3.4' }를 추가한다.

    3) JDK 8버전 이상 사용가능하다. (JDK 11가능)

     

     

    샘플코드

    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;
    
    /**
     * 2023.03.19
     * @Desc KOMORAN 형태소분석기 OpenAPI
     * @version 3.3.4
     * 1.Gradle Dependency 추가
     *  -maven { url 'https://jitpack.io' }
     *  -implementation 'com.github.shin285:KOMORAN:3.3.4'
     * 2.문장의 형태소를 분석해 결과를 리턴한다.
     * 
     * JavaDoc: https://docs.komoran.kr/api/kr/co/shineware/nlp/komoran/core/Komoran.html
     * 품사표: https://docs.komoran.kr/firststep/postypes.html
     * 
     * 현재 사용하고 있는 품사표
     * -NNG: 일반명사
     * -NNP: 고유명사
     * -NNB: 의존명사
     * -NP:  대명사
     * -SL:  외국어(2자 이상)
     * -NA:  분석불능범주
     */
    @Service
    public class KomoranSampleClass {
    
        private Logger logger = LoggerFactory.getLogger(KeywordSvc.class);
    
        private String MORPH_LIST = "NNG,NNP,NNB,NP,SL,NA";
        private final String admNm = "sysAdmin";
    
        public void komoranAPISample() {
            // Output Instance
            Map<String, Integer> resultMap = new HashMap<>();
    
            /*
             * @Desc
             * 2023.03.19
             * KOMORAN 형태소 분석기
             * 1.문장을 담은 리스트를 만든다.
             * 2.문장 리스트를 StringBuffer.append()를 사용해 합친다.
             * 3.형태소분석을 사용해 필요한 품사표의 형태소만 리스트로 선언 및 초기화
             * 4.생성된 형태소 리스트에서 형태소가 문장에서 몇 번 사용되었는지 Map으로 관리(형태소:사용횟수)
             */
            StringBuffer sb = new StringBuffer();
            List<String> list = 문장 리스트;
            list.forEach(str -> sb.append(str).append("."));
    
            Komoran komoran = new Komoran(DEFAULT_MODEL.FULL);
            logger.info("문장리스트: {}", sb);
            String str = sb.toString();
    
            List<String> posList = new ArrayList<>();
            posList = Arrays.asList(MORPH_LIST.split(","));
            KomoranResult analyzeResultList = komoran.analyze(str);
            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());
                logger.info("{} {}", token.getMorph(), token.getPos());
            }
            for (String token : analyzeResultList.getMorphesByTags(posList)) {
                logger.info("token: {}", token);
                int cnt = 0;
                if (resultMap.containsKey(token))
                    cnt = resultMap.get(token);
                resultMap.put(token, cnt+1); 
            }
        }
    }

     

     

    사용 후기

    공부를 위해 개인적으로 개발하고 있는 어플에서 문장 분석 기능이 필요해 여러가지 찾아봤으나 대부분 유료이거나 원하는 기능이 없었다. KOMORAN은 다른 곳들과 달리 공식 문서 및 샘플코드를 Git에서 직접 관리하고 있어 직관적이고 이해하기 쉬웠다.

    또한 사용법이 매우 간단한 편이어서 나 같은 초보자들도 쉽게 사용할 수 있었다.

    KOMORAN 공식문서에는 기여하기 페이지가 있는데 이곳에 자신이 기능을 요청하거나 만들어서 전달을 할 수 있다. 시간이 된다면 문장에서 많이 사용된 단어를 내림차순으로 전달해주는 메소드를 만들어서 전달하고 싶다.

    끝으로, KOMORAN을 개발하신 SHINEWARE 개발자님들에게 감사함을 전하고 싶다.

    728x90
    반응형

    댓글