Lucene spellcheck package

요즘 루씬 코드 리딩을 하고 있다. 루씬 core 패키지는 예전에 한번 분석 해본 경험이 있어서 이번엔 contrib 패키지를 중점적으로 살펴보고 있다. 그중에서도 spellcheck 모듈은 가장 최근에 성능좋은 라이브러리로 구현한 경험이 있어서 관심이 갔다.  이 패키지 내에서는 Jaro Winkler Distance 라는 짧은 이름에서 사용 가능한 string 비교 클래스가 구현이 되어 있었으며 n-gram 기반의 string 비교 클래스도 […]

계속 읽기

CI in Action 12장 추천엔진에 대해서

추천엔진이라는게 아시는분들은 잘 아시겠지만 자신이 구매한 물품을 기반으로 사용자 프로파일을 만들어서 그 프로파일과 비슷한 유저를 찾아 그 사람이 제일 많이 선호한 물품을 추천하는 알고리즘을 쓴다.(물론 상품 기반으로 계산할 수도 있다.)물론 이 말은 굉장히 피상적인 내용이고, 실제 서비스에 적용하기 위해서 이런 작업은 검색 전에 인덱싱을 하는것처럼 pre processing 작업을 거쳐서 정제 후 나올 수 있는 비동기적인 […]

계속 읽기

Lucene index file format 발표 자료

현재 다니는 회사 입사 초기에 만들어 발표했던 발표자료이다. 입사하기 전에 인덱스 파일 포멧에 관심이 많이 있어 블로그에 Lucene 색인구조에 대해서 강좌를 썼었고, 그것을 기반으로 간단하게 발표자료를 만들었다. 이번에 Lucene에 가봤더니 벌써 Lucene Index File Format 2.1 버전이 올라와 있더군.버전이 올라간 기념으로 2.0기반으로 만들었던 색인 파일 발표자료를 공개한다. 잠깐 봤는데 compound 파일의 포멧과 lock 파일에 대한것이 […]

계속 읽기

Lucene KoreanAnalyzer : 다시 시작하다.

저번에 검개그 오픈소스 검색엔진 프로젝트 차원에서 형태소 분석기를 만들어 보자는 의견이 있었고, 오늘 그에 대한 첫 비공식 모임을 가졌다. 개발할 시간이 없어서 이래저래 많은 의욕적인 분들과 접촉을 하면서 함께 코웍하기를 그동안 그렇게나 원했지만 기회가 나지 않았다.그동안 안철수 연구소에서 일하시면서 함께 개발하고자 하는 의욕을 보여주신 분도 있었고,(이분은 학교를 외국에서 다닌다며 출국해버렸다. ㅜㅜ) 금전적(ㅜㅜ)으로 도움까지 주시려 하셨던 […]

계속 읽기

BigTable의 Tablet Serving과 Compaction 그리고 Lucene의 Incremental Indexing

김형준님의 강의를 바탕으로 논문을 보고 있는데, 강의 들으면서 낯설지 않은 부분이 Tablet Serving과 Compaction 부분이였다. 한번 정리해 본다. 논문에 나온 그림 새로운 데이터가 들어올때. BigTable의 DB 무결성을 유지하기 위해서 메모리기반의 버퍼를 유지하고 또한 그 버퍼의 Copy를 이용해서 계속 서비스를 유지하게 하면서 minor compaction을 수행한다. 물론 minor compaction이 완료가 되면 메모리를 지운다. 그 강의에는 나오지 않았지만, […]

계속 읽기

Lucene KoreanAnalyzer : 사전 인터페이스 및 음절정보테이블 룩업 메서드 제작 완료

오랫동안 끌어왔던 한국어 사전 인터페이스를 완료 했다. 동적으로 커넥션 관리(품사별로 음절 길이에 따른)를 하게끔 제작을 했고 말이 많았던 Hash, Trie모듈을 이용한 메모리 로딩은 잠시 미루기로 했다. Eclipse로 그려본 사전쪽 클래스 구조다. (품사 음절별 사전 객체는 무조건 하나만 생성된다. 그리고 그 사전객체의 커넥션은 접속을 끊기전에는 계속 연결시켜 놓았다.(색인시 종종 쓰기보다는 매우 자주 사용되기 때문이다.)) 그리고 제공 […]

계속 읽기

Lucene KoreanAnalyzer : 사전써치 인터페이스

오늘 고작 사전써치 인터페이스를 만들었다. 1. 각 사전마다 커넥션은 하나 (싱글톤 패턴) 2. 각 품사 사전 싱글톤 객체를 통해서 사전에 접근할 수 있다.(각 사전파일의 메모리 로딩 여부가 저장되어 있다. <- 나중에 구현할 예정) 3. 품사 사전에 대한 쿼리 정보를 잘못 입력했을 경우를 대비한 예외처리 기능들 4. 그리고 테스트 모듈들 별 기능에 대한 구현은 없었지만 나름대로 […]

계속 읽기

Lucene KoreanAnalyzer : 14만 한국어 사전 파일 완성

Java 실행파일 하나로 완성을 하긴 했지만 실제 바이너리트리로 되어 있던 사전 파일에서 추출해서 품사별DB 내에 음절별DB로 분리해서 저장을 했고 추가로 단어에 대한 설명이 필요할 경우를 대비해 Extra 영역까지 할당을 해놓았다. 쓸데없이 품사정보를 개개의 단어마다 정보를 넣어두었는데 그렇게 할 필요를 못느낀게 사실이지만 일단 넣어두도록 하자. (용량이 상당히 늘어났다. 1메가가 채 되지 않던 파일이 7메가가 되었으니…내일 바로 […]

계속 읽기

Lucene KoreanAnalyzer : 음소 <-> 음절 클래스 제작

유니코드 한글 자소 분리모듈에 대한 설명을 conv2님의 도움을 받아서 분석을 하고 음소분리정보테이블을 추가해서 Jaso클래스를 만들었다. 그런데 이뿐만 아니라 음소에서 음절로 만들어지는 메서드가 있어야함을 느껴서(실제 빈번하게 쓰인다.) 만들고자 했는데 전에 포스팅한 유니코드 생성 원리 포스팅에 쓴 함수를 적용하기 위해서는 음소정보를 이용한 인덱스 번호 추출이 필요했다. 한 글자의 유니코드 값 계산 법 = 0xAC00(유니코드 한글 시작점) + […]

계속 읽기

Lucene KoreanAnalyzer : 유니코드기반 음절정보 테이블 완성

Python 스크립트로 간단하게 유니코드기반 음절정보 테이블을 완성했다. 일단 완성형 한글의 order에 맞춰서 테이블이 구현되어 있어 테이블의 순서에 따른 완성형 한글 코드를 기반으로 같은 음절을 표현하는 유니코드 한글 테이블을 만든 후 이걸 ‘{유니코드 한글:음절정보}’ 형식의 사전형식으로 저장을 했다. 그 뒤에 ‘가~힝’ 사이에 있는 모든 유니코드들(0xac00 ~ 0xd79d)을 순환해 가면서 위에서 만든 사전에 조회를 해가면서 정보를 추출해 […]

계속 읽기