'kr analyzer'에 해당되는 글 4건

  1. 2013.01.24 루씬 한국어형태소 분석기 lucene-core 3.2 에서 3.6 으로..
  2. 2013.01.23 lucene kr analyzer flow
  3. 2013.01.22 elasticsearch 한국어 형태소분석기 분석의 이해 (2)
  4. 2013.01.15 elasticsearch + 한국어 형태소 분석기 색인 시 운영 경험 공유.

루씬 한국어형태소 분석기 lucene-core 3.2 에서 3.6 으로..

Elastic/Elasticsearch 2013.01.24 16:03

lucene kr analyzer 사용 시 lucene core 3.2 에서 3.6 으로 올리시게 되면 아래 클래스에서 빨갱이가 나옵니다.
아래는 수정한 코드 인데 뭐 보시면 너무나 기본이라 이런건 작성할 필요가 있는지도 ^^;
암튼 머리 나쁜 저는 필요 해서.. 

[KoreanAnalyzer.java]

 /** Builds an analyzer with the stop words from the given file.

   * @see WordlistLoader#getWordSet(File)

   */

public KoreanAnalyzer(Version matchVersion, File stopwords) throws IOException {     

        this(matchVersion, WordlistLoader.getWordSet(new InputStreamReader(new FileInputStream(stopwords), DIC_ENCODING), matchVersion));        

}


  /** Builds an analyzer with the stop words from the given file.

   * @see WordlistLoader#getWordSet(File)

   */

public KoreanAnalyzer(Version matchVersion, File stopwords, String encoding) throws IOException {

        this(matchVersion, WordlistLoader.getWordSet(new InputStreamReader(new FileInputStream(stopwords), encoding), matchVersion));

}

/** Builds an analyzer with the stop words from the given reader.

* @see WordlistLoader#getWordSet(Reader)

*/

public KoreanAnalyzer(Version matchVersion, Reader stopwords) throws IOException {

  this(matchVersion, WordlistLoader.getWordSet(stopwords, matchVersion));    

}

기존 KoreanAnalyzer 에는 Version argument 가 없어서 추가만 했습니다. :)

신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 0 : Comment 0

lucene kr analyzer flow

Elastic/Elasticsearch 2013.01.23 10:43

stopwords 적용을 하다 보니 그냥 심심해서 어떤 workflow 인지 올려봅니다.
뭐 소스 보시면 다 아시는 내용이라 그냥 혼자 저장용으로 활용... ^^


[기본 flow]

KoreanAnalyzer.java        : 문장을 분석하기 위한 Analyzer 구성 (LUCENE.Version 과 stopwords, encoding)

KoreanTokenizer.java       : 지정한 token type 별로 token 분리

KoreanFilter.java              : 입력 받은 token 을 형태소 분석기를 이용해 AnalysisOutput 생성

MorphAnalyzer.java         : 여기서 한국어의 형태소를 분석 (동사, 명사, 조사, 어간, 어미 등등 ) 하여 keyword 추출


[개념적 flow]

KoreanAnalyzer -> KoreanTokenizer -> KoreanFilter -> MorphAnalyzer

신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 0 : Comment 0

elasticsearch 한국어 형태소분석기 분석의 이해

Elastic/Elasticsearch 2013.01.22 18:55

Spacial Thanks to : 이창민.

