'형태소분석기'에 해당되는 글 3건

  1. 2008.07.30 형태소 분석기 0.9.1 배포 및 라이센싱
  2. 2008.07.30 강승식 교수의 형태소분석기를 Python에서 활용하기 (1)
  3. 2008.07.30 오픈소스 Lucene을 활용한 DB Full-text 검색엔진 개발
2008.07.30 13:28

형태소 분석기 0.9.1 배포 및 라이센싱

형태소 분석기에 대한 다양한 문의가 오고, 몇몇 분들이 라이센스에 대한 문의를 해주셔서 이를 정리하고자 한다. 정리하면서 몇 가지 이상한 분석 결과를 만들어내는 것들을 수정해서 재배포 한다.

1. Korean Morpheme Analyzer V0.9.1 by therocks.
이전 버젼들은 모두 삭제해서 지금 올라가는 것을 사용하는 것을 권장한다.


* 수정된 점

1) 부정확한 띄어쓰기 추가 개선
'검색서비스를' 과 같은 문장을 처리할 때, 속도를 향상시키기 위해서 앞부분에서 적당히 검색결과가 나오면 띄어쓰기 처리를 해주고 다음 문자열들을 처리하도록 하였는데, 검색(명사)+서(조사)+[ ]+비(명사) 가 되는 순간 잘라버려서 서비스가 정상적으로 추출되지 않는 문제가 있었는데, 이를 5글자 이후에 처리하도록 하여 5글자 내에서의 부정확한 띄어쓰기를 없앴다. 5글자가 넘는 경우에 대해서는 추후 고려해야할 것같고, 아마도 속도가 좀 느려질 것 같다.

2) 미등록어 처리 기능 개선
미등록 어휘가 이상한 사전 어휘들로 완결되지 않은 상태(어미나 나타날 것이라 고려하였지만, 나타나지 않고 끝나는 경우)에서 조합되는 경우가 발생하는데, 이를 위해 미등록어를 prune하는 것을 방지하도록 수정하였다.

2. Licensing
생각외로 많은 분들이 관심을 주시고, 프로그램을 사용하시는 것 같아서 이전에 고민하지 않던 라이센스를 고려해야할 것 같다. 사전에 대한 문제가 아직 남아 있지만, 일단은 GPL로 진행할 것이다. 아직 정확한 체계를 잡지 않았지만, Dual License 를 취해서 개인이나 비영리에 대해서는 무료로 하고, 영리에 대해서는 다른 라이센스를 적용하고자 한다. 처음부터 많은 사람들이 활용할 수 있는 형태소 분석기를 배포하는 것이 목적이었기 때문에, 돈에는 별 욕심이 없다.

기본적으로 다음의 네 가지의 원칙을 가지고 라이센싱에 대해서 고민하고자 한다.
  • 소스와 내부 데이터의 수정과 활용은 자유롭게 할 수 있다.
  • 소프트웨어에 대한 지원을 하지 않는다.
  • 다른 프로그램이나, 서비스에 활용시 출처를 밝혀야 한다.
  • 영리적인 목적으로 프로그램을 배포하여서는 안된다.

조만간 다른 자료들을 검토하여 자세한 라이센스 정책에 대해서 업데이트 하고자 한다.

출처 : http://therocks.tistory.com/14

신고
Trackback 0 Comment 0
2008.07.30 13:26

강승식 교수의 형태소분석기를 Python에서 활용하기

집단지성프로그래밍 책을 보다가 보니 꼭 필요한 것이 하나 없었다.
형태소분석기가 없으니 한글에 대해선 전혀 처리가 안된다. 그 이유때문에 형태소 분석기를 만들기엔 부담되고 그래서 강승식 교수의 형태소 분석기를 Python에 붙여보기로 했다. 그런데 의외로 간단하게 끝났다.

