'2017/06'에 해당되는 글 5건

  1. 2017.06.23 [Arirang] 사전 기반으로만 형태소 분석 처리 해보기
  2. 2017.06.14 [ASCII] HTML URL Encoding Reference
  3. 2017.06.09 [Arirang Analyzer - lucene 6.5.0] Term startOffset 정렬 오류
  4. 2017.06.09 [Arirang] first position increment must be > 0 오류
  5. 2017.06.08 [Elasticsearch] 각 노드별 meta 정보 저장 관련.

[Arirang] 사전 기반으로만 형태소 분석 처리 해보기

ITWeb/검색일반 2017. 6. 23. 13:51

그냥 사전만 가지고 몇 가지 형태소 분석 처리를 하기 위한 팁 정보 입니다.

한마디로 노가다 입니다.

모든 부분에 공통적으로 적용 되는 것은 아니며 사용 형태에 따라 수정 하셔야 하는 부분이니 그냥 참고 정도만 하자라고 생각해 주세요.


공통)

- 복합명사 분해 시 분해 된 단어가 용언일 경우 복합명사를 사용하지 말고 확장사전에 등록해서 사용을 합니다.

  또는 분해 된 단어가 용언일 경우 찾아서 체언 처리를 해줍니다.

- 체언과 기타품사 차이는 체언은 단독으로 사용 시 형태소 분석이 되지만 기타품사는 분석 되지 않습니다.


  복합명사)

    그리는게:그리는,게:0000


  확장사전)

    그리,100000000X

    그리는게,100000000X


  분해)

    그리는게

      그리는게

    그리는

      그리


'그리는' 자체를 체언으로 분해 하고 싶을 경우 확장 사전에 체언으로 등록이 되어야 하며, 그리에 대한 용언도 동일하게 체언처리가 되어야 합니다.



- '~요', '~해요' 로 끝나는 용언 처리

  좋아요

  좋아해요


  확장사전)

    좋아,100000000X

    좋아해,100000000X



- '~져', '~져서', '~서' 로 끝나는 용언 처리

  기존 용언으로 등록된 단어를 체언으로 변경 해야 합니다.

  010000000X -> 100000000X

  '~서' 의 경우 사전에 '서,110000000X' 와 같이 등록이 되어 있어 복합명사 사전에 추가 등록을 합니다.

  복합명사 등록 시 분해된 명사에 대한 확장사전 등록이 되어 있어야 합니다.


  확장사전)

    어두워지,100000000X

    어두워,100000000X

    늘어지,100000000X

    늘어져,100000000X


  복합명사)

    어두워서:어두워서,어두워:0000

    어두워져:어두워져,어두워:0000

    어두워져서:어두워져서,어두워:0000

    늘어져서:늘어져서,늘어져:0000



- 복합용언 + '~요' 로 끝나는 용언 처리

  크고낮아요

  말려들어요


  복합명사)

    크고낮아:크고,낮아:0000

    말려들어:말려,들어:0000



- '~다', '~데' 로 끝나는 용언 처리

  크다

  작다

  큰데

  작은데

  '~다' 끝나는 용언이 형태소분리가 되기 위해서는 확장사전에 등록이 되어야 합니다.


  확장사전)

    크다,100000000X

    작다,100000000X

    큰데,100000000X

    작은데,100000000X

  


- '~ㄴ', '~은', '~는' 으로 끝나는 용언 처리

  짧은

  넒은

  튀어나온

  어울리는

    어울리,010000000X 용언 처리가 되어 있기 때문에 체언으로 fully 등록 합니다.

  잃어가는


  확장사전)

    짧은,100000000X

    넓은,100000000X

    튀어나온,100000000X

    잃어가는,100000000X

    어울리는,100000000X



- 'ㅎ' 불규칙 용언 처리

  노랗고

  동그랗고


  확장사전)

    노랗,100000000X


  복합명사)

    노랗고:노랗고,노랗:0000


- '~하', '~한' 으로 끝나는 용언 처리

  확장사전에 용언 처리가 되어 있는지 확인 합니다.

  용언 처리가 되어 있다면 체언으로 변경해 줍니다.

  확장사전에 ~하, ~한 을 제외 및 하다 동사 표기를 포함한 체언으로 등록 합니다.


  확장사전 1)

    넓적하,010000000X -> 100000000X

    넓적,100100000X

:

[ASCII] HTML URL Encoding Reference

ITWeb/개발일반 2017. 6. 14. 17:47

가끔 찾을 때가 있는데 기억을 못해 스크랩 해봤습니다.


