ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • spring - 아리랑(arirang) 형태소 분석기 web에 적용하기
    개발기록/Web 2018. 4. 27. 09:52

    Chatbot web페이지에 형태소 분석기를 붙여보았다. 아직 부족해서 많이 삽질도 많이 했다. 잊어버리기 전에 정리 해둬야지.

    한글 형태소 분석기 종류는 몇개 있는것 같다. 나는 다른 종류는 알아보지 않았고, 루씬 형태소 분석기를 사용하기로 했다. 루씬 형태소 분석기가 아리랑 형태소 분석기라고도 불린다.

    https://www.elastic.co/kr/blog/arirang-analyzer-with-elasticsearch

    아리랑 형태소 분석기는 elasticsearch에서 같이 사용되거나, solr 통해서 많이 사용하는것 같다. 자세한 정보는 더 찾아봐야 할것같다.

    나는 chatscript를 사용한 chatbot spring web에서 사용.




    먼저, https://github.com/korlucene 여기서 라이브러리를 다운 받았다.

    arirang.morph 와 arirang-analyzer-es-plugin 두가지가 있는데,  개발자의 설명에 따르면 이렇다.


    1. arirang morph

    이 프로젝트는 한글 형태소에 대한 기본 분석과 사전 정보로 구성이 되어 있습니다. 한글 처리와 사전 정보를 변경 하고 싶을 경우 본 프로젝트의 코드를 분석하고 수정 해서 활용을 하실 수 있습니다.

    2. arirang analyzer

    이 프로젝트는 lucene의 analyzer를 상속받아 lucene에서 사용 할 수 있도록 구성이 되어 있습니다. Lucene의 analyzer pipeline에 필요한

    • KoreanAnalyzer
    • KoreanFilter
    • KoreanFilterFactory
    • KoreanToken
    • KoreanTokenizer
    • KoreanTokenizerFactory

    등이 주요 클래스로 구현이 되어 있습니다.


    두개의 프로젝트를 스프링에서 import해보면, test로 돌려볼 수 있는데, 나는 문장에 대한 형태소 분석이 필요하여 arirang analyzer test 함수를 사용했다. 먼저, 사용할 프로젝트에서 아리랑 jar 파일을 WEB-INF에 배치해 준다. 사실 배치를 제대로 못해서 삽질 오래했다ㅠ

    jar 파일은 arirang-analyzer-es-plugin에서 lib 파일을 복사해서 사용하면 된다.



    arirang-analyzer-es-plugin프로젝트를 살펴보면,


    이렇게 Test를 해 볼 수 있는 파일2개가 있는데, 아직 다 뜯어보지 못했지만 String 문장의 형태소를 잘라서 단어를 추출해 주는 함수는 ArirangAnalyzerTest에서 확인 할 수 있었다. 예를 들면, '이렇게 폭풍우가 치는 밤이면' 이라는 문장을 이렇게 라이브러리에 등록된 사전의 단어로 잘라준다는것.




    이렇게 test로 확인해본 함수를 가져다가 쓰면 끝이었던 것이다.

    사용할 프로젝트에서 형태소 분석 함수를 정의하고, controller 혹은 service에서 호출해서 사용하면 된다.

    나는 아래와 같은 함수를 사용했다.

    public String morphAnalyzer(String message) throws Exception {
            KoreanTokenizer koreanTokenizer = new KoreanTokenizer();  // tokenizer 적용.
            koreanTokenizer.setReader(new StringReader(message));
    	TokenStream tokenStream = new KoreanFilter(koreanTokenizer); // filter 적용.
    
    	CharTermAttribute termAtt = tokenStream.addAttribute(CharTermAttribute.class);
    	TypeAttribute typeAttr = tokenStream.addAttribute(TypeAttribute.class);
    	String sumString = "";
    	try {
    		tokenStream.reset();
    		      
    		while (tokenStream.incrementToken()) {
    		 //System.out.println(termAtt.toString() + " [" + typeAttr.type() + "]");
    		sumString += " " + termAtt.toString();		        		        
    	}
    		tokenStream.end();
    	} finally {
    		   tokenStream.close();
    		   System.out.println(sumString);
            }
    	return sumString;
    }

    return 한 string 값을 chatscript 서버로 보내서, chatscript에서는 받은 단어를 가지고 답변을 찾아가는 식으로 설정할 예정이다.


    정리하자면,

    1. lib의 jar 파일을 사용할 spring project에 복사

    2. 함수 사용 

    jar를 복사했는데도 불구하고 ClassNotFoundException으로 koreanTokenizer 등등을 못찾는 에러가 뜬다면 웹으로 배포할때 빌드가 안된것이다.

    tomcat에 배포가 잘 되는가를 확인해 볼것.



    댓글

Designed by Tistory.