elasticsearch 한국어 형태소분석기 분석

  1. 소스 다운로드 (zip파일로 다운로드)
    1. 다운로드 : https://github.com/chanil1218/elasticsearch-analysis-korean
    2. 소스로 다운로드도 가능하지만 해당 위치를 elasticsearch plugin에서 플러그인명을 chanil1218/elasticsearch-analysis-korean로
      지정할 경우에도 사용된다. 이 때, 해당 elasticsearch 버전이 최신버전이면 해당 플러그인을 찾지 못한다. 서버와 플러그인의 버전이 같아야 설치 가능
  2. 이클립스에 프로젝트 import 방법
    1. eclipsesearch-analysis-korean-master.zip파일을 압축해제한다.
    2. 이클립스->마우스 오른쪽 버튼-> Import-> Maven -> Existing Maven Projects
    3. Browse...을 눌러 압축을 해제한 디렉토리를 선택하여 import 한다.
    4. 프로젝트 오른쪽 버튼 -> Run as -> Maven install을 하여 빌드 한다.
  3. 형태소 분석을 담당하는 주 클래스는 org.apache.lucene.analysis.kr.morph 패키지의 MorphAnalyzer 클래스이다.
    KoreaTokenizer가 한글과 영문을 토큰 단위로 분리를 하면, 이중 한글만 (한글, 숫자+한글, 영자+한글) MorphAnalyzer을 통해 형태소 분석.
  4. 형태소 분석한 결과는 KoreanFilter에 AnalysisOutput 클래스로 전달이 되며 명사인 경우만 색인어로 추출
  5. 형태소분석결과는 점수를 가진다. 30 or 100으로 표시되는 값
    1. 100인 경우는 형태소 분석에 성공한 경우이므로 분석결과를 그대로 색인어로 사용.
    2. 30인 경우는 문법형태소로는 분해를 하였지만 사전에는 없으므로 정확하지 않은 경우. 이런 경우는 검색이 않되는 경우를 방지하기 위해 bigram(바이어그램, 아래에 설명 추가)에
      의해 추가로 색인어를 추출합니다.
    3. 예를 들면, "블로그에" 라는 어절이 있을 때 "블로그"가 사전에 등록되어 있지 않으므로 형태소분석결과는 "블로그에(N)"와 블로그(N), 에(J)"가 되지만 색인어는 "블로그에", "블로그", "블로", "로그", "그에"가 됩니다.
  6. 형태소 분석결과 사전이 없을 경우 바이어그램으로 색인어를 추출하는데 false drop된 문서가 나온는 단점이 있다.
    1. http://blog.daum.net/maxmin93/10990156 에서 절단 검색부분에 bigram의 문제점과 trigram이 좀더 나은 검색결과를 제공가능 하지만 장단점이 있는 것 확인.
    2. 위의 한국어 형태소 분석기에는 현재 분석결과가 사전에 없을 경우 bigram만 적용 됨.
  7. 사전 데이터는 org.apache.lucene.analysis.kr.dic 패키지에 존재한다. (사전데이터 각 파일 설명)
    1. total. dic : 기본사전
      - 용언과 체언을 포함한 기본사전 입니다. 사전의 형식을 보면 다음과 같이 구성되어 있습니다.
      ==========================
      납부,10011X
      ==========================
      단어정보 - 단어정보는 6글자로 구성되어 있는데 각 글자는 단어의 사용규칙을 나타내며 아래와 같습니다.
          - 1 : 명사
          - 2 : 동사
          - 3 : 기타품사
          - 4 : 하여동사
          - 5 : 되어동사
          - 6 : 불규칙변형
          - 1~3은 품사에 대한 정보이며, 위에 기술한 각 품사 여부를 나타냅니다.
          - 4~5는 명사인 경우 "하다""되다"가 붙을 수 있는 경우를 나타냅니다. 주의) 동사는 반드시(0)이어야 합니다.
          - 6은 동사인 경우 불규칙변형의 종류를 나타내며 종류는 아래와 같습니다.
        
      B:  ㅂ 불규칙, H: ㅎ 불규칙, L: 르 불규칙, S: ㅅ 불규칙, R: 러 불규칙, X: 규칙
    2. extension.dic : 확장사전
      - 기본사전은 가능한 그대로 사용하는 것이 좋음. 사전을 조금 보완하여야 할 때 확장사전을 사용하면 됨. 사전을 구성하는 기본 규칙은 기본사전과 동일
    3. josa.dic : 조사사전
      - 조사들만 모아둔 사전. 각 조사는 한줄씩 구분이 됨
    4. eomi.dic : 어미사전
      - 어미들만 모아둔 사전. 각 어미는 한줄씩 구분이 됨
    5. prefix.dic : 접두어 사전
      - 복합명사를 분해시 2글자 이상의 단어로만 분해. 그러나 "과소비" 같은 경우 " 과"를 접두어로 분리해 내어 "과소비"와 "소비"를 색인어로 추출하기 위해 만든사전
    6. suffix.dic : 접미어 사전
      - 복합명사를 분해시 "현관문" 같은 경우 "문"을 접미어로 분해하여 "현관문"과 "현관"을 색인어로 추출하기 위해 만든 사전
    7. compounds.dic : 기분석 복합명사 사전
      - 복합명사는 명사 사전을 기반으로 최장일치법에 의해 분해를 합니다. 그러나 "근로자의날" 같은 경우 중간에 조사가 포함되어 있으므로 분해가 불가능합니다. 이런 경우 복합명사 사전에 등록을 합니다. 규칙은 다음과 같습니다.
      ==========================
      근로자의날:근로자,날
      ==========================

      - 콜론(\:)을 중심으로 좌측은 복합명사이고 우측은 함께 추출될 색인어입니다. 따라서 위의 경우는 색인어로 "근로자의날", "근로자","날" 이렇게 3개가 추출됩니다.

    8. syllable.dic : 음절정보
    9. 현재 파악 중 (cj.dic , occurrence.dic, uncompounds.dic 3개의 파일)

