[java] 아파치 루신(Apache Lucene)을 이용한 문서 유사도 측정 방법

아파치 루신(Apache Lucene)은 자바로 개발된 검색 엔진 라이브러리로, 인덱싱과 검색 기능을 제공합니다. 이 라이브러리를 활용하면 문서들 간의 유사도를 측정할 수 있습니다. 이번 포스트에서는 아파치 루신을 이용하여 문서 유사도를 측정하는 방법에 대해서 알아보겠습니다.

1. 문서 인덱싱

문서 유사도를 측정하기 위해서는 먼저 문서들을 인덱싱해야 합니다. 아파치 루신은 인덱스를 생성하여 문서들을 검색 가능한 형태로 저장합니다. 각 문서는 필드(field)와 해당 필드에 들어갈 값(value)으로 구성됩니다. 예를 들어, 문서의 제목과 내용이 필드가 될 수 있고, 각각의 필드에 해당하는 값이 들어갈 수 있습니다.

다음은 아파치 루신을 이용하여 문서를 인덱싱하는 예제입니다.

import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.util.Version;

public class DocumentIndexingExample {
    public static void main(String[] args) throws Exception {
        // 인덱스를 저장할 디렉토리 생성
        Directory directory = new RAMDirectory();
        
        // 색인 작성을 위한 IndexWriter 생성
        IndexWriterConfig config = new IndexWriterConfig(Version.LATEST, analyzer);
        IndexWriter writer = new IndexWriter(directory, config);
        
        // 문서 생성
        Document document = new Document();
        document.add(new StringField("id", "1", Field.Store.YES));
        document.add(new TextField("title", "아파치 루신 소개", Field.Store.YES));
        document.add(new TextField("content", "아파치 루신은 검색 엔진 라이브러리입니다.", Field.Store.YES));
        
        // 문서 인덱싱
        writer.addDocument(document);
        
        // 인덱스 작성 종료
        writer.close();
    }
}

위의 예제는 인덱싱할 문서를 생성하고 필드와 값들을 추가한 뒤, 이를 IndexWriter를 통해 인덱스에 추가하는 과정을 보여줍니다.

2. 문서 검색

인덱스에 문서를 추가한 후에는 문서 검색을 통해 유사도를 측정할 수 있습니다. 아파치 루신은 강력한 검색 쿼리 기능을 제공하며, 다양한 검색 방식을 지원합니다.

다음은 아파치 루신을 이용하여 문서를 검색하는 예제입니다.

import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;

public class DocumentSearchExample {
    public static void main(String[] args) throws Exception {
        // 인덱스를 읽어오는 IndexReader 생성
        IndexReader reader = DirectoryReader.open(directory);
        
        // 검색을 위한 IndexSearcher 생성
        IndexSearcher searcher = new IndexSearcher(reader);
        
        // 검색 쿼리 생성 - 제목 필드에 '아파치'가 포함된 문서 검색
        Query query = new TermQuery(new Term("title", "아파치"));
        
        // 검색 실행
        TopDocs topDocs = searcher.search(query, 10);
        
        // 검색 결과 출력
        for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
            Document document = searcher.doc(scoreDoc.doc);
            System.out.println("문서 ID: " + document.get("id"));
            System.out.println("제목: " + document.get("title"));
            System.out.println("내용: " + document.get("content"));
            System.out.println("유사도 점수: " + scoreDoc.score);
            System.out.println("----------------------");
        }
        
        // IndexReader 종료
        reader.close();
    }
}

위의 예제는 인덱스를 읽어오는 IndexReader와 검색을 수행하기 위한 IndexSearcher를 생성한 뒤, 검색 쿼리를 생성하여 해당하는 문서를 검색하는 과정을 보여줍니다. 검색 결과를 출력할 때는 각 문서의 필드 값을 가져와 출력하며, 유사도 점수도 함께 출력합니다.

3. 문서 유사도 측정

문서 검색을 통해 얻은 검색 결과의 유사도 점수를 통해 문서들 간의 유사도를 측정할 수 있습니다. 유사도 점수는 검색 쿼리와 각 문서 사이의 매칭 정도를 나타내는 값입니다. 일반적으로 유사도 점수가 높을수록 문서 간의 유사도가 높다고 판단할 수 있습니다.

아파치 루신에서는 유사도 점수 계산을 위한 다양한 알고리즘을 제공하고 있습니다. 예를 들어, TF-IDF(Term Frequency-Inverse Document Frequency) 알고리즘은 검색 쿼리에서 특정한 단어가 얼마나 자주 등장하는지와 해당 단어가 다른 문서에서 얼마나 일반적인지를 고려하여 유사도 점수를 계산합니다.

마무리

이번 포스트에서는 아파치 루신을 이용하여 문서 유사도를 측정하는 방법을 알아보았습니다. 아파치 루신은 강력한 검색 엔진 라이브러리로 문서 인덱싱과 검색 기능을 쉽게 구현할 수 있습니다. 문서 유사도 측정을 통해 관련 문서를 찾거나 검색 결과를 더욱 정확하게 필터링할 수 있습니다.

더 자세한 내용은 아파치 루신 공식 홈페이지를 참고하시기 바랍니다.