'ITWeb/검색일반'에 해당되는 글 28건

  1. 2016.02.29 [Maven] maven 프로젝트 naming convention - group id, artifact id, version ...
  2. 2016.02.26 [Similarity] BM25, TF/IDF 한 줄 정리.
  3. 2016.02.18 [검색엔진역사] 초간단 요약.
  4. 2016.02.16 [IR] 스탠포드대학 IR-book
  5. 2015.11.24 [Lucene] Arirang에 구현된 한글 초성,중성,종성 변환
  6. 2015.11.24 [Lucene] CustomScoreQuery vs. DisjunctionMaxQuery
  7. 2015.11.20 [arirang] 사전 데이터 등록 예제
  8. 2015.11.19 [자모분석기] 초성, 중성, 종성 남의 코드 가져다 구현해 보기.

[Maven] maven 프로젝트 naming convention - group id, artifact id, version ...

ITWeb/검색일반 2016. 2. 29. 16:32

이것도 매번 기억 못해서 찾아 보던 거라 그냥 기록해 봅니다.

기록이라기 보다는 그냥 스크랩이 맞는 것 같내요.


원본 링크)


원본)

  • groupId will identify your project uniquely across all projects, so we need to enforce a naming schema. It has to follow the package name rules, what means that has to be at least as a domain name you control, and you can create as many subgroups as you want. Look at More information about package names.

    eg. org.apache.maven, org.apache.commons

    A good way to determine the granularity of the groupId is to use the project structure. That is, if the current project is a multiple module project, it should append a new identifier to the parent's groupId.

    eg. org.apache.maven, org.apache.maven.plugins, org.apache.maven.reporting

  • artifactId is the name of the jar without version. If you created it then you can choose whatever name you want with lowercase letters and no strange symbols. If it's a third party jar you have to take the name of the jar as it's distributed.

    eg. maven, commons-math

  • version if you distribute it then you can choose any typical version with numbers and dots (1.0, 1.1, 1.0.1, ...). Don't use dates as they are usually associated with SNAPSHOT (nightly) builds. If it's a third party artifact, you have to use their version number whatever it is, and as strange as it can look.

    eg. 2.0, 2.0.1, 1.3.1


:

[Similarity] BM25, TF/IDF 한 줄 정리.

ITWeb/검색일반 2016. 2. 26. 10:52

TF/IDF: common words can still influence the score! 

BM25: limits influence of term frequency


TF/IDF: short fields (title,...) are automatically scored higher

BM25: Scales field length with average


참 간단하죠.

그냥 둘의 가장 큰 차이점이라고 생각 하시면 될 것 같습니다.


:

[검색엔진역사] 초간단 요약.

ITWeb/검색일반 2016. 2. 18. 10:20

검색엔진이 언제 부터 시작했는지 그냥 기록해 봤습니다.


1989년 팀버너리에 의해서 w3 프로젝트가 시작 되었습니다. (HTTP, HTML 정의)

1990년 FTP 서버 내 파일 검색을 위한 Archi 라는 검색엔진이 검색엔진의 시초 입니다.

1991년 팀버너리가 유즈넷에 자신의 프로젝트를 공개 하면서 활성화되기 시작했습니다.

1993년 Gopher서버에서 사용하는 베로니카라는 검색엔진이 나왔습니다.

1994년 web crawler 라는 서비스가 나왔으며 이후 우리가 아는 검색 엔진과 서비스들이 하나 둘 나오기 시작했습니다.


AOL, Lycos, Yahoo, Altavista, ......

:

[IR] 스탠포드대학 IR-book

ITWeb/검색일반 2016. 2. 16. 09:50

스탠포드 대학에서 제공하고 있는 IR-book 입니다.

참고하기 위해 스크랩 합니다.


원문링크)


원문목차)

Introduction to Information Retrieval: Table of Contents

 chapter     resources