N-gram이란?
N-gram이란?
N-gram은 텍스트나 문서에서 추출한 문자 또는 단어의 시퀀스이며, 문자 기반 및 단어 기반이라는 두 그룹으로 분류할 수 있다. N-gram은 단어 또는 문자열(이 튜토리얼의 경우)에서 추출한 N개의 연속 문자 세트이다. 이 방법의 배후에는 비슷한 단어가 N-gram의 높은 비율을 차지할 것이라는 개념이 깔려있다. 가장 일반적으로 사용되는 N값은 2와 3이며, 각각의 경우를 bigram과 trigram이라고 한다. 예를 들어, TIKA라는 단어에서는 T, TI, IK, KA, A*라는 bigram과 **T, *TI, TIK, IKA, KA, A*라는 trigram이 생성된다. ""는 채우기 공간을 의미한다. 문자 기반 N-gram은 문자열으 유사성을 측정하는데 사용된다. 문자 기반 N-gram을 사용하는 애플리케이션으로는 맞춤법 검사기 스테밍(strmming), OCR등이 있다.
발췌 :  http://www.ibm.com/developerworks/kr/opensource/tutorials/os-apache-tika/section6.html

신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 0 : Comments 2

elasticsearch + 한국어 형태소 분석기 색인 시 운영 경험 공유.

Elastic/Elasticsearch 2013.01.15 23:48

역쉬 쉬운게 없군요.. 
드뎌 elasticsearch 랑 kr analyzer 랑 문제를 해결했습니다.

제가 es 의 clustering 구성을 master node 를 두개로 구성했습니다.
그리고 색인 시 20개의 thread 를 생성해서 색인 데이터를 request 했구요.
물론 master node 한대를 target 으로 하고 request 했지요.

근데 es 내부에서 자동으로 master 끼리 분산 처리를 하더군요.

첨에는 소스 보기 귀찮아서 환경이랑 설정만 가지고 삽질을 했는데.. 도저희 해결이 안되서 소스를 직접 수정해서 디버깅을 하기 시작 했습니다.

짜잔.. ^^
해결책은 비교적 쉬운 곳에 있었습니다.

master node 를 하나만 사용하거나 thread safe 하도록 kr analyzer 소스를 조금 손봐주는 것입니다.

결론만 보면 정말 쉬운데요.. ㅋ 그 과정이 참 오래 걸렸내요.. 
그래도 뭐 빨리 찾았다고 생각 합니다.. ㅎㅎ

이상 es 운영 경험 공유를 맞칩니다. ^^


[해결방법1] <- 이건 근본해결책도 아니고 그냥 쓰레기 입니다. 그리고 data node 설정도 틀렸내요. 
- 서버 1 : node.master: true, node.data: true
- 서버 2 : 
node.master: false, node.data: true
아마도 
- 서버 1 : node.master: true, node.data: false
- 서버 2 : 
node.master: false, node.data: true
-> 다른 분이 테스트 해보시고 안된다고 그러시내요 ^^;


[해결방법2]

- SyllableUtil.java 에서 getSyllableFeature() 이 함수 내 FileUtil.readlines 를 threadsafe 하게 수정
- 저는 synchronized(lock) 으로 처리 했습니다.

신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 0 : Comment 0

티스토리 툴바