'arirang'에 해당되는 글 33건

  1. 2017.04.27 [Elasticsearch] 5.x 용 Arirang 형태소 분석기 사용 시 주의 사항.
  2. 2017.02.21 [Elasticsearch] elasticsearch-analysis-arirang-5.2.1
  3. 2016.11.25 [Elasticsearch] elasticsearch-analysis-arirang 5.0.1 플러그인 개발기
  4. 2016.11.24 [Elasticsearch] Lucene Arirang Analyzer Plugin for Elasticsearch 5.0.1
  5. 2016.04.26 [Elasticsearch] Elastic Stack 5.0 대비 Arirang 형분기 Lucene 6.0 업그레이드 준비
  6. 2016.03.17 [Elasticsearch] Elasticsearch에 Arirang 외부 사전 등록하기
  7. 2016.03.16 [Elasticsearch] Arirang analyzer 버전 올렸습니다.
  8. 2015.11.24 [Lucene] Arirang에 구현된 한글 초성,중성,종성 변환
  9. 2015.11.20 [arirang] 사전 데이터 등록 예제
  10. 2015.11.10 [Elasticsearch] arirang analyzer offset 추출 오류.

[Elasticsearch] 5.x 용 Arirang 형태소 분석기 사용 시 주의 사항.

Elastic/Elasticsearch 2017. 4. 27. 10:05

Elasticsearch에서 아리랑 형태소분석기 사용 시 주의사항)

사실 주의 사항 이라기 보다 1음절 처리에 대한 고민을 해보시면 좋을 것 같다는 의견 드립니다.


2.x 에서 사용하던 arirang 과 lucene 의 버전은 

- morph 1.0.x

- arirang & lucene 5.x

입니다.


5.x 에서 사용하던 arirang 과 lucene 의 버전은

- morph 1.1.0

- arirang & lucene 6.x

입니다.


여기서 arirang morph 쪽 코드가 많이 개선 또는 변경이 되었습니다.

그리고 몇 가지 default 설정 값들에 대한 변화도 있는데요.


제가 발견한 대표적인 문제는 아래와 같습니다.


'울퉁불퉁한' 이라는 source 에 대한 analysis 시 발생을 합니다.


5.x 에서 analyze 한 결과는 아래와 같습니다.

울퉁불퉁한(N)/90:2

울퉁불퉁/Z

한/N

울퉁불퉁(N),하(t),ㄴ(e)/70:2

울퉁/N

불퉁/N


2.x 에서 analyze 한 결과는 아래와 같습니다.

울퉁불퉁(N),하(t),ㄴ(e)/70:2

울퉁/N

불퉁/N


이게 무슨 문제가 되느냐고 할 수 있는데

실제 색인을 실행 하면 position 정보가 5.x 에서 뒤집혀져 색인 되지 않는 문제를 보실 수 있습니다.


5.x 에서 _analyze 한 결과는 아래와 같습니다.

{

  "tokens" : [

    {

      "token" : "울퉁불퉁한",

      "start_offset" : 0,

      "end_offset" : 5,

      "type" : "korean",

      "position" : 0

    },

    {

      "token" : "울퉁불퉁",

      "start_offset" : 0,

      "end_offset" : 4,

      "type" : "korean",

      "position" : 0

    },

    {

      "token" : "울퉁",

      "start_offset" : 0,

      "end_offset" : 2,

      "type" : "korean",

      "position" : 0

    },

    {

      "token" : "한",

      "start_offset" : 4,

      "end_offset" : 5,

      "type" : "korean",

      "position" : 1

    },

    {

      "token" : "불퉁",

      "start_offset" : 2,

      "end_offset" : 4,

      "type" : "korean",

      "position" : 2

    }

  ]

}


2.x 에서 _analyze 한 결과는 아래와 같습니다.

{

  "tokens" : [ {

    "token" : "울퉁불통",

    "start_offset" : 0,

    "end_offset" : 4,

    "type" : "korean",

    "position" : 0

  }, {

    "token" : "울퉁",

    "start_offset" : 0,

    "end_offset" : 2,

    "type" : "korean",

    "position" : 0

  }, {

    "token" : "불통",

    "start_offset" : 2,

    "end_offset" : 4,

    "type" : "korean",

    "position" : 1

  } ]

}