아래 코드를 컴파일 해서 사용하면 된다.
1. C 소스 파일 :
PyKMA.c
#include "Python.h"
#include "ham-ndx.h"
#include "ham-api.h"
#include "keyword.h"

static PyObject *ErrorObject;

static PyObject* PyKMA_getstems(PyObject *self, PyObject *args)
{
 PyObject* flist;
 int i;
 unsigned char *keys[MAXKEYWORDS];
 unsigned char *command;
 int nkeys;
 HAM_RUNMODE mode;
 char *option=NULL;

    if (!PyArg_ParseTuple(args, "s", &command))
        return NULL; 

 if (open_HAM_index(&mode, option, "./hdic/KLT2000.ini")) { /* initialize HAM */
  puts("ERROR: dictionary file path in <hdic/KLT2000.ini>"); return 0;
 }
 nkeys = get_stems(command, keys, &mode);
 flist = PyList_New(nkeys);

 for (i = 0; i < nkeys; i++) {
  PyList_SetItem(flist, i, Py_BuildValue("s",keys[i]));
 }

 close_HAM_index(&mode);
    return flist;
}

static struct PyMethodDef PyKMA_methods[] = {
 {"getstems",       PyKMA_getstems,    METH_VARARGS},
 {NULL,         NULL}
};

void initPyKMA()
{
    PyObject *m;
    m = Py_InitModule("PyKMA", PyKMA_methods);      
 ErrorObject = Py_BuildValue("s", "sample error");
}

2. setup.py
#!/usr/bin/env python

from distutils.core import setup, Extension

setup(name="PyKMA",
      version="1.0",
      description="Extract keyword",
      author="Samg Taeg Shim",
      author_email="sst9696@gmail.com",
      url="http://www.gamjapower.net/",
      ext_modules=[Extension("PyKMA", ["PyKMA.c"])]
     )

3. test 파일
# -*- coding: cp949 -*-
import PyKMA

if __name__ == '__main__':
 a = PyKMA.getstems("대한민국만세")
 print a

출처 : http://gamjapower.net/318

신고
Trackback 1 Comment 1
  1. 2009.09.23 22:09 address edit & del reply

    비밀댓글입니다

2008.07.30 09:24

오픈소스 Lucene을 활용한 DB Full-text 검색엔진 개발


요즘 검색이 관심이 있어 자료 수집중이다.
.NET 관련된 내용을 찾다고 보니 괜찮은 내용이 있어 펌 했습니다.

-------------------------------------------------------------------------------------------------


태어나서 처음으로 혼자서하는 알바를 해봤다.
2007년 12월 말에 오픈소스 Lucene을 사용하여 검색엔진을 개발해보지 않겠냐는 의뢰가 왔을 때 지금 하고있는 프로젝트들이 많아서 거절하려고도 했었지만 자바와 오픈소스를 사용하여 무엇인가를 개발한다는 것은 내 마음을 무척이나 설레이게 했다. 결국, 시간적 압박보다는 일을 선택했는데 아직 내가 많이 모자라기때문에 처음 계획했던 것 보다는 많이 축소한 단위로 프로젝트를 진행했다.

프로젝트 명은 "오픈소스 Lucene을 활용한 Database Full-text 검색엔진 개발"이다. 이것을 계기로 검색엔진의 원리와 Lucene에 대해 알 수 있었고 많이 친해졌다. 현재 나와있는 구글, 네이버, 다움같은 포털사이트들이 얼마나 많은 연구끝에 생성된 것인지도 알 수 있었다.

2008년 1월부터 2월까지(주 2~3일) 2개월간 진행되었고 Indexing과 DB Crowling이 잘되는 것을 보니 귀엽기도하고 나름대로 애착이간다. 한가지 아쉬운점은 개발기간이 짧아 충분히 많은 테스트를 해보지는 못했다는 점이다. 메뉴얼화 까지 완성했으며 목차는 다음과 같다. 메뉴얼은 회사 프로젝트로 작성한것이기 때문에 전체를 올릴수는 없고 후에 특정부분에 대해서 중요한 특징들은 정리해 올리도록 하겠다. 또한, 혹시나 누군가가 궁금해 하신다면 그 부분도 정리해서 올리도록 하겠다.

