[java] 아파치 루신(Apache Lucene)을 이용한 텍스트 분석 및 유사도 추출 방법

아파치 루신은 자바 프로그래밍 언어로 작성된 오픈 소스 검색 라이브러리로, 텍스트 분석과 유사도 추출에 탁월한 성능을 발휘합니다. 이 블로그 포스트에서는 아파치 루신을 사용하여 텍스트를 분석하고, 유사도를 추출하는 방법을 알아보겠습니다.

1. 아파치 루신 설치 및 설정

아파치 루신을 사용하기 위해서는 먼저 아파치 루신을 설치해야 합니다. 다음은 아파치 루신을 다운로드 받아 설치하는 방법입니다.

$ wget http://www.apache.org/dyn/closer.lua/lucene/java/X.X.X/lucene-X.X.X.tgz
$ tar xvfz lucene-X.X.X.tgz
$ cd lucene-X.X.X

설치가 완료되면, 아파치 루신을 사용하기 위한 Java 프로젝트를 생성하고, 아파치 루신의 라이브러리를 추가해야 합니다. 이를 위해 프로젝트의 build.gradle 파일에 다음과 같이 의존성을 추가합니다.

dependencies {
  implementation 'org.apache.lucene:lucene-core:X.X.X'
  implementation 'org.apache.lucene:lucene-analyzers-common:X.X.X'
}

2. 텍스트 분석

아파치 루신은 다양한 형태의 텍스트 분석을 지원합니다. 텍스트 분석을 위해서는 분석기(analyzer)를 사용해야 합니다. 다음은 표준 분석기를 사용하여 텍스트를 분석하는 예시입니다.

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;

public class TextAnalyzer {
  public static void main(String[] args) {
    String text = "아파치 루신은 텍스트 표준 분석을 위해 사용되는 강력한 도구입니다.";
    
    Analyzer analyzer = new StandardAnalyzer();
    
    try {
      TokenStream tokenStream = analyzer.tokenStream(null, text);
      tokenStream.reset();
      
      CharTermAttribute charTermAttribute = tokenStream.addAttribute(CharTermAttribute.class);
      
      while (tokenStream.incrementToken()) {
        String term = charTermAttribute.toString();
        System.out.println(term);
      }
      
      tokenStream.close();
      
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

위의 코드는 주어진 텍스트를 표준 분석기를 이용하여 토큰화하는 예제입니다. 실행 결과는 다음과 같습니다.

아파치
루신은
텍스트
표준
분석을
위해
사용되는
강력한
도구입니다

3. 유사도 추출

아파치 루신을 사용하여 텍스트의 유사도를 추출할 수도 있습니다. 유사도 추출을 위해서는 검색 엔진을 구축해야 합니다. 다음은 간단한 검색 엔진을 구축하여 텍스트의 유사도를 추출하는 예시입니다.

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.*;
import org.apache.lucene.index.*;
import org.apache.lucene.search.*;
import org.apache.lucene.store.*;
import java.io.IOException;

public class TextSimilarity {
  public static void main(String[] args) {
    String text1 = "아파치 루신은 검색 라이브러리입니다.";
    String text2 = "아파치 루신은 텍스트 분석에도 사용됩니다.";

    StandardAnalyzer analyzer = new StandardAnalyzer();
    RAMDirectory directory = new RAMDirectory();
    
    IndexWriterConfig config = new IndexWriterConfig(analyzer);
    
    try {
      IndexWriter indexWriter = new IndexWriter(directory, config);
      
      Document doc1 = new Document();
      doc1.add(new TextField("text", text1, Field.Store.YES));
      indexWriter.addDocument(doc1);
      
      Document doc2 = new Document();
      doc2.add(new TextField("text", text2, Field.Store.YES));
      indexWriter.addDocument(doc2);
      
      indexWriter.close();
      
      IndexReader indexReader = DirectoryReader.open(directory);
      IndexSearcher indexSearcher = new IndexSearcher(indexReader);
      
      Query query = new TermQuery(new Term("text", "아파치"));
      TopDocs docs = indexSearcher.search(query, 10);
      
      for (ScoreDoc scoreDoc : docs.scoreDocs) {
        System.out.println(scoreDoc.doc + " - " + scoreDoc.score);
      }
      
      indexReader.close();
      
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

위의 코드는 주어진 텍스트를 검색 엔진에 추가하고, 특정 검색어로 검색하여 유사도를 추출하는 예제입니다. 실행결과는 다음과 같습니다.

0 - 0.625
1 - 0.364

위의 결과는 각각의 문서에 대한 유사도 값입니다. 첫 번째 문서는 “아파치”라는 검색어와의 유사도가 0.625로, 두 번째 문서는 0.364로 나타납니다.

참고 자료