springboot

[SpringBoot] KOMORON을 이용해서 형태소 분석하기

inhooo00 2024. 3. 23. 22:40

프로젝트를 진행하다가 워드 클라우드를 구현해야 할 일이 생겼다. 

 

 


워드 클라우드란??

태그 클라우드(영어: tag cloud) 또는 워드 클라우드(word cloud)는  메타 데이터에서 얻어진 태그들을 분석하여 중요도나 인기도 등을 고려하여 시각적으로 늘어 놓아 웹 사이트에 표시 하는 것이다.

 

 

처음 접근

 알고리즘을 직접 짜려고 시도했다. 단순히 단어의 개수를 반환하면 된다고 생각했기 때문이다. 그 반환 단어를 프론트에서 받아서 크기를 기준으로 워드 클라우드를 구성하면 되지 않을까? 라고 생각했다.

하지만 우리의 서비스는 문장을 받는 '메모'이다. 때문에 위에 내가 직접 알고리즘을 짜는 방법은 불가능했다.

 

 

라이브러리 발견

그렇게 구글링을 하다가 https://github.com/shineware/KOMORAN (코모론) 라이브러리를 발견했다. 해당 라이브러리는 한국 형태소를 분석하는 기능을 가지고 있는 신기한 라이브러리였다. 명사만 필요한 나의 서비스에 정확히 일치했다.

 

 

구현

1. 의존성 추가

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

 

KOMORAN은 한국어 형태소 분석기로, 자연어 처리를 필요로 하는 다양한 애플리케이션에서 한국어 텍스트를 분석하는 데 사용된다. 이 코드를 사용하려면 프로젝트의 build.gradle 파일에 추가하면 된다.

 

2. 코드 작성

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class CloudWordService {
	private final MemoRepository memoRepository;
	private final ChatClient chatClient;
	
    // 워드 클라우드 명사들 나열
    public List<String> getWordCloud_1(Long userId) {
        List<Memo> memos = memoRepository.findByUserId(userId);

        if (memos.isEmpty()) {
            throw new EntityNotFoundException("Memo", new Exception("userId로 memo들을 찾을 수 없습니다."));
        }

        List<String> words = new ArrayList<>(); // 명사들만을 포함할 리스트

        for (Memo memo : memos) {
            KomoranResult result = komoran.analyze(memo.getWorryText()); // 메모 분석
            List<String> nouns = result.getNouns(); // 현재 메모에서 추출된 명사들

            words.addAll(nouns); // 전체 명사 리스트에 추가
        }

        return words; // 명사들만 포함된 리스트 반환
    }

 

위 코드는 명사들의 리스트를 나열하는 코드이다. Map을 통해 특정 단어가 몇 번 나왔는지 반환할 수도 있고, 리스트 뿐만 아니라 다른 응답값도 추가해서 반환할 수 있다.

+ Memo를 받는 기능은 내가 따로 구현한 기능이다. 단순히 CRUD로 비슷한 기능을 구현하고 테스트해보기 바란다.
+ EntityNotFoundException은 내가 따로 구현한 예외이다.