1 프로젝트 개요 ······················································································································· 1
1.1 프로젝트 개요 ······························································································································ 1
1.2 수행책임자 인적 사항 ·············································································································· 1
1.3 참여인력 현황 ···························································································································· 1
1.4 시스템 요구 정의서 ···················································································································· 2

2 검색엔진 및 Lucene소개 ······································································································ 4
2.1 검색엔진의 원리 ·························································································································· 4
2.2 Lucene 소개 ································································································································· 6

3 검색엔진의 구현 ·················································································································· 10
3.1 간단한 한글 형태소 분석기 및 태그제거기 ········································································ 10
3.2 DBLoader(데이터베이스 크롤러) ···························································································· 15
3.3 Query 생성기 ····························································································································· 19
3.4 검색 Pool ···································································································································· 20
3.5 Multy Thread Searching ········································································································· 22
3.6 Index Manager 0.1 GUI Application ··················································································· 26
3.7 Log4j를 활용한 Log기능 ········································································································· 30

4 검색엔진 설치  ····················································································································· 33
4.1 검색엔진 설치 ···························································································································· 33
4.2 IIS / Tomcat 연동 ···················································································································· 38

5 참고자료 ································································································································ 42
5.1 Lucene의 하위 Project ············································································································· 42
5.2 Lucene Sendbox ······················································································································· 43
5.3 Nutch ··········································································································································· 45
5.4 참고문헌 ······································································································································ 47
5.5 기타 ·············································································································································· 47



주요 특징은 다음과 같다.

1.1 프로젝트 개요
  - Database에서 like검색(%검색어%) 수행시에 전체 text를 다 보기 때문에 무척 느린것을 알 수 있다. 이런 경우 DB의 Contents(내용들)을 단어별로 쪼개서 Indexing한 후 Index로부터 검색을 하면 몇백만건 혹은 그 이상의 데이터를 full-text 검색을 하는데 속도를 1초 이하로 줄일 수 있다. 현재 SQLServer, Mysql 등 몇몇의 DBMS는 like 검색 외에도 full-text검색을 지원한다.
  전체적인 프로젝트의 의도는 DBMS 크롤링 뿐만 아니라 웹페이지 크롤링 등등 여러가지로부터 문서를 크롤링하고 크롤링된 문서들을 적절하게 클러스터링 한 후 데이터를 검색할 때 적합한 클러스터로 부터 데이터를 질적으로 빠르게 검색하는 것 까지였다.(여기에 시멘틱+온톨로지 추가)  하지만 프로젝트의 범위가 너무 크고 쉽게 구현되기 힘든 내용들이며 내가 곧 4학년이되기 때문에 가능한한 범위내에서 내가 맡은 부분은 DBMS 크롤링과 검색까지만 진행되었다.

3.1 간단한 한글 형태소 분석기 및 태그제거기
  - 루씬을 사용해서 검색엔진을 개발해본 사람이라면 누구나 형태소 분석기 때문에 고민을 하게된다. 왜냐면 루씬에서 사용할만한 오픈되어진 한글형태소 분석기가 마땅히 존재하지 않기 때문이다. 본 프로젝트에서는 이러한 문제점을 해결하지는 못했고 html tag와 유니코드, 접미사를 제거하는 간단한 형태소 분석기만을 구현하였다. 좀 더 발전된 형태소 분석기를 개발하고 싶었지만 시간의 제약상 이정도로만 만족해야 했다. 형태소 분석기를 개발하기 위해서는 형태소 분석에 대한 지식뿐만아니라 단어사전 또한 존재해야 한다. 형태소 분석을 효율적으로 할 경우 검색의 정확성을 보다 높일 수 있다.
  - UNITEX라는 오픈소스가 존재한다. 그곳에서는 완벽하지는 않지만 한국어 사전인 DECO와 한국어 형태소 분석기를 지원한다. 아직 UNITEX가 어느정도 수준의 형태소 분석을 제공하는지 자세히 알아보지 못했지만 후에 UNITEX의 한국어 전자사전인 DECO만을 사용하던지 혹은 UNITEX의 형태소분석기를 사용하여 Lucene의 형태소 분석기를 개발하는 것도 적은시간안에 형태소분석기를 개발하는 빠른 방법인 것 같다.