보이시나요?

어디가 다르고 문제가 되는지?


해결 방법은 CompoundNounAnalyzer 의 setDivisibleOne 설정을 false 로 하시면 위와 같은 문제를 해결 하실 수 있습니다.

2.x 에서는 KoreanFilter 쪽에 조건문이 있었는데 5.x 에서는 주석 처리가 되어 있더라구요.

또는 이것 저것 다 귀찮다고 하시면 그냥 '한' 에 대한 불용어 처리를 하셔도 될 것 같습니다.

:

[Elasticsearch] elasticsearch-analysis-arirang-5.2.1

Elastic/Elasticsearch 2017. 2. 21. 12:41

elasticsearch-analysis-arirang-5.2.1 공유 합니다.


Lucene 6.4.1

Elasticsearch 5.2.1 

기준 입니다.


elasticsearch-analysis-arirang-5.2.1.zip


설치 방법)

$ bin/elasticsearch-plugin install --verbose file:///services/apps/elasticsearch-analysis-arirang-5.2.1.zip


:

[Elasticsearch] elasticsearch-analysis-arirang 5.0.1 플러그인 개발기

Elastic/Elasticsearch 2016. 11. 25. 12:31

Elasticsearch cluster 업그레이드를 위해 먼저 한글형태소 분석기 업그레이드가 필요합니다.

기본적으로 한글형태소 분석기 플러그인을 만들기 위해서는 아래의 내용을 어느 정도는 잘 알고 다룰수 있어야 합니다.


- Elasticsearch

- Lucene

- Arirang


Arirang 은 아래 링크를 통해서 소스와 jar 파일을 구하실 수 있습니다.


최근에 수명님 이외 mgkaki 님이 컨트리뷰션을 해주시고 계신듯 합니다. :)


Lucene & Arirang 변경 사항)

- lucene 6.1 과 6.2 의 패키지 구조가 변경이 되고 클래스도 바뀌었습니다.

- arirang 에서 제공하던 pairmap 관련 버그가 수정되었습니다. (그전에 수정이 되었을수도 있습니다. ^^;)

- lucene 에서 제공 되던 CharacterUtils 가 refactoring 되었습니다.

- arirang 에서 KoreanTokenizer 에 선언된 CharacterUtils 를 변경된 내용에 맞게 고쳐주어야 합니다.


Remove CharacterUtils.getInstance()

CharacterUtils.codePointAt(...) to Character.codePointAt(...)


- arirang 6.2 source를 내려 받으시면 위 변경 내용이 반영 되어 있습니다.

- arirang.morph 1.1.0 을 내려 받으셔야 합니다.


Elasticsearch Plugin 변경 사항)

플러그인 개발 변경 사항은 기본 구조 변경이 많이 되었기 때문에 수정 사항이 많습니다.

보기에 따라서 적을 수도 있지만 판단은 각자의 몫으로 ^^


- arirang.lucene-analyzer 와 arirang-morph 업데이트가 되어야 합니다.

- 기존에 binding 하던 AnalysisBinderProcessor를 사용하지 않습니다.

- 이제는 Plugin, AnalysisPlugin 에서 등록을 진행 합니다.


public class AnalysisArirangPlugin extends Plugin implements AnalysisPlugin {

  @Override

  public Map<String, AnalysisProvider<TokenFilterFactory>> getTokenFilters() {

    return singletonMap("arirang_filter", ArirangTokenFilterFactory::new);

  }


  @Override

  public Map<String, AnalysisProvider<TokenizerFactory>> getTokenizers() {

    Map<String, AnalysisProvider<TokenizerFactory>> extra = new HashMap<>();

    extra.put("arirang_tokenizer", ArirangTokenizerFactory::new);


    return extra;

  }


  @Override

  public Map<String, AnalysisProvider<AnalyzerProvider<? extends Analyzer>>> getAnalyzers() {

    return singletonMap("arirang_analyzer", ArirangAnalyzerProvider::new);

  }

}


- AnalyzerProvider, TokenFilterFactory, TokenizerFactory 내 생성자 argument 가 바뀌었습니다.

IndexSettings indexSettings, Environment env, String name, Settings settings


- assemble 하기 위한 plugin.xml 내 outputDirectory 가 elasticsearch 로 변경이 되었습니다. 