Front matter (incl. table of notations)pdf
01  Boolean retrievalpdf html
02The term vocabulary & postings listspdf html
03Dictionaries and tolerant retrievalpdf html
04Index constructionpdf html
05Index compressionpdf html
06Scoring, term weighting & the vector space modelpdf html
07Computing scores in a complete search systempdf html
08Evaluation in information retrievalpdf html
09Relevance feedback & query expansionpdf html
10XML retrievalpdf html
11Probabilistic information retrievalpdf html
12Language models for information retrievalpdf html
13Text classification & Naive Bayespdf html
14Vector space classificationpdf html
15Support vector machines & machine learning on documentspdf html
16Flat clusteringpdf htmlhtml
17Hierarchical clusteringpdf html
18Matrix decompositions & latent semantic indexingpdf html
19Web search basicspdf html
20Web crawling and indexespdf html
21Link analysispdf html
Bibliography & Indexpdf
bibtex filebib


각 챕터별 요약 원문)


Chap01. Information retrieval! using the Boolean model

-         상용 검색서비스의 대부분이 채택하고 있는 모델인 불리언 검색 모델에 대한 내용

-         AND, OR 등의 연산자를 포스팅 리스트를 통해서 어떻게 처리하고 있는지를 설명

è 현재 우리가 사용하고 있는 검색엔진의 작동 방식을 설명여러 관련 컴포넌트는 어떤것들이 있는지 등등


Chap02. The dictionary and postings lists

-         빠른 검색을 위해 색인 처리를 하는데이를 구성하는 사전과 포스팅 리스트에 대한 내용

-         우리가 사용하고 있는 사전과 포스팅 외에도 다양한 용도의 다른 사전과 텀 포지션 정보들에 대해 설명

è 빠른 검색을 위해 문서의 정보를 검색엔진에 적합하도록 가공하는데 그것에 대한 결과물이죠.


Chap03. Tolerant retrieval! 

-         실데이터를 다룰 때 발생하는질의어 상에 또는 문서나 사전 상에여러 오류를 처리하는 내용

-         부분패턴 검색, k-Gram 처리오타처리동음어 처리 등에 대해 설명

è 검색 서비스를 위해서 꼭 필요한 유틸리티라 할 수 있는데 편의성과 융통성 등을 높여줍니다.


Chap04. Index construction

-         제한된 머신의 리소스 안에서 대용량의 색인을 처리하는 방법에 대한 내용

-         블록병합색인분산색인동적색인포지션 정보를 포함한 색인권한 정보를 포함한 색인

è 서비스 파트에서 열심히 하고 있는 작업이죠대용량의 색인을 할 때 필요한 지식입니다.


Chap05. Index compression

-         색인 데이터를 실제 메모리에 올려 사용해야 하기 때문에 성능을 고려한 압축이 필요그에 대한 내용

-         색인용량 예측방법(사전,포스팅), Dictionary압축블록저장, PostingFile압축γ코드 압축, Zipf의법칙

è 데이터 특성에 따라 더 효율적인 압축도 가능합니다더 빠르게더 작게.. 맨날 하는 색인작업이 1시간 안에 끝난다면 좋겠죠.


Chap06. Term weighting and vector space models

-         단어 가중치 기법을 이용하여 질의어와 문서의 유사성 거리를 벡터 방식으로 풀어내는 검색 모델 소개

-         단어와 문서 구역에 대한 Scoring 및 Weighting, TF, IDF, TF*IDF, 가중치 정규화유사도 함수

è 불리언의 필터링 성격보다 보다 진보한 형태의 검색기법입니다질의와 문서의 유사도에 대한 개념이 시작됩니다.


Chap07. Computing scores in a complete search system

-         단어 가중치 기법 이외의 스코어링과 랭킹 기법에 대한 설명

-         스코어링과 랭킹챔피온 리스트품질 스코어링, Ordering, 스코어링용 Features, 스코어링 디자인

è 랭킹에 대한 가중치는 우리도 많이 사용하고 있죠더 좋은 검색 품질을 위해 끊임없이 개발해야 하는 부분입니다.


Chap08. Eval!uation in information retrieval!

-         검색 모델의 검색 성능 측정 방법에 대한 내용