3.2 DBLoader(데이터베이스 크롤러)
  - DBLoader(데이터베이스 크롤러)는 사용자가 어떤 DB의 어떤 Table의 어떤 Column들을 Crowling할 것인지 간단히 설정만 해주면 어떤 DB든지(현재 Oracle, Mysql, SQLServer (추가 가능)) 관계없이 내용을 Crowling하여 Unique한 Directory에 인덱싱한다.

3.3 Query 생성기
  - 현재 구현된 형태소 분석기가 만족할만한 수준이 되지 않기 때문에 검색을 하면 Like검색의 50%수준밖에 검색을 하지 못한다. 이를 보완하기 위해서 Prefix Query를 사용하며 Prefix Query를 사용 할 경우 Like 검색의 75% 수준까지 검색을 해준다. 검색엔진의 주된 목적은 사용자가 원하는 Top N개를 검색해 주는 것인데 75%의 검색정도면 어느정도의 Top N개의 검색을 만족해 준다고 생각한다.
  Query생성기는 옵션에 따라 다양한 Column을 검색할 수 있는 Boolean Query와 Prefix Query를 생성한다.

3.4 검색 Pool
  - 사용자로부터 검색요청이 왔을 때 검색객체를 생성하고 사용 후 소멸시키는 것은 자원 효율상 매우 아까운 행위이다. 갑자기 사용자로부터 검색요청이 몰릴경우 무지무지 많은 객체들이 생성되고 바로 소멸되며 이는  서버에 부담을 줄 수도 있다. 검색 Pool방식은 사용자의 요청이 있을 때 검색객체를 생성해서 최대 사용자가 설정한 N개까지만 생성하게 해주며 생성된 검색 객체는 소멸되지 않고 Pool을 통해 Management 된다.

3.5 Multy Thread Searching
  - 사용자에게 다중 테이블 검색에대한 요청이 왔을 경우 테이블 수만큼 Thread가 생성되어 동시에 여러 Index를 검색하며 동시에 반환해줌으로 써 속도를 절약시킨다.

3.6 Index Manager 0.1 GUI Application
  - 사용자가 GUI상으로 원하는 DB의 Table을 Indexing할 수 있도록 해주며 스케줄러를 가동시켜 원하는 시간대에 스케줄러가 DB로부터 새로운 글을 읽어와 Index를 추가/수정/삭제할 수 있게한다.
  - 현재는 Swing으로 구현되었지만 후에 SWT 혹은 JSP Interface로 변경시킬 것이다.

3.7 Log4j를 활용한 Log기능
  - Log4j를 사용하여 여러가지 Exception이라던지 Scheduler가 수행한 내용들에 대하여 Log를 기록한다. 이는 후에 유지보수를 위해 매우 중요하다.

4.2 IIS / Tomcat 연동
  - 검색엔진은 Java로 개발되었기 때문에 반드시 Tomcat에서 돌려야한다. 만약 Web Page가 IIS 서버에서 돌아가는 언어로 작성되었다면 검색엔진을 바로 사용할 수 없다. 때문에 Jakarta Redirector를 설치하여 IIS와 Tomcat을 연동하였고 asp 혹은 php Web page에서도 Java 검색엔진을 사용할 수 있게된다.

출처 : http://cherrykyun.tistory.com/171
신고
Trackback 0 Comment 0


티스토리 툴바