- outputDirectory 가 elasticsearch 로 작성되어 있지 않을 경우 에러가 발생 합니다.


이 정도 변경 하고 나면 이제 빌드 및 설치를 하셔도 됩니다.

이전 글 참고) [Elasticsearch] Lucene Arirang Analyzer Plugin for Elasticsearch 5.0.1


※ 플러그인을 만들면서 우선 lucene 6.1 과 6.2 가 바뀌어서 살짝 당황 했었습니다.

당연히 6.x 간에는 패키지 구조에 대한 변경은 없을거라는 기대를 했었는데 이게 잘못이였던 것 같습니다.

역시 lucene 5.x 에서 6.x 로 넘어 가기 때문에 elasticsearch 5.x 는 많이 바뀌었을 거라는 생각은 했었구요.

그래도 생각했던 것 보다 오래 걸리지는 않았지만 역시 참고할 만한 문서나 자료는 어디에도 없더라구요.

소스 보는게 진리라는건 변하지 않는 듯 싶내요. 작성하고 보니 이게 개발기인지 애매하내요. ^^;


소스코드)

https://github.com/HowookJeong/elasticsearch-analysis-arirang

:

[Elasticsearch] Lucene Arirang Analyzer Plugin for Elasticsearch 5.0.1

Elastic/Elasticsearch 2016. 11. 24. 19:02

우선 빌드한 플러그인 zip 파일 먼저 공유 합니다.

나중에 작업한 내용에 대해서는 github 에 올리도록 하겠습니다.

요즘 프로젝트며 운영 업무가 너무 많아서 이것도 겨우 겨우 시간 내서 작업 했내요.


elasticsearch-analysis-arirang-5.0.1.zip


설치 방법)

$ bin/elasticsearch-plugin install --verbose file:///elasticsearch-analysis-arirang/target/elasticsearch-analysis-arirang-5.0.1.zip


설치 로그)

-> Downloading file:///elasticsearch-analysis-arirang-5.0.1.zip

Retrieving zip from file:///elasticsearch-analysis-arirang-5.0.1.zip

[=================================================] 100%

- Plugin information:

Name: analysis-arirang

Description: Arirang plugin

Version: 5.0.1

 * Classname: org.elasticsearch.plugin.analysis.arirang.AnalysisArirangPlugin

-> Installed analysis-arirang


Elasticsearch 실행 로그)

$ bin/elasticsearch

[2016-11-24T18:49:09,922][INFO ][o.e.n.Node               ] [] initializing ...

[2016-11-24T18:49:10,083][INFO ][o.e.e.NodeEnvironment    ] [aDGu2B9] using [1] data paths, mounts [[/ (/dev/disk1)]], net usable_space [733.1gb], net total_space [930.3gb], spins? [unknown], types [hfs]

[2016-11-24T18:49:10,084][INFO ][o.e.e.NodeEnvironment    ] [aDGu2B9] heap size [1.9gb], compressed ordinary object pointers [true]

[2016-11-24T18:49:10,085][INFO ][o.e.n.Node               ] [aDGu2B9] node name [aDGu2B9] derived from node ID; set [node.name] to override

[2016-11-24T18:49:10,087][INFO ][o.e.n.Node               ] [aDGu2B9] version[5.0.1], pid[56878], build[080bb47/2016-11-11T22:08:49.812Z], OS[Mac OS X/10.12.1/x86_64], JVM[Oracle Corporation/Java HotSpot(TM) 64-Bit Server VM/1.8.0_72/25.72-b15]

[2016-11-24T18:49:11,335][INFO ][o.e.p.PluginsService     ] [aDGu2B9] loaded module [aggs-matrix-stats]

[2016-11-24T18:49:11,335][INFO ][o.e.p.PluginsService     ] [aDGu2B9] loaded module [ingest-common]

[2016-11-24T18:49:11,335][INFO ][o.e.p.PluginsService     ] [aDGu2B9] loaded module [lang-expression]

[2016-11-24T18:49:11,335][INFO ][o.e.p.PluginsService     ] [aDGu2B9] loaded module [lang-groovy]

[2016-11-24T18:49:11,335][INFO ][o.e.p.PluginsService     ] [aDGu2B9] loaded module [lang-mustache]

[2016-11-24T18:49:11,336][INFO ][o.e.p.PluginsService     ] [aDGu2B9] loaded module [lang-painless]

[2016-11-24T18:49:11,336][INFO ][o.e.p.PluginsService     ] [aDGu2B9] loaded module [percolator]

[2016-11-24T18:49:11,336][INFO ][o.e.p.PluginsService     ] [aDGu2B9] loaded module [reindex]

[2016-11-24T18:49:11,336][INFO ][o.e.p.PluginsService     ] [aDGu2B9] loaded module [transport-netty3]

[2016-11-24T18:49:11,336][INFO ][o.e.p.PluginsService     ] [aDGu2B9] loaded module [transport-netty4]

[2016-11-24T18:49:11,336][INFO ][o.e.p.PluginsService     ] [aDGu2B9] loaded plugin [analysis-arirang]

[2016-11-24T18:49:14,151][INFO ][o.e.n.Node               ] [aDGu2B9] initialized

[2016-11-24T18:49:14,151][INFO ][o.e.n.Node               ] [aDGu2B9] starting ...

[2016-11-24T18:49:14,377][INFO ][o.e.t.TransportService   ] [aDGu2B9] publish_address {127.0.0.1:9300}, bound_addresses {[fe80::1]:9300}, {[::1]:9300}, {127.0.0.1:9300}

[2016-11-24T18:49:17,511][INFO ][o.e.c.s.ClusterService   ] [aDGu2B9] new_master {aDGu2B9}{aDGu2B9mQ8KkWCe3fnqeMw}{_y9RzyKGSvqYAFcv99HBXg}{127.0.0.1}{127.0.0.1:9300}, reason: zen-disco-elected-as-master ([0] nodes joined)

[2016-11-24T18:49:17,584][INFO ][o.e.g.GatewayService     ] [aDGu2B9] recovered [0] indices into cluster_state

[2016-11-24T18:49:17,588][INFO ][o.e.h.HttpServer         ] [aDGu2B9] publish_address {127.0.0.1:9200}, bound_addresses {[fe80::1]:9200}, {[::1]:9200}, {127.0.0.1:9200}

[2016-11-24T18:49:17,588][INFO ][o.e.n.Node               ] [aDGu2B9] started


한글형태소분석 실행)

$ curl -X POST -H "Cache-Control: no-cache" -H "Postman-Token: 6d392d83-5816-71ad-556b-5cd6f92af634" -d '{

  "analyzer" : "arirang_analyzer",

  "text" : "[한국] 엘라스틱서치 사용자 그룹의 HENRY 입니다."

}' "http://localhost:9200/_analyze"


형태소분석 결과)

{

  "tokens": [

    {

      "token": "[",

      "start_offset": 0,

      "end_offset": 1,

      "type": "symbol",

      "position": 0

    },

    {

      "token": "한국",

      "start_offset": 1,

      "end_offset": 3,

      "type": "korean",

      "position": 1

    },

    {

      "token": "]",

      "start_offset": 3,

      "end_offset": 4,

      "type": "symbol",

      "position": 2

    },

    {

      "token": "엘라스틱서치",

      "start_offset": 5,

      "end_offset": 11,

      "type": "korean",

      "position": 3

    },

    {

      "token": "엘라",

      "start_offset": 5,

      "end_offset": 7,

      "type": "korean",

      "position": 3

    },

    {

      "token": "스틱",

      "start_offset": 7,

      "end_offset": 9,

      "type": "korean",

      "position": 4

    },

    {

      "token": "서치",

      "start_offset": 9,

      "end_offset": 11,

      "type": "korean",

      "position": 5

    },

    {

      "token": "사용자",

      "start_offset": 12,

      "end_offset": 15,

      "type": "korean",

      "position": 6

    },

    {

      "token": "그룹",

      "start_offset": 16,

      "end_offset": 18,

      "type": "korean",

      "position": 7

    },

    {

      "token": "henry",

      "start_offset": 20,

      "end_offset": 25,

      "type": "word",

      "position": 8

    },

    {

      "token": "입니다",

      "start_offset": 26,

      "end_offset": 29,

      "type": "korean",

      "position": 9

    }

  ]

}


:

[Elasticsearch] Elastic Stack 5.0 대비 Arirang 형분기 Lucene 6.0 업그레이드 준비

Elastic/Elasticsearch 2016. 4. 26. 15:18

준비 작업을 조금 해야 할 것 같아서 일단 짧게 기록 합니다.


Elastic Stack 5.0이 정식 릴리즈 되게 되면 Lucene 6.x 기반으로 버전이 올라가게 됩니다.

이에 따라 아리랑 형태소 분석기도 버전을 올려야 하는데요.


일단 올려 보니 에러는 한 군데 보입니다.

abstract 로 선언된 method 하나만 구현해 주면 될 것으로 보입니다.


MophemeAttributeImpl.java 파일에 reflectWith(....) 메서드만 구현해 주세요.

@Override
public void reflectWith(AttributeReflector reflector) {
reflector.reflect(MorphemeAttribute.class, "token", koreanToken);
}

해당 코드에 대한 검증 작업은 하지 않았으니 사용이나 판단은 각자 알아서 하는 것으로 하겠습니다.


:

[Elasticsearch] Elasticsearch에 Arirang 외부 사전 등록하기

Elastic/Elasticsearch 2016. 3. 17. 12:49

arirang 한글 형태소 분석기를 적용하고 사전 데이터를 업데이트 할 일들이 많이 생깁니다.

jar 안에 들어 있는 사전 데이터는 패키지 빌드 후 재배포하고 클러스터 재시작까지 해줘야 하는데요.

이런 과정 없이 사전 데이터만 외부에서 파일로 업데이트 및 관리하고 재시작 없이 바로 적용했으면 합니다.


기본적으로 이전 글에서 사전 데이터를 reload 하는 REST API를 구현해 두었습니다.

이 기능으로 일단 기능 구현은 완료가 된 것입니다.


이전 글 보기)


그럼 elasticsearch에서 어디에 사전 파일을 두고 관리를 해야 적용이 가능 할까요?

이전 글을 보시면 기본적으로 수명님이 만드신 arirang.morph 에서 classpath 내  org/apache/lucene/analysis/ko/dic 과 같이 생성 및 배치 시키시면 먼저 이 파일을 읽어 들이게 되어 있습니다.


이전 글 보기)


단, elasticsearch 실행 시 classpath 정보에 생성한 경로를 추가하지 않으시면 사전 파일들을 찾을 수 없으니 이점 유의 하시기 바랍니다.


elasticsearch classpath 설정)

elasticsearch에서 가이드 하는 것은 수정하지 마라 입니다. 하지만 수정 없이는 이를 활용할 수 없으니 이런건 수정해줘야 합니다.


$ vi bin/elasticsearch.in.sh

.....

ES_CLASSPATH="$ES_HOME/lib/elasticsearch-2.2.0.jar:$ES_HOME/lib/*:$ES_HOME/설정하신경로입력"

.....


이렇게 수정하신 후 재시작 하시고 직접 사전 정보 업데이트 후 reload api 를 이용해서 적용되는지 확인해 보시면 되겠습니다.


참고 정보 - 간단 요약)

arirang.morph 에서 properties 파일과 dic 파일 loading flow


Step 1)

load external korean.properties into classpath.

dic files are same.


Step 2)

if not exist, load korean.properties into jar.

dic files are same.


사전 데이터는 어떻게 등록 할 수 있는지 궁금하신 분은 이전 글 참고하세요.


사전 데이터 등록 예제)

:

[Elasticsearch] Arirang analyzer 버전 올렸습니다.

Elastic/Elasticsearch 2016. 3. 16. 16:38

작업 하는 김에 버전 올렸습니다.


git branch)


루씬 한글 형태소 분석기인 arirang analyzer 버전 올렸습니다.
Elasticsearch 2.2.0
Lucene 5.4.1
arirang.morph 1.0.3

빌드 및 설치 방법)
$ mvn clean package
$ bin/plugin install file:/git/elasticsearch-analysis-arirang/target/elasticsearch-analysis-arirang.zip