-         테스트 콜렉션정확도와 재현율랭킹에 대한 평가적합도 판정시스템 품질과 사용성

è 검색 서비스의 오픈할 때 하는 성능측정 외에도 계속적인 평가와 모니터링이 필요합니다쿼리 파라미터의 뭘 수정해야 할까요??


Chap09. Relevance feedback and query expansion

-         사용자 피드백에 의한 재검색 모델과 질의어 확장에 대한 내용

-         최적화된 결과를 내놓기 위한 방법, Rocchio 알고리즘확률적 적합도질의 확장용 사전자동 시소러스 생성

è 쇼핑관련 검색서비스 등에 적용하면 좋은 모델입니다쿼리확장은 공통이지만 모호성이 있는 특히 지식뉴스일반 웹검색 등에 더욱 필요하죠.


Chap10. XML retrieval!

-         일반 텍스트가 아닌 구조적 텍스트인 XML 문서에 대한 검색 방법에 대한 내용

-         XML 문서, XML 검색 개요, XML 검색용 벡터 모델콘텐츠 중심과 구조적 중심의 검색 비교

è 그다지 새로운 개념은 아닙니다전처리파트에서 HTML, PDF, DOC, PPT 파일등을 XML로 가공해서 퍼주면 해야할 일들입니다.


Chap11. Probabilistic information retrieval!

-         확률적 검색 모델에 대한 내용

-         확률이론확률적 랭킹기법이진독립모델확률값(기대치추정다양한 확률 모델

è 불리언 검색의 대안 모델중에 하나인 확률모델입니다. 0/1 대신에 질의어에 대한 문서 적합성을 확률로 계산하죠.


Chap12. Language models for information retrieval!

-         언어적 특징(특정 단어가 실제로 쓰여질 확률)에 기반한 검색 모델 소개

-         Query likelihood model, Ponte & Croft 실험다양한 언어모델 기법

è 많이 쓰이는 단어 많이 쓰이지 않는 단어에 각기 다른 가중치를 두어 질의어를 가공하면 좀 더 주제가 명확한 결과가 나오겠죠.


Chap13. Text classification and Naive Bayes

-        문서 분류와 나이브 베이지안(확률적분류 기법에 대한 내용

-         문서 분류, Naïve Bayes 분류기법, Bernoulli 모델특징 추출상호 정보성(Mutual Information), 카이스퀘어 특징추출분류 평가

è 검색은 대규모의 컬렉션에서 사용자의 의도에 적합한 문서를 필터링하는 작업을 말하는데 이를 분류라고 표현할 수도 있습니다.
 
유사성 혹은 관련성에 의한 분류 기법으로 검색품질을 높일수 있습니다서치 플러그인 등에서 사용하면 좋겠죠.


Chap14. Vector space classification

-         벡터 공간 모델에 의한 분류 기법에 대한 내용

-         Rocchio 분류, k-nearest neighbor(k근접이웃), 선형 및 비선형 분류분류의 tradeoff

è 유사하다는 개념을 어떻게 정의하면 좋을까요뚝딱 반으로 자를까요고려할 요소가 많아 복잡한건 어떻게 자를까요?

 

 

Chap15. Support vector machines and kernel functions

-         14장의 벡터공간모델에 의한 기계학습기법인 SVM에 대한 내용분류 기법에 대한 핵심 함수

-         SVM, 유연한 경계에 의한 분류비선형 SVMs

è 분류를 위한 대표적인 기계학습기법인 SVM입니다수학을 잘하면 재밋는데 못하면 재미없습니다
   
결과가 주어졌을 때 x,y,z 등에 의한 선형분석입니다오류를 최소로 만드는 해를 찾는 기법이죠분류는 다 이런 식입니다.


Chap16. Flat clustering

-         비교사학습인 군집화 기법에 대한 내용 (vs 분류는 정답이 있는 교사학습기법), 평면적인 군집

-         정보검색에서의 군집화군집평가, k평균 알고리즘, EM 클러스터링

è 분류는 검색형태에 대한 의도를 품고서 문서를 솎아내는 방식이라 지속적으로 관리가 필요합니다구체적인 기획이 필요하죠.
   
반면에 군집은 유사성이라는 척도 하나로 알아서 다해줍니다후처리에서 미리 해주면 검색품질이 엄청 좋아집니다.
   
또는 검색엔진을 거친 후 재가공으로서 사후클러스터링을 하면 같은 질의어에 다른 내용의 문서들을 어느정도 모아서 볼여줄 수 있겠죠.


Chap17. Hierarchical clustering

-         구조적인(상향식하향식군집기법에 대한 내용

-         싱글링크&완전링크 군집화그룹핑 방식의 군집화중심축 기반의 군집화군집명명기법

è 앞에 군집기법은 좀 옛날겁니다요즈음은 인간의 군집화 방식을 좀 더 흉내내어 다 부순다음에 하나씩 모아가는 방식이거나
   
또는 하나로 뭉쳐놓은 상태에서 아닌것들을 짤라내는 형식으로 군집화를 합니다제 논문도 이에 관련한거죠재밋습니다.


Chap18. Matrix decompositions and Latent Semantic Indexing

-         행렬분해와 잠재의미인덱싱 기법에 대한 내용 (요인분석과 차원축소를 이용한 인덱싱)

-         선형대수학행렬분해단어-문서 행렬고유값분해저차원 추정과 잠재의미색인(LSI)

è 행렬이 나오는데 아주 골치아프더군요내용인즉슨 단어로 쪼개진 사전 기반의 색인방식을 해결하기 위한 대안으로 단어와 문서의 관계를 통째로 색인하자는거죠통째로 색인하면 콜렉션과 단어의 관계성이 그대로 살아있게됩니다그걸 그냥 쓰려니 너무 커서 줄여서 쓰는 방법을 고안한거죠.


Chap19. Web search basics

-         웹검색에 관련한 다양한 이슈들에 대한 내용

-         웹의 특징웹 그래프스팸웹광고웹검색 경향, fingerprint, 중복문서 해결기술과 Shingling

è 중복문서 제거입니다수집 문서중에서 많게는 70~80%가 중복이라는군요.
   
이를 해결하기 위해 핑거프리트와 Shingling에 대해 소개하고 있습니다구글에 적용된 방식이기도 하구요스팸처리도 있군요.


Chap20. Web crawling and indexes

-         웹문서 수집과 색인에 대한 내용

-         Crawling, 크롤러 구조, DNS 처리방안, URL 프론티어분산색인병렬서버

è 누가 더 많이 수집하고 누가 더 빨리 처리해서 색인기에 집어 넣느냐는 절대적인 성능지표이죠.
   
또 우리나라 검색회사가 글로벌로 성장해서 아시아의 모든 문서를 하나의 검색서비스로 제공한다면 어떻게 해야 할까요구글은 하고 있습니다.

Chap21. Link analysis

-         그래프 구조의 형태를 갖는 웹문서의 특징을 이용한 분석기법에 대한 내용 (구글의 Pagerank)

-         Pagerank, 마코브 체인페이지랭크 계산특정 토픽기반의 Pagerank, Hubs(참조) and Authorities(권위)

è 21세기 히트작이죠구글의 페이지랭크입니다이를 기회로 사회적 네트워크에 대한 관심이 폭발적으로 높아졌습니다.
   
싸이월드도 그 대표적인 사례죠카페가 강점인 우리회사도 이를 충분히 이용할 수 있습니다블로그는 더더욱 그렇구요펌질~
   
우리나라 사람들은 입소문을 잘 내기도 하고 군중심리도 있기 때문에 그래프 분석을 하면 검색에 큰 효과를 가져올 수 있을겁니다제가 궁극적으로 하고 싶은 분야도 이쪽입니다게시판의 글들을 컨셉별로 나눌수도 있고 관련 UCC를 연결할 수도 있겠죠~되면^^

:

[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);
}


:

[Lucene] CustomScoreQuery vs. DisjunctionMaxQuery

ITWeb/검색일반 2015. 11. 24. 15:05

검색 서비스를 운영하다 보면 문서에 대한 부스팅 작업이 필요 할 때가 있습니다.

부스팅의 목적은 다양할 수 있는데요.

한 문장으로 정리를 하면, 

"특정 문서를 검색 결과 상위에 노출시키기 위해 사용"

한다고 보시면 됩니다.


문서에 대한 부스팅 작업은 아래와 같은 방법으로 구현이 가능 합니다.


1. 질의 부스팅

"Query time boosting" 이라는 것은 질의 시 특정 필드 또는 질의어에 대한 가중치를 부여하여 질의 시점에 적용하는 방식을 말합니다.


2. 색인 부스팅

"Index time boosting" 이라는 것은 색인 시 특정 필드 또는 문서에 대한 가중치를 부여하여 색인 시점에 적용하는 방식을 말합니다.


3. 필드 부스팅

"Field boosting" 이라는 것은 특정 필드에 대한 가중치가 또는 중요도가 높다는 것을 반영하여 적용하는 방식을 말합니다.


4. 도큐멘트 부스팅

"Document boosting" 이라는 것은 특정 문서 자체에 대한 가중치가 또는 중요도가 높다는 것을 반영하여 적용하는 방식을 말합니다.


5. 커스텀 부스팅

"Custom boosting" 이라는 것은 임의 문서에 대한 가중치와 스코어에 대한 조작을 통해 적용하는 방식을 말합니다.


부스팅에 대한 구현 방법을 살펴 보았는데요.

이것들은 아래의 API를 통해서 구현 하게 됩니다.


바로 DisjunctionMaxQuery 와 CustomScoreQuery 입니다.

물론 lucene에서 제공하는 다른 API 또는 Elasticsearch 나 Solr 에서 제공하는 다양한 방식으로 구현이 가능 합니다.



DisjunctionMaxQuery 를 이용해서 구현 가능한 것은

1. 질의 부스팅

3. 필드 부스팅

정도로 보입니다.


반대로 CustomScoreQuery 는 다양하게 구현이 가능합니다.

Elasticsearch 기준으로 보면 FunctionScoreQuery + DisjunctionMaxQuery 를 섞어서 사용이 가능 하기 때문에 2. 색인 부스팅을 제외 하고는 다 구현이 가능 하다고 보면 될 것 같습니다.


자 이제 급 마무리를 해보겠습니다.

뭐 말은 만드는 사람 맘이고 해석도 하는 사람 맘이니 저랑 다르게 생각하시는 분들이 계실 겁니다.

다만 내용이 틀렸거나 잘못되었다면 좀 알려주세요. ^^;


[Dis Max Query]

- 질의 시점에 사용을 합니다.

- Field 에 대한 가중치를 주어 부스팅을 합니다.

- 구현하기 쉽습니다.

- 순수하게 검색엔진에 맡겨처 처리 합니다.


[Custom(Function) Score Query]

- 질의 시점에 사용을 합니다.

- Field, Document 에 대한 가중치를 주어 부스팅을 합니다.

- 제공하는 API 가 많기 때문에 어렵지 않습니다.

- 다양한 방법으로 구현이 가능 합니다.

- 다양한 알고리즘 또는 요건을 만족 시키기 위해 사용을 합니다.

- 문서 내 특정 값을 이용하여 부스팅에 적용 할 수 있습니다.

- 복잡할 수록 성능이 느려 질 수 있습니다. 


과거에 fulltext 검색으로 사용하는 게시판류 서비스 뭐 이런데에서는 dis max query + query string 을 즐겨 사용하곤 했는데요.

지금은 좀 더 정교하게 부스팅을 하기 위해서 custom(function) score query 를 많이 사용하는것 같습니다.

특히 쇼핑몰 같은 경우는 dis max 보다는 custom score 가 적합한 query라고 생각 합니다.

:

[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 : 규칙


:

[자모분석기] 초성, 중성, 종성 남의 코드 가져다 구현해 보기.

ITWeb/검색일반 2015. 11. 19. 15:44

구글님을 통해서 한글 초성검색 또는 초성, 중성, 종성 이런식으로 검색 하시면 엄청난 자료들이 나옵니다.

지금은 어느 검색 포털이나 쇼핑몰 검색에서 흔히 사용되는 기술이죠.

오픈 된 소스가 많이 있기 때문에 잘 작성된 코드 보고 원리를 이해하고 자신의 서비스에 맞게 적용하시면 될 것 같습니다.


저는 늘 그렇듯이 맨날 잊어버려서 복습 차원에서 또 블로깅을 해봅니다. :)


보통 시작하기에 앞서 한글의 초성, 중성, 종성을 먼저 정리 하게 됩니다.

하고 싶은게 초중종을 분리 하는 것이기 때문에 당연한 것이라고 생각 됩니다.

저 같은 경우는 내가 하고 싶은걸 먼저 적고 그걸 어떻게 구현 할 수 있을까 를 고민 하면서 스케치를 합니다.

그런 다음 고민한 내용을 기반으로 직접 구현 할 것인지 오픈소스를 가져다 사용할 것인지를 또 정리 합니다.


이미 잘 작성된 오픈 소스가 있다면 당연히 비용을 줄이는 차원에서 가져다 사용을 합니다.

단, 사용하는 오픈 소스나 도구의 동작 원리와 내부 구성이 어떻게 되어 있는지는 잘 분석하고 시작을 해야 한다고 생각 합니다.

그래야 시행착오를 줄일 수 있지 않을까 생각 하거든요.


암튼 이제 살펴 보겠습니다.


[초성/자음] - 19자

{'ㄱ', 'ㄲ', 'ㄴ', 'ㄷ', 'ㄸ', 'ㄹ', 'ㅁ', 'ㅂ', 'ㅃ', 'ㅅ', 'ㅆ', 'ㅇ', 'ㅈ', 'ㅉ', 'ㅊ', 'ㅋ', 'ㅌ', 'ㅍ', 'ㅎ'}


[중성/모음] - 21자

{'ㅏ', 'ㅐ', 'ㅑ', 'ㅒ', 'ㅓ', 'ㅔ', 'ㅕ', 'ㅖ', 'ㅗ', 'ㅘ', 'ㅙ', 'ㅚ', 'ㅛ', 'ㅜ', 'ㅝ', 'ㅞ', 'ㅟ', 'ㅠ', 'ㅡ', 'ㅢ', 'ㅣ'}


[종성/받침] - 28자 (채움문자 포함)

{' ', 'ㄱ', 'ㄲ', 'ㄳ', 'ㄴ', 'ㄵ', 'ㄶ', 'ㄷ', 'ㄹ', 'ㄺ', 'ㄻ', 'ㄼ', 'ㄽ', 'ㄾ', 'ㄿ', 'ㅀ', 'ㅁ', 'ㅂ', 'ㅄ', 'ㅅ', 'ㅆ', 'ㅇ', 'ㅈ', 'ㅊ', 'ㅋ', 'ㅌ', 'ㅍ', 'ㅎ'}


[초성 유니코드]

{0x3131, 0x3132, 0x3134, 0x3137, 0x3138, 0x3139, 0x3141, 0x3142, 0x3143, 0x3145, 0x3146, 0x3147, 0x3148, 0x3149, 0x314a, 0x314b, 0x314c, 0x314d, 0x314e}


[중성 유니코드]

{0x314f, 0x3150, 0x3151, 0x3152, 0x3153, 0x3154, 0x3155, 0x3156, 0x3157, 0x3158, 0x3159, 0x315a, 0x315b, 0x315c, 0x315d, 0x315e, 0x315f, 0x3160, 0x3161, 0x3162, 0x3163}


[종성 유니코드]

{0x0000, 0x3131, 0x3132, 0x3133, 0x3134, 0x3135, 0x3136, 0x3137, 0x3139, 0x313a, 0x313b, 0x313c, 0x313d, 0x313e, 0x313f, 0x3140, 0x3141, 0x3142, 0x3144, 0x3145, 0x3146, 0x3147, 0x3148, 0x314a, 0x314b, 0x314c, 0x314d, 0x314e}


아래는 국립국어연구원에서 발췌한 글 입니다.


[한글의 자모로 조합 가능한 글자의 수는 11,172개]


우리가 조합형 한글 코드로 조합하여 만들 수 있는 글자의 수는 얼마나 될까? 초성과 중성에 쓰이는 자음과 모음의 숫자는 한글 맞춤법 규정과 다를 것이 없다. 그러나 받침의 경우는 사정이 조금 다르다. 우리말은 받침이 없는 경우가 있기 때문에 받침이 없는 경우에도 한글 한 글자에 해당하는 2바이트(16비트)를 만들기 위한 5비트의 종성을 채워줄 수 있는 채움 문자가 필요하다. 그래서 조합할 수 있는 받침의 수는 한글 맞춤법에 나온 27자에 채움 문자 한 글자가 더 들어간 28자로 계산하여야 한다. 따라서 조합형 한글 코드로 만들어 낼 수 있는 글자의 수는 19(초성)×21(중성)×28(종성)=11,172개이다. 물론 이는 이론적으로 가능한 숫자이고 조합 가능한 모든 글자가 실생활에서 쓰이는 것은 아니다.


여기서 이렇게 한글만 정리 하면 영어 같은 경우는 어떻게 할 수 있을까요?

영어는 그냥 글자 자체로 초성으로 취급 하면 되지 않겠습니까?

이렇게 한글에 대한 분리와 분리된 자모를 다시 합치기 위한 공식이 나오게 됩니다.

당연히 누군가 만들어 놓은 공식을 사용하였습니다.

단, 왜 이렇게 나왔는지를 이해하고 사용하시면 좋겠습니다.


[분리 기본 공식]

    초성 = ( ( (글자 - 0xAC00) - (글자 - 0xAC00) % 28 ) ) / 28 ) / 21

    중성 = ( ( (글자 - 0xAC00) - (글자 - 0xAC00) % 28 ) ) / 28 ) % 21

    종성 = (글자 - 0xAC00) % 28


[합치기 기본 공식]

    원문 = 0xAC00 + 28 * 21 * (초성의 index) + 28 * (중성의 index) + (종성의 index)


    각 index 정보는 CHOSUNG, JUNGSUNG, JONGSUNG char[]에 정의한 index 입니다.

    하지만 아래 코드에서는 원문이 필요 없기 때문에 합치기 위한 로직은 포함 되어 있지 않습니다


자 그럼 초성, 중성, 종성 알아봤고, 공식까지 확인했으니 구현만 하면 되겠습니다.

실제 구현한 코드는 아래 링크에서 확인 하시면 됩니다.


[소스코드 Repository]

https://github.com/HowookJeong/hanguel-jamo-analyzer


[사용방법]

public static void main(String args[]) {
String query = "Nike 청바지";
HanguelJamoMorphTokenizer tokenizer = HanguelJamoMorphTokenizer.getInstance();

String chosung = tokenizer.tokenizer(query, HanguelJamoType.CHOSUNG);
String jungsung = tokenizer.tokenizer(query, HanguelJamoType.JUNGSUNG);

String jongsung = tokenizer.tokenizer(query, HanguelJamoType.JONGSUNG);


System.out.println("원문 : [" + query + "]");
System.out.println("초성 : [" + chosung + "]");
System.out.println("중성 : [" + jungsung + "]");
System.out.println("종성 : [" + jongsung + "]");
}


[실행결과]

원문 : [Nike 청바지]

초성 : [Nikeㅊㅂㅈ]

중성 : [Nikeㅓㅏㅣ]

종성 : [Nikeㅇ]


이제 활용만 하면 될 것 같습니다.

어떻게?

그건 각 서비스 요구사항에 맞춰서 하셔야죠. ^^

: