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

아파치 루신은 검색 엔진을 구축하기 위한 오픈 소스 라이브러리이며, 텍스트 문서 간의 유사도 측정에도 사용될 수 있습니다. 여기에서는 아파치 루신을 사용하여 문서 유사도를 측정하는 간단한 방법에 대해 알아보겠습니다.

1. 아파치 루신 설치하기

먼저, 아파치 루신을 설치해야 합니다. 아파치 루신은 Java로 작성되어 있으므로 Java 개발 환경이 필요합니다. 아파치 루신의 공식 웹사이트에서 최신 버전의 루신을 다운로드하고 설치하세요.

2. 문서 색인하기

문서 유사도를 측정하기 위해 먼저 문서를 색인해야 합니다. 이를 위해 아파치 루신의 인덱스 작성기를 사용할 수 있습니다. 인덱스 작성기는 문서를 분석하여 검색에 사용할 수 있는 구조로 변환합니다.

아래는 간단한 예제 코드입니다.

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;

public class Indexer {
    public static void main(String[] args) {
        String indexDirectoryPath = "경로/인덱스_디렉토리";

        try {
            // 인덱스 디렉토리 생성
            Directory indexDirectory = FSDirectory.open(Paths.get(indexDirectoryPath));
        
            // 분석기(Analyzer) 설정
            Analyzer analyzer = new StandardAnalyzer();
        
            // 인덱스 작성기(IndexWriter) 생성
            IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer);
            IndexWriter indexWriter = new IndexWriter(indexDirectory, indexWriterConfig);
        
            // 문서 생성 및 색인
            Document document = new Document();
            Field contentField = new Field("content", "문서 내용", TextField.TYPE_STORED);
            document.add(contentField);        
            indexWriter.addDocument(document);
        
            // 인덱스 작성기 닫기
            indexWriter.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

위 코드에서 indexDirectoryPath를 설정하여 인덱스 파일이 생성될 경로를 지정합니다. 그리고 contentField에는 색인하고자 하는 문서의 내용을 지정합니다. 위 예제는 단일 문서를 색인하는 간단한 예시입니다. 실제 사용할 때는 여러 문서를 반복적으로 색인해야 합니다.

3. 문서 유사도 측정하기

인덱스가 생성된 후에는 아파치 루신을 사용하여 문서 간의 유사도를 측정할 수 있습니다. 유사도 측정은 검색 쿼리를 사용하는 방식으로 이루어집니다.

아래는 간단한 예제 코드입니다.

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
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;
import org.apache.lucene.store.FSDirectory;

public class SimilarityCalculator {
    public static void main(String[] args) {
        String indexDirectoryPath = "경로/인덱스_디렉토리";
        String queryText = "검색할 문서";

        try {
            // 인덱스 디렉토리 열기
            Directory indexDirectory = FSDirectory.open(Paths.get(indexDirectoryPath));
        
            // 검색 쿼리 생성
            Analyzer analyzer = new StandardAnalyzer();
            QueryParser queryParser = new QueryParser("content", analyzer);
            Query query = queryParser.parse(queryText);
        
            // 인덱스 검색기(IndexSearcher) 생성
            IndexSearcher indexSearcher = new IndexSearcher(DirectoryReader.open(indexDirectory));
        
            // 유사도 측정
            TopDocs topDocs = indexSearcher.search(query, 10);
            for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
                Document document = indexSearcher.doc(scoreDoc.doc);
                System.out.println(document.getField("content").stringValue() + " - Score: " + scoreDoc.score);
            }
        
            // 인덱스 검색기 닫기
            indexSearcher.getIndexReader().close();
        } catch (IOException | ParseException e) {
            e.printStackTrace();
        }
    }
}

위 코드에서 indexDirectoryPath를 이전 단계에서 생성한 인덱스 디렉토리 경로로 설정하고, queryText에는 유사도를 측정할 문서의 검색어를 지정합니다. 위 예제는 해당 검색어와 가장 유사한 문서를 10개까지 출력하는 간단한 예시입니다.

마무리

이 문서에서는 아파치 루신을 사용하여 문서 유사도를 측정하는 방법에 대해 알아보았습니다. 아파치 루신은 강력하고 널리 사용되는 검색 엔진 라이브러리로, 다양한 유사도 측정 알고리즘과 검색 기능을 제공합니다. 추가적인 설정과 알고리즘 변경 등으로 더 정교한 문서 유사도 측정을 수행할 수 있습니다.

관련 참고 문헌: