루씬 라이브러리를 닷넷에서 사용하기

웹 사이트에 한국어 검색 기능과 함께 한국어 인덱싱 기능을 추가하기 위하여 여러가지 라이브러리를 찾아보던 중, 자바 기반으로 작성된 한국어 형태소 분석기 라이브러리를 발견하였습니다. (http://cafe.naver.com/korlucene) Apache Lucene 위에서 실행될 수 있도록 만든 라이브러리였고 저는 이 라이브러리의 코드 중 일부를 발췌하여 J#으로 포팅하려는 계획을 세웠습니다.


그러나, 현재 배포되는 J# 2.0 Second Edition까지도 Generic을 선언하지 못한다는(!) 중대한 결점을 알게 되었고, 같은 기능을 하는 C# 코드를 작성하기 위하여 시도해보았지만 Java의 Iterator와 .NET의 IEnumerator 인터페이스의 미묘한 의미차이 때문에 포팅 중에 많은 시간을 들이게 되어 결국 더 진척시키지 못했습니다.


그리고 마지막으로 택한 방법인 IKVM을 이용한 컨버젼에서 매우 만족스러운 결과를 얻게 되어 글을 올려봅니다. IKVM은 현재 JDK 1.6 버전에 대응되는, .NET Framework 위에서 구동되는 자체 Java Virtual Machine과 함께, Java Compiler에 의하여 만들어진 Java Byte Code를 MSIL로 변환하는 기술, 그리고 JDK 1.6 라이브러리에 대응되는 OpenJDK로 구성된 소프트웨어 개발 도구입니다. Apache Lucene 라이브러리 전체와 한국어 형태소 분석 라이브러리를 포함하여 모두 IKVM을 통하여 가져오는 데에 성공하였습니다.


제가 작업한 절차는 다음과 같습니다.



  • http://www.ikvm.net/index.html 에서 IKVM.NET 런타임을 다운로드 받습니다. x86 버전과 x64 버전이 모두 제공되며, 이 글을 작성하는 현 시점에서 0.40 버전이 릴리즈되었습니다.

  • http://www.apache.org/dyn/closer.cgi/lucene/java/ 에서 Java 버전의 Lucene을 다운로드하여, 이 중에서 lucene-core-x.x.x.jar 파일을 가져왔습니다.

  • http://cafe.naver.com/korlucene 에서 한국어 형태소 분석기 JAR 파일을 다운로드하였습니다.

  • ikvmc 도구를 통하여 다음과 같이 명령어를 지정하여 대응되는 DLL 파일을 생성하였습니다.
    ikvmc -target:library [형태소 분석기 JAR 파일] [Lucene Core JAR 파일]

  • 위와 같이 명령을 지정하여 나타나는 결과 DLL 파일을 다음의 DLL들과 같이 프로젝트에 참조 추가합니다. – 또는 – IKVM 관련 DLL을 모두 GAC에 등록해도 됩니다.


    • IKVM.OpenJDK.Core.dll

    • IKVM.OpenJDK.Misc.dll

    • IKVM.OpenJDK.Security.dll

    • IKVM.OpenJDK.SwingAWT.dll

    • IVKM.OpenJDK.Text.dll

    • IKVM.OpenJDK.Util.dll

    • IKVM.OpenJDK.XML.dll

    • IKVM.Runtime.dll

  • org.apache.lucene.analysis.kr 네임스페이스의 클래스들을 활용하여 작업을 실행할 수 있었습니다.

여기서 주목할만한 부분은, ikvmc가 단순히 대응되는 코드만을 작성하는 것이 아니라, JAR 파일 내부에 포함된 리소스 파일에 대한 정보도 닷넷 프레임워크 리소스로 변환하여 저장하고 여기에 대응되는 코드도 자동으로 맞추어주기 때문에 IKVM을 위하여 자바 프로그램을 다시 수정하는 작업은 필요하지 않습니다.



위와 같은 방법을 통하여 기존에 작성한 Java Code들을 손쉽게 .NET Framework 안으로 통합할 수 있습니다. 그리고 ikvmstub을 이용하면 Java Code에서 .NET Framework의 핵심 라이브러리들을 자유롭게 활용할 수도 있습니다.

루씬 라이브러리를 닷넷에서 사용하기”에 대한 4개의 생각

  1. 죄송합니다. 아마 태그에 한국어가 들어있어서 먼저 제가 보낸 것 같습니다. 삭제하여 주시면 감사하겠습니다.

    남정현님의 글은 저에게는 너무나 어려운 글입니다. 다만 한가지 관심이 있는 것은 현재하시는 작업으로 영어나 한국어 문단을 집어넣으면 단어별로 인덱싱하고, 나아가 그것을 어떤 전자사전과 연동시켜 그 문단의 맞춤형 사전(단어의 기본형, 뜻, 동의어,반의어, 예문)을 만들어 주는 프로그램이 가능한지 궁금합니다. 가능하다면 아파치 서버에서 돌릴수 있는 프로그램이면 더 좋겠습니다. 이러한 작업을 가끔 할 때가 있는데 그 때마다 엑셀에서 메뉴얼로 하니 그야말로 노가다입니다.

    전혀 관계없는 이야기라면 또 한번의 의미없는 댓글을 달게되어 너무 죄송합니다.^^;

    트랙백은 삭제 부탁드립니다. 다음부터는 트랙백을 보낼 때는 보다 신중하도록 하겠습니다.

    불편을 끼쳐 다시한번 죄송하다는 말씀 올립니다.

  2. 안녕하세요~ 남정현님께서 올리신 글을 보고, 저도 IKVMC를 이용해 Dll로 만드는 것까지 성공을 하였는데요..

    그래서 닷넷(C#)으로 테스트 중 영어의 경우 잘 되는데..
    한글만 넣으면 try + catch문으로 잡아도 ex.source만 나오고
    메세지가 나오질 않아 디버깅 하기가 힘드네요.
    사전때문에 그런 것 같기도 하고..

    int i = 0;
    KoreanAnalyzer analyzer = new KoreanAnalyzer();

    TokenStream stream = analyzer.tokenStream(“k”, new StringReader(textBox1.Text));

    Token t;

    textBox2.Text = stream.toString();

    try
    {
    while ((t = stream.next()) != null && i < 1000)
    {
    textBox2.Text += t.termText() + "rn";
    i++;
    }
    }
    catch (Exception ex)
    {
    textBox2.Text += "[" + i.ToString() + "]" + ex.Source + "rn";
    textBox2.Text += ex.Message;
    }

    위 소스를 보시고, 시간 되실때 고려해야 될 사항이 있으면 가르쳐 주시면 고맙겠습니다.. 귀찮게 해 드려 죄송합니다.

    • 리소스 테이블의 검색에 관련된 문제로 IKVM으로 변환한 모듈이 정상적으로 동작하지 않는듯 합니다. 저도 이 부분은 계속 테스트를 해보았지만 답을 구하지 못해서 현재는 진행하지 못하고 있습니다.

      IKVM의 최신 버전을 다시 활용해보거나, 가능한 범위에서 포팅을 시도해보아야 할 것 같습니다.

댓글 남기기