원문)


https://www.w3schools.com/tags/ref_urlencode.asp



ASCII Encoding Reference

Your browser will encode input, according to the character-set used in your page.

The default character-set in HTML5 is UTF-8.


Character

From Windows-1252

From UTF-8

space

%20

%20

!

%21

%21

"

%22

%22

#

%23

%23

$

%24

%24

%

%25

%25

&

%26

%26

'

%27

%27

(

%28

%28

)

%29

%29

*

%2A

%2A

+

%2B

%2B

,

%2C

%2C

-

%2D

%2D

.

%2E

%2E

/

%2F

%2F

0

%30

%30

1

%31

%31

2

%32

%32

3

%33

%33

4

%34

%34

5

%35

%35

6

%36

%36

7

%37

%37

8

%38

%38

9

%39

%39

:

%3A

%3A

;

%3B

%3B

< 

%3C

%3C

=

%3D

%3D

> 

%3E

%3E

?

%3F

%3F

@

%40

%40

A

%41

%41

B

%42

%42

C

%43

%43

D

%44

%44

E

%45

%45

F

%46

%46

G

%47

%47

H

%48

%48

I

%49

%49

J

%4A

%4A

K

%4B

%4B

L

%4C

%4C

M

%4D

%4D

N

%4E

%4E

O

%4F

%4F

P

%50

%50

Q

%51

%51

R

%52

%52

S

%53

%53

T

%54

%54

U

%55

%55

V

%56

%56

W

%57

%57

X

%58

%58

Y

%59

%59

Z

%5A

%5A

[

%5B

%5B

\

%5C

%5C

]

%5D

%5D

^

%5E

%5E

_

%5F

%5F

`

%60

%60

a

%61

%61

b

%62

%62

c

%63

%63

d

%64

%64

e

%65

%65

f

%66

%66

g

%67

%67

h

%68

%68

i

%69

%69

j

%6A

%6A

k

%6B

%6B

l

%6C

%6C

m

%6D

%6D

n

%6E

%6E

o

%6F

%6F

p

%70

%70

q

%71

%71

r

%72

%72

s

%73

%73

t

%74

%74

u

%75

%75

v

%76

%76

w

%77

%77

x

%78

%78

y

%79

%79

z

%7A

%7A

{

%7B

%7B

|

%7C

%7C

}

%7D

%7D

~

%7E

%7E

 

%7F

%7F

`

%80

%E2%82%AC



%81

%81

%82

%E2%80%9A

ƒ

%83

%C6%92

%84

%E2%80%9E

%85

%E2%80%A6

%86

%E2%80%A0

%87

%E2%80%A1

ˆ

%88

%CB%86

%89

%E2%80%B0

Š

%8A

%C5%A0

%8B

%E2%80%B9

Œ

%8C

%C5%92



%8D

%C5%8D

Ž

%8E

%C5%BD



%8F

%8F



%90

%C2%90

%91

%E2%80%98

%92

%E2%80%99

%93

%E2%80%9C

%94

%E2%80%9D

%95

%E2%80%A2

%96

%E2%80%93

%97

%E2%80%94

˜

%98

%CB%9C

%99

%E2%84

š

%9A

%C5%A1

%9B

%E2%80

œ

%9C

%C5%93



%9D

%9D

ž

%9E

%C5%BE

Ÿ

%9F

%C5%B8

 

%A0

%C2%A0

¡

%A1

%C2%A1

¢

%A2

%C2%A2

£

%A3

%C2%A3

¤

%A4

%C2%A4

¥

%A5

%C2%A5

¦

%A6

%C2%A6

§

%A7

%C2%A7

¨

%A8

%C2%A8

©

%A9

%C2%A9

ª

%AA

%C2%AA

«

%AB

%C2%AB

¬

%AC

%C2%AC

%AD

%C2%AD

®

%AE

%C2%AE

¯

%AF

%C2%AF

°

%B0

%C2%B0

±

%B1

%C2%B1

²

%B2

%C2%B2

³

%B3

%C2%B3

´

%B4

%C2%B4

µ

%B5

%C2%B5

%B6

%C2%B6

·

%B7

%C2%B7

¸

%B8

%C2%B8

¹

%B9

%C2%B9

º

%BA

%C2%BA

»

%BB

%C2%BB

¼

%BC

%C2%BC

½

%BD

%C2%BD

¾

%BE

%C2%BE

¿

%BF

%C2%BF

À

%C0

%C3%80

Á

%C1

%C3%81

Â

%C2

%C3%82

Ã

%C3

%C3%83

Ä

%C4

%C3%84

Å

%C5

%C3%85

Æ

%C6

%C3%86

Ç

%C7

%C3%87

È

%C8

%C3%88

É

%C9

%C3%89

Ê

%CA

%C3%8A

Ë

%CB

%C3%8B

Ì

%CC

%C3%8C

Í

%CD

%C3%8D

Î

%CE

%C3%8E

Ï

%CF

%C3%8F

Ð

%D0

%C3%90

Ñ

%D1

%C3%91

Ò

%D2

%C3%92

Ó

%D3

%C3%93

Ô

%D4

%C3%94

Õ

%D5

%C3%95

Ö

%D6

%C3%96

×

%D7

%C3%97

Ø

%D8

%C3%98

Ù

%D9

%C3%99

Ú

%DA

%C3%9A

Û

%DB

%C3%9B

Ü

%DC

%C3%9C

Ý

%DD

%C3%9D

Þ

%DE

%C3%9E

ß

%DF

%C3%9F

à

%E0

%C3%A0

á

%E1

%C3%A1

â

%E2

%C3%A2

ã

%E3

%C3%A3

ä

%E4

%C3%A4

å

%E5

%C3%A5

æ

%E6

%C3%A6

ç

%E7

%C3%A7

è

%E8

%C3%A8

é

%E9

%C3%A9

ê

%EA

%C3%AA

ë

%EB

%C3%AB

ì

%EC

%C3%AC

í

%ED

%C3%AD

î

%EE

%C3%AE

ï

%EF

%C3%AF

ð

%F0

%C3%B0

ñ

%F1

%C3%B1

ò

%F2

%C3%B2

ó

%F3

%C3%B3

ô

%F4

%C3%B4

õ

%F5

%C3%B5

ö

%F6

%C3%B6

÷

%F7

%C3%B7

ø

%F8

%C3%B8

ù

%F9

%C3%B9

ú

%FA

%C3%BA

û

%FB

%C3%BB

ü

%FC

%C3%BC

ý

%FD

%C3%BD

þ

%FE

%C3%BE

ÿ

%FF

%C3%BF


URL Encoding Reference

The ASCII control characters %00-%1F were originally designed to control hardware devices.

Control characters have nothing to do inside a URL.

ASCII Character

Description

URL-encoding

NUL

null character

%00

SOH

start of header

%01

STX

start of text

%02

ETX

end of text

%03

EOT

end of transmission

%04

ENQ

enquiry

%05

ACK

acknowledge

%06

BEL

bell (ring)

%07

BS

backspace

%08

HT

horizontal tab

%09

LF

line feed

%0A

VT

vertical tab

%0B

FF

form feed

%0C

CR

carriage return

%0D

SO

shift out

%0E

SI

shift in

%0F

DLE

data link escape

%10

DC1

device control 1

%11

DC2

device control 2

%12

DC3

device control 3

%13

DC4

device control 4

%14

NAK

negative acknowledge

%15

SYN

synchronize

%16

ETB

end transmission block

%17

CAN

cancel

%18

EM

end of medium

%19

SUB

substitute

%1A

ESC

escape

%1B

FS

file separator

%1C

GS

group separator

%1D

RS

record separator

%1E

US

unit separator

%1F



:

[Arirang Analyzer - lucene 6.5.0] Term startOffset 정렬 오류

ITWeb/검색일반 2017. 6. 9. 10:23

[arirang-analyzer-6.5.0]

  term analyzed 시 startOffset 정보에 대한 정렬이 역전 되는 오류

  개별 term 에서의 startOffset 이 역전 되기 때문에 아래 class 의 method 에서 정렬을 다시 맞춰줍니다.

  (정상적인 방법 이라기 보다는 일단 문제를 회피하기 위한 방법 입니다.)


  Class : KoreanFilter

  Method 1 :

    private void analysisKorean(String input) throws MorphException {


  //  input = trimHangul(input);

      List<AnalysisOutput> outputs = morph.analyze(input);

      if (outputs.size() == 0) {

        return;

      }


      Map<String, KoreanToken> map = new LinkedHashMap<String, KoreanToken>();

      if (hasOrigin) {

        map.put("0:" + input, new KoreanToken(input, offsetAtt.startOffset()));

      }


      extractKeyword(outputs, offsetAtt.startOffset(), map, 0);


      Collection<KoreanToken> values = map.values();

      for (KoreanToken kt : values) {

        kt.setOutputs(outputs);

      }


      // 이 부분에서 map 에 등록된 정보를 정렬 합니다.


      morphQueue.addAll(map.values());

    }


  Method 2 :

    private void analysisKorean(String input) throws MorphException {


  //  input = trimHangul(input);

      List<AnalysisOutput> outputs = morph.analyze(input);

      if (outputs.size() == 0) {

        return;

      }


      Map<String, KoreanToken> map = new LinkedHashMap<String, KoreanToken>();

      if (hasOrigin) {

        map.put("0:" + input, new KoreanToken(input, offsetAtt.startOffset()));

      }


      extractKeyword(outputs, offsetAtt.startOffset(), map, 0);


      Collection<KoreanToken> values = map.values();

      for (KoreanToken kt : values) {

        kt.setOutputs(outputs);

      }


      morphQueue.addAll(map.values());

      // 이 부분에서 morphQueue 에 등록된 정보를 정렬 합니다.

      morphQueue.sort(Comparator.comparingInt(KoreanToken::getOffset));

    }


  Method 3 : 

    protected void extractKeyword(List<AnalysisOutput> outputs, int startoffset,

      final Map<String, KoreanToken> map, int position) {

      ... 원본 코드 생략


      // 이 부분에서 map 에 대한 등록된 정보를 정렬 합니다.

    }


  정렬 방법 :

    참고) https://stackoverflow.com/questions/109383/sort-a-mapkey-value-by-values-java


    final List<Map.Entry<String, KoreanToken>> offsetSorts = map.entrySet().stream()

        .sorted(Map.Entry.comparingByValue(Comparator.comparingInt(KoreanToken::getOffset)))

        .collect(Collectors.toList());


    map.clear();


    offsetSorts.stream().forEachOrdered(e -> map.put(e.getKey(), e.getValue()));


  Method 4 :

    KoreanFilter 를 상속받아 CustomKoreanFilter 를 만들어 사용 하면 됩니다.


:

[Arirang] first position increment must be > 0 오류

ITWeb/검색일반 2017. 6. 9. 10:22

아직 확인 및 테스트 하지 않았습니다. ^^;

그냥 코드만 보고 이렇게 하면 되겠다 정도만 입니다.


- DefaultIndexingChain.java

first position increment must be > 0


관련 에러 수정을 위해서는 KoreanFilter.java 내 posIncrAtt.setPositionIncrement(iw.getPosInc()); 영역에서 

iw.getPosInc() 가 -1 인지 검사해서 1로 변경을 해줍니다.

변경에 따른 오류에 대해서 검토가 필요 합니다.


  private void setAttributesFromQueue(boolean isFirst) {

    final KoreanToken iw = morphQueue.removeFirst();

    if (isFirst && !morphQueue.isEmpty()) {

      // our queue has more elements remaining (e.g. we decompounded)

      // capture state for those. We set the term attribute to be empty

      // so we save lots of array copying later.

      termAtt.setEmpty();

      currentState = captureState();

    }

 

    termAtt.setEmpty().append(iw.getTerm());

    offsetAtt.setOffset(iw.getOffset(), iw.getOffset() + iw.getLength());

    morphAtt.setToken(iw);


    // on the first Token we preserve incoming increment:

    if (!isFirst) {

      posIncrAtt.setPositionIncrement(iw.getPosInc());

    }

    

    String type = TokenUtilities.getType(iw.getTerm().toCharArray(), iw.getTerm().length());

    typeAtt.setType(type);

    

    // TODO: How to handle PositionLengthAttribute correctly?

  }



:

[Elasticsearch] 각 노드별 meta 정보 저장 관련.

Elastic/Elasticsearch 2017. 6. 8. 10:12

master, data 노드에는 기본적으로 모든 index 들의 settings, mappings 정보를 가지고 있습니다.

search  노드만 index 에 대한 meta 정보를 가지고 있지 않습니다.

어떻게 보면 당연한 건데 확인 하지 않으면 실수 할 수 있는 내용이라 그냥 기록해 봅니다.


master 노드는 모드 node 와 index 에 대한 관리를 하기 때문에 당연히 정보를 가지고 있어야 합니다.

data 노드는 물리적인 index, shard 를 저장하고 있기 때문에 역시 정보를 가지고 있을 수 밖에 없습니다.

search 노드는 coordinator 역할과 질의 결과에 대한 merge 등의 역할을 하고 있어 물리적으로 정보를 가지고 있지는 않지만 필요 시 master node 로 정보를 요청 할 수는 있습니다.

: