파이썬으로 PyLucene을 활용한 중복 문서 탐지 정확도 측정하기

중복 문서 탐지는 많은 문서가 있는 대규모 데이터 세트에서 중복된 문서를 식별하는 중요한 작업입니다. 이를 위해 PyLucene을 사용하여 파이썬에서 중복 문서를 탐지하고 정확도를 측정하는 방법에 대해 알아보겠습니다.

PyLucene 소개

PyLucene은 Apache Lucene 검색 엔진의 파이썬 바인딩으로, 고성능 및 확장 가능한 텍스트 검색 및 인덱싱을 제공합니다. PyLucene을 활용하면 파이썬에서 빠르게 텍스트 검색 작업을 수행할 수 있습니다.

중복 문서 탐지 작업 흐름

  1. 문서 전처리: 탐지 대상이 되는 문서들을 텍스트 형식으로 가져옵니다. 필요한 경우, 텍스트 정규화 및 정제 작업을 수행합니다.

  2. 문서 인덱싱: PyLucene을 사용하여 문서를 인덱싱합니다. 인덱싱은 텍스트 검색 작업을 효율적으로 수행하기 위해 필요합니다.

  3. 검색어 생성: 인덱스를 기반으로 중복 문서 검색에 사용할 검색어를 생성합니다. 이때, 동일한 문서의 검색어는 유사도 계산을 통해 생성됩니다.

  4. 중복 문서 탐지: 생성된 검색어를 사용하여 중복 문서를 탐지합니다. 유사도 측정 알고리즘을 활용하여 문서 간의 유사도를 계산하고, 임계값을 설정하여 중복 여부를 판단합니다.

  5. 정확도 측정: 탐지된 중복 문서와 실제 중복 여부를 비교하여 정확도를 측정합니다. 이를 위해 테스트 데이터 세트를 사용하고, 탐지된 중복 문서와 실제 중복 문서 간의 일치 여부를 확인합니다.

예시 코드

import lucene

from java.io import StringReader
from org.apache.lucene.analysis.standard import StandardAnalyzer
from org.apache.lucene.analysis.tokenattributes import CharTermAttribute
from org.apache.lucene.index import IndexWriter, DirectoryReader
from org.apache.lucene.store import RAMDirectory
from org.apache.lucene.search import IndexSearcher
from org.apache.lucene.util import Version
from org.apache.lucene.search.similarities import BM25Similarity

# PyLucene 초기화
lucene.initVM()

def preprocess_document(document):
    # 문서 전처리 작업 수행
    processed_document = document.lower() # 소문자 변환
    processed_document = processed_document.strip() # 공백 제거
    
    return processed_document

def index_documents(documents):
    # 인덱스 생성
    directory = RAMDirectory()
    writer_config = IndexWriterConfig(Version.LATEST, StandardAnalyzer())
    writer = IndexWriter(directory, writer_config)
    
    # 문서 인덱싱
    for document in documents:
        processed_document = preprocess_document(document)
        doc = Document()
        doc.add(Field("content", processed_document, TextField.TYPE_STORED))
        writer.addDocument(doc)
    
    writer.commit()
    writer.close()
    
    return directory

def generate_query_terms(query):
    # 검색어 생성
    terms = []

    analyzer = StandardAnalyzer(Version.LATEST)
    stream = analyzer.tokenStream("content", StringReader(query))
    char_term_attr = stream.addAttribute(CharTermAttribute.class_)

    stream.reset()
    while stream.incrementToken():
        term = char_term_attr.toString()
        terms.append(term)

    stream.end()
    stream.close()

    return terms

def search_duplicates(query_terms, directory):
    # 검색어를 사용하여 중복 문서 검색
    searcher = IndexSearcher(DirectoryReader.open(directory))
    searcher.setSimilarity(BM25Similarity()) # 유사도 측정 알고리즘 설정

    query = BooleanQuery()
    for term in query_terms:
        term_query = TermQuery(Term("content", term))
        query.add(term_query, BooleanClause.Occur.SHOULD)

    top_docs = searcher.search(query, 10)
    duplicate_documents = [searcher.doc(score_doc.doc) for score_doc in top_docs.scoreDocs]

    return duplicate_documents

# 예시 사용 방법
documents = ["This is a duplicate document.", "This is another document.", "This is a duplicate document."]
test_document = "This is a duplicate document."

# 문서 인덱싱
directory = index_documents(documents)

# 검색어 생성
query_terms = generate_query_terms(test_document)

# 중복 문서 검색
duplicate_documents = search_duplicates(query_terms, directory)

# 정확도 측정
accuracy = len(duplicate_documents) / len(documents)

print(f"Accuracy: {accuracy}")

결론

PyLucene을 사용하여 파이썬에서 중복 문서 탐지를 수행할 수 있습니다. 이를 통해 대규모 데이터 세트에서 중복 문서를 효과적으로 식별하고, 정확도를 측정할 수 있습니다. 파이썬의 강력한 생태계와 PyLucene의 고성능을 결합하여 중복 문서 탐지 작업을 더욱 효율적으로 수행할 수 있습니다.

참고 자료