인덱스 세팅 방법)
"index": {
"analysis": {
"analyzer": {
"arirang_custom": {
"type": "arirang_analyzer",
"tokenizer": "arirang_tokenizer",
"filter": ["lowercase", "trim", "arirang_filter"]
}
}
}

analyze 테스트 방법)
$ curl -XGET http://localhost:9200/memebox_deal_idx/_analyze?pretty -d '{ "analyzer":"arirang_analyzer", "text":"elasticsearch 한국 사용자 그룹입니다." }' { "tokens" : [ { "token" : "elasticsearch", "start_offset" : 0, "end_offset" : 13, "type" : "word", "position" : 0 }, { "token" : "한국", "start_offset" : 14, "end_offset" : 16, "type" : "korean", "position" : 1 }, { "token" : "사용자", "start_offset" : 17, "end_offset" : 20, "type" : "korean", "position" : 2 }, { "token" : "그룹", "start_offset" : 21, "end_offset" : 23, "type" : "korean", "position" : 3 } ] }


사전 reload 방법)

$ curl -XGET http://localhost:9200/_arirang_dictionary_reload

- 클러스터 재시작 없이 사전 데이터 수정 후 리로드 잘 됩니다. 단, 이미 색인 된 문서들은 재색인 해야 합니다.

:

[Lucene] Arirang에 구현된 한글 초성,중성,종성 변환

ITWeb/검색일반 2015. 11. 24. 17:35

수명님이 이미 다 만들어 놓으셨는데 참 뒷북도 ㅡ.ㅡ;

일단 죄송합니다.


arirang-morph 프로젝트 내 MorphUtil 클래스에 구현되어 있습니다.


[한글 초성/중성/종성 분리]

/**
* 한글 한글자를 초성/중성/종성의 배열로 만들어 반환한다.
* @param c the character to be decomposed
*/
public static char[] decompose(char c) {
char[] result = null;

if(c>0xD7A3||c<0xAC00) return new char[]{c};

c -= 0xAC00;

char choseong = CHOSEONG[c/JUNG_JONG];
c = (char)(c % JUNG_JONG);

char jungseong = JUNGSEONG[c/JONGSEONG.length];

char jongseong = JONGSEONG[c%JONGSEONG.length];

if(jongseong != 0) {
result = new char[] {choseong, jungseong, jongseong};
}else {
result = new char[] {choseong, jungseong};
}
return result;
}



[한글 초성/중성/종성 합침]

public static char compound(int first, int middle, int last) {    
return (char)(0xAC00 + first* JUNG_JONG + middle * JONGSEONG.length + last);
}


:

[arirang] 사전 데이터 등록 예제

ITWeb/검색일반 2015. 11. 20. 15:15

arirang analyzer 를 사용하면서 사전 활용을 위해서는 사전 파일이 어떻게 구성이 되어 있고 관리가 되어야 하는지 알아야 합니다.

아래 공식 카페에 들어가시면 많은 정보들이 있으니 참고 하시면 되겠습니다.


[공식카페]


[형태소분석 사전 구성 및 사용법]


[사전 등록 예시]

# 위 구성 및 사용법 에서와 같이 인덱스 순서가 이렇게 되어 있습니다.

명사 동사 기타품사 하여(다)동사 되어(다)동사 '내'가붙을수있는명사 na na na 불규칙변형


# 엘사는 명사이고 동사, 기타품사, 불규칙이 아니다, 라고 가정하면 아래와 같이 표현이 됩니다.

엘사,100000000X


# 노래는 명사이고 하여 동사가 됩니다.

노래,100100000X


# 소리는 명사이고 소리내다와 같이 내가 붙을 수 있는 명사 입니다.

소리,100001000X


[사전작업 후 리로딩]

arirang-morph 패키지에서 DictionaryUtil.java 내 loadDictionary() 호출을 통해 다시 올려 줍니다.

▶ 별도 구현이 필요합니다.


[불규칙변형 태그]

원문) http://cafe.naver.com/korlucene/135

# 위에서 제일 마지막에 'X' 라는 문자가 있습니다. 이 부분에 대한 설명 입니다.

B : ㅂ 불규칙

H : ㅎ 불규칙

L : 르 불규칙

U : ㄹ 불규칙

S : ㅅ 불규칙

D : ㄷ 불규칙

R : 러 불규칙

X : 규칙


:

[Elasticsearch] arirang analyzer offset 추출 오류.

Elastic/Elasticsearch 2015. 11. 10. 15:38

[아래 문제 회피]

기본적으로 pairmap 관련 기능을 사용하지 않으면 문제를 회피 할 수 있습니다.

더 근본적으로는 관련 기능에 대한 개선이 필요 하겠지만 일단 빠르게 해결 하기 위해서 코드를 제거해 보겠습니다.


대상파일)

KoreanTokenizer.java


삭제 대상코드) 

            if(pairstack.size()>0 && pairstack.get(0)==c) {

                pairstack.remove(0);

                continue;

            }


            int closechar = getPairChar(c);

            if(closechar!=0) {

                if((pairstack.size()==0 || pairstack.get(0)!=closechar) && length>0) {

                    pairstack.add(0,closechar);

                    break;

                } else {

                    pairstack.add(0,closechar);

                    continue;

                }

            }

위 코드를 주석 처리 후 빌드해서 배포 하시면 됩니다.


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


최근에 arirang analyzer plugin을 만들어서 elasticsearch에서 사용하고 있습니다.

사용하다 발견된 버그 공유 합니다.


[색인원본문서]

(‘14.8월)의 일환으로 ’15.3.3 상반기중(행복서울대학교 등 활용)


[Arirang Analyzed]

{

    "tokens": [

        {

            "token": "14",

            "start_offset": 2,

            "end_offset": 4,

            "type": "word",

            "position": 0

        },

        {

            "token": "8월",

            "start_offset": 5,

            "end_offset": 7,

            "type": "korean",

            "position": 1

        },

        {

            "token": "의",

            "start_offset": 8,

            "end_offset": 9,

            "type": "korean",

            "position": 2

        },

        {

            "token": "일환",

            "start_offset": 10,

            "end_offset": 12,

            "type": "korean",

            "position": 3

        },

        {

            "token": "15",

            "start_offset": 16,

            "end_offset": 18,

            "type": "word",

            "position": 4

        },

        {

            "token": "3",

            "start_offset": 19,

            "end_offset": 20,

            "type": "word",

            "position": 5

        },

        {

            "token": "3",

            "start_offset": 21,

            "end_offset": 22,

            "type": "word",

            "position": 6

        },

        {

            "token": "상반기중행복서울대학교",

            "start_offset": 23,

            "end_offset": 34,

            "type": "korean",

            "position": 7

        },

        {

            "token": "상반",

            "start_offset": 23,

            "end_offset": 25,

            "type": "korean",

            "position": 7

        },

        {

            "token": "기중",

            "start_offset": 25,

            "end_offset": 27,

            "type": "korean",

            "position": 8

        },

        {

            "token": "행복",

            "start_offset": 27,

            "end_offset": 29,

            "type": "korean",

            "position": 9

        },

        {

            "token": "서울",

            "start_offset": 29,

            "end_offset": 31,

            "type": "korean",

            "position": 10

        },

        {

            "token": "대학교",

            "start_offset": 31,

            "end_offset": 34,

            "type": "korean",

            "position": 11

        },

        {

            "token": "등",

            "start_offset": 36,

            "end_offset": 37,

            "type": "korean",

            "position": 12

        },

        {

            "token": "활용",

            "start_offset": 38,

            "end_offset": 40,

            "type": "korean",

            "position": 13

        }

    ]

}


여기서 보시면 "행복"에서 부터 offset 정보가 하나씩 줄어든것을 확인 할 수 있습니다.


[원본 변경을 통한 문제해결 - 하나]

(‘14.8월)의 일환으로 15.3.3 상반기중(행복서울대학교 등 활용)

- ’15 (apostrophe) 제거


[원본 변경을 통한 문제해결 - 둘]

(‘14.8월)의 일환으로 ’15.3.3 상반기중(행복서울대학교 등 활용)

- 8월’ (apostrophe) 추가


[원본 변경을 통한 문제해결 - 셋]

(14.8월)의 일환으로 ’15.3.3 상반기중(행복서울대학교 등 활용)

- ’14 (apostrophe) 제거


[원본 변경을 통한 문제해결 - 넷]

‘14.8월)의 일환으로 ’15.3.3 상반기중(행복서울대학교 등 활용)

- ( 제거


[해결 방법?]

- 복합 pairmap 구성에 대한 arirang analyzer 오류 수정 (tokenizer 와 filter 쪽 수정이 필요해 보입니다.)

- 원본에 대한 character normalization 작업을 통해 filter 를 합니다.

: