Komoran 한국어 형태소 분석기 적용
Spring Boot / Gradle 기반 서비스에 Komoran 한국어 형태소 분석기 적용
# Komoran
Java로 구현된 한국어 형태소 분석기이다. Jar 또는 Maven/Gradle 형태로 빌드 후 바로 사용이 가능하다. 외부 의존성이 없어서 설치 후 바로 사용 가능하기에 간단한 서비스에 적용해 사용하기에 최적인 것 같다.
# Gradle build.gradle 설정
- Komoran 3.3.4 버전 설정
repositories { maven { url 'https://jitpack.io' } } dependencies { implementation 'com.github.shin285:KOMORAN:3.3.4' }
# Komoran Util
- Singleton Pattern Util 생성 후 사용
여러 곳에서 사용해야 하는 경우가 발생해 싱글톤 패턴으로 Util Class 생성 형태소 분석 사전 등록 및 관리 편하게 하기 위해…
// Komoran 형태소 분석 사용 Util
public class KomoranUtils {
private static final Logger log = LoggerFactory.getLogger(KomoranUtils.class);
private KomoranUtils(){}
public static Komoran getInstance() {
return KomoranInstance.instance;
}
private static class KomoranInstance {
public static final Komoran instance = new Komoran(DEFAULT_MODEL.FULL);
}
}
# Komoran 테스트
- Spring Boot 테스트 진행
@SpringBootTest @ActiveProfiles("local-live") @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) // DB 사용 설정 @RunWith(SpringRunner.class) public class KomoranTest { private static final Logger log = LoggerFactory.getLogger(KomoranTest.class); @Test public void KomoranUtilSingletonTest() { List<String> analyzeList = KomoranUtils.analyzeKeywordList("광주세계선수권대회"); for (String title : analyzeList) { log.info(title); } } @Test public void Test() { Komoran komoran = KomoranUtils.getInstance(); KomoranResult analyzeResultList = komoran.analyze("부산코미디페스티벌NAVER"); List<Token> tokenList = analyzeResultList.getTokenList(); // 1. print each tokens by getTokenList() log.info("==========print 'getTokenList()'=========="); for (Token token : tokenList) { log.info(token.toString()); log.info(token.getMorph()+"/"+token.getPos()+"("+token.getBeginIndex()+","+token.getEndIndex()+")"); } // 2. print nouns log.info("==========print 'getNouns()'=========="); log.info(analyzeResultList.getNouns().toString()); // 3. print analyzed result as pos-tagged text log.info("==========print 'getPlainText()'=========="); log.info(analyzeResultList.getPlainText()); // 4. print analyzed result as list log.info("==========print 'getList()'=========="); log.info(analyzeResultList.getList().toString()); // 5. print morphes with selected pos log.info("==========print 'getMorphesByTags()'=========="); log.info(analyzeResultList.getMorphesByTags("NNG", "NNP", "NNB", "SL").toString()); } }
- 실행 결과
// KomoranUtilSingletonTest 테스트 20190813 17:10:48.984 [main] INFO c.s.s.v.KomoranTest - 광주 20190813 17:10:48.984 [main] INFO c.s.s.v.KomoranTest - 세계 20190813 17:10:48.984 [main] INFO c.s.s.v.KomoranTest - 선수권대회 // Test 테스트 20190813 17:10:48.971 [main] INFO c.s.s.v.KomoranTest - ==========print 'getTokenList()'========== 20190813 17:10:48.971 [main] INFO c.s.s.v.KomoranTest - Token [morph=부산, pos=NNP, beginIndex=0, endIndex=2] 20190813 17:10:48.971 [main] INFO c.s.s.v.KomoranTest - 부산/NNP(0,2) 20190813 17:10:48.971 [main] INFO c.s.s.v.KomoranTest - Token [morph=코미디, pos=NNG, beginIndex=2, endIndex=5] 20190813 17:10:48.971 [main] INFO c.s.s.v.KomoranTest - 코미디/NNG(2,5) 20190813 17:10:48.971 [main] INFO c.s.s.v.KomoranTest - Token [morph=페스티벌, pos=NNP, beginIndex=5, endIndex=9] 20190813 17:10:48.971 [main] INFO c.s.s.v.KomoranTest - 페스티벌/NNP(5,9) 20190813 17:10:48.971 [main] INFO c.s.s.v.KomoranTest - Token [morph=NAVER, pos=SL, beginIndex=9, endIndex=14] 20190813 17:10:48.971 [main] INFO c.s.s.v.KomoranTest - NAVER/SL(9,14) 20190813 17:10:48.971 [main] INFO c.s.s.v.KomoranTest - ==========print 'getNouns()'========== 20190813 17:10:48.972 [main] INFO c.s.s.v.KomoranTest - [부산, 코미디, 페스티벌] 20190813 17:10:48.972 [main] INFO c.s.s.v.KomoranTest - ==========print 'getPlainText()'========== 20190813 17:10:48.972 [main] INFO c.s.s.v.KomoranTest - 부산/NNP 코미디/NNG 페스티벌/NNP NAVER/SL 20190813 17:10:48.972 [main] INFO c.s.s.v.KomoranTest - ==========print 'getList()'========== 20190813 17:10:48.972 [main] INFO c.s.s.v.KomoranTest - [Pair [first=부산, second=NNP], Pair [first=코미디, second=NNG], Pair [first=페스티벌, second=NNP], Pair [first=NAVER, second=SL]] 20190813 17:10:48.972 [main] INFO c.s.s.v.KomoranTest - ==========print 'getMorphesByTags()'========== 20190813 17:10:48.972 [main] INFO c.s.s.v.KomoranTest - [부산, 코미디, 페스티벌, NAVER]
# Komoran 사용기
한국어 자연어 형태소 분석기를 찾던중 설치 방법과 사용법이 간단해 바로 적용해 봤다. 결과는 대만족 이었다. 아주 간단한 내용이기 때문에.. 여기에 아주 적격이었다. 하지만, 특정 키워드 분석 및 실시간 처리 속도는 다른 형태소 분석기에 살짝 부족한면이 있는것 같다. Tomcat 서버에 min:256, max:512 설정 후 순간 처리 속도를 테스트 하다 보니 out of memory 놨다. 실시간 검색 키워드 처리는 살짝 무리일듯~ 그냥 엘라스틱서치를 사용하는게 좋을것 같다.
2019. 08. 13