오리지날 사전/ 코파스로부터의 파라미터 추정

$Id: learn.html 65 2007-01-30 00:52:53Z taku-ku $;

개요

학습용 코파스로부터 파라미터( 코스트치) (을)를 추정할 수 있습니다. MeCab 자신은 품사 체계에 비의존인 설계가 되어 있기 때문에, 독자적인 품사 체계, 사전, 코파스에 근거하는 해석기를 작성할 수 있습니다. 파라미터 추정에는 Conditinoal Random Fields (CRF) (을)를 사용하고 있습니다.

처리의 흐름

데이터 플로우도는 다음과 같이 됩니다.

파라미터 추정에는 이하의 서브 태스크가 있습니다.

각각 순서에 설명해 갈 것입니다.

Seed 사전의 준비

MeCab 의 사전은 CSV 그리고 기술됩니다. Seed 사전과 배포 사전의 포막 트는 기본적으로 동일합니다.

이하가 사전의 엔트리의 예입니다.


진학교,0,0,0,
명사,
일반,*,*,*,*,
진학교,
신가크코우,
신가크코

매화꽃,0,0,0,
명사,
일반,*,*,*,*,
매화꽃,
우메고요미,
우메고요미

기압,0,0,0,
명사,
일반,*,*,*,*,
기압,
키아트,
키아트

수중익선,0,0,0,
명사,
일반,*,*,*,*,
수중익선,
스이츄우요크센,
스이츄요크센

최초의4 컬럼눈까지는, 필수 항목으로,

되고 있습니다. 왼쪽 연접 상태 번호, 오른쪽 연접 상태 번호, 코스트는, Seed 사전에서는 사용되지 않기 때문에 0 (으)로 해둡니다.

5 컬럼눈 이후는 「태생」이라고 불리는 항목입니다. MeCab 하, 시스템의 범용성 (을)를 높이기 위해서, 「품사」 「활용」 「읽기」 「발음」이라고 한 「단어에 부여되어 정보」를 시스템은 구별하지 않고 「태생」으로서 취급하고 있습니다. 유저는 CSV 하지만 허락하는 한 몇개에서도 태생을 부여할 수 있습니다. 다만, 각 컬럼의 태생의 정의는 갖추어 둘 필요가 있습니다. (5 컬럼눈은 품사, 6 컬럼눈은 품사재분 종류등) 통상, 태생 번호의 젊은 것으로부터 순서에 일반적인 태생을 열거해 갈 것입니다. ( 례: 품사, 품사 세분류, 활용형, 활용형, 원형, 읽기, 발음)

태생은 내부적으로는 배열로서 다루어집니다. 0 번째의 태생, 1 번째의 태생.. (와)과 말하는 부르는 법으로 태생을 참조하는 일이 있습니다. 태생의 번호와 내부 표현( 품사, 독 봐 등) 하, 유저 자신이 관리해 주세요.

상기의 예는, ipadic 의 예입니다. 태생열로서

하지만 정의되고 있습니다.

MeCab (은)는 활용 처리를 실시하지 않습니다. 활용하는 말의 경우는, 유저가 사전에 활용 (을)를 전개할 필요가 있습니다.


데리고 나간다,0,0,0,
동사,
자립,*,*,
5단·사행,
기본형,
데리고 나간다,
트레다스,
트레다스

동반출이야,0,0,0,
동사,
자립,*,*,
5단·사행,
미연형,
데리고 나간다,
트레다사,
트레다사

동반출,0,0,0,
동사,
자립,*,*,
5단·사행,
미연우 접속,
데리고 나간다,
트레다소,
트레다소

데리고 나가,0,0,0,
동사,
자립,*,*,
5단·사행,
연용형,
데리고 나간다,
트레다시,
트레다시

데리고 나가라,0,0,0,
동사,
자립,*,*,
5단·사행,
가정형,
데리고 나간다,
트레다세,
트레다세

데리고 나가라,0,0,0,
동사,
자립,*,*,
5단·사행,
명령 e,
데리고 나간다,
트레다세,
트레다세

동반 내밀기,0,0,0,
동사,
자립,*,*,
5단·사행,
가정축약 1,
데리고 나간다,
트레다샤,
트레다샤

설정 파일의 준비

dicrc

사전의 다양한 동작을 지정하는 파일입니다. 이하가 최저한의 설정입니다.

cost-factor = 800
bos-feature = BOS/EOS,*,*,*,*,*,*,*,*
eval-size = 6
unk-eval-size = 4

char.def

미지어 처리의 정의 파일입니다. 통상 일본어의 형태소 해석에서는 자종에 근거하는 미지 말처리를 합니다. MeCab 그럼, 어느 문자를 어느 자종으로서 정의하는가 한 설 정을 세세하게 지정할 수 있습니다. 한층 더, 각 자종에 대해, 어떠한 미지어 처리를 실시할까 세세하게 지정할 수 있습니다.

파일의 최초로는, 카테고리명의 정의와, 각 카테고리의 미지어 처리의 동작 (을)를 정의합니다.


카테고리명      
동작 타이밍(0/1)  
그룹(0/1)  
길이(0,1, 2... n)

례

KANJI          0 0 2
SYMBOL         1 1 0
NUMERIC        1 1 0
ALPHA          1 1 0
HIRAGANA       0 1 2 

다음에, 각 카테고리가UCS2 의 코드 포인트의 어디에 해당하는지 정의합니다.

codepoint 
디폴트 카테고리명 
호환 카테고리명1  
호환 카테고리명2 .. 

혹은,

low_codepoint..high_codepoint 
디폴트 카테고리명 
호환 카테고리명1  
호환 카테고리명2 .. 

례

0x0009 SPACE
0x30A1..0x30FF  KATAKANA
0x30FC          KATAKANA HIRAGANA  # 
-

코드 포인트는 UCS2(Unicode) (을)를 0x (으)로부터 시작된다16 진수로 기술합니다.

최초의 카테고리는, 그 코드 포인트의 디폴트 카테고리입니다. 한층 더, 호환 카테고리를 열거할 수 있습니다. 상기의 예에서는, 장음 기호 「-」 하, 디폴트에서는 카타카나입니다만, 히라가나를 호환 카테고리로서 가집니다. 그룹 동작때에 호환 카테고리는 같은 그룹으로서 보입니다.

이하가 char.def 의 구체적인 예입니다.

DEFAULT        0 1 0  # DEFAULT is a mandatory category!
SPACE          0 1 0  
KANJI          0 0 2
SYMBOL         1 1 0
NUMERIC        1 1 0
ALPHA          1 1 0
HIRAGANA       0 1 2 
KATAKANA       1 1 0
KANJINUMERIC   1 1 0
GREEK          1 1 0
CYRILLIC       1 1 0

# SPACE
0x0020 SPACE  # DO NOT REMOVE THIS LINE,  0x0020 is reserved for SPACE
0x00D0 SPACE
0x0009 SPACE
0x000B SPACE
0x000A SPACE

# ASCII
0x0021..0x002F SYMBOL
0x0030..0x0039 NUMERIC

... 

# KATAKANA
0x30A1..0x30FF  KATAKANA
0x31F0..0x31FF  KATAKANA  # Small KU .. Small RO
0x30FC          KATAKANA HIRAGANA  # 
-

unk.def

미지어용의 사전입니다.

DEFAULT,0,0,0,
기호,
일반,*,*,*,*,*
SPACE,0,0,0,
기호,
공백,*,*,*,*,*
KANJI,0,0,0,
명사,
일반,*,*,*,*,*
KANJI,0,0,0,
명사,
사행 변격활용 접속,*,*,*,*,*
HIRAGANA,0,0,
명사,
일반,*,*,*,*,*
HIRAGANA,0,0,0,
명사,
사행 변격활용 접속,*,*,*,*,*
HIRAGANA,0,0,0,
명사,
고유 명사,
지역,
일반,*,*,*
... 

표층의 부분을 char.def 그리고 정의한 카테고리명으로 한 사전 파일입니다. 각 카테고리에 대해서 어떠한 소생렬을 부여하는지를 정의합니다. 1 개의 카테고리에 복수의 태생을 정의해도 괜찮습니다. 학습 후, 적절한 코스트치가 자동적으로 주어집니다.

rewrite.def

태생열로부터 내부 상태소생렬로 변환하는 매핑을 정의합니다.

CRF 하, unigram, 왼쪽 문맥 bigram, 우문맥 bigram 의3 정보를 사용해 통계 정보를 합계 헤아립니다. 예를 들면 이하의 「아름다운 강」이라고 하는 이하의 예에서는, 사전에 정의되고 있는 태생으로부터 unigram 태생, 왼쪽 문맥 태생( 그 형태소를 좌측에서 보았을 때의 태생), 우문맥태생( 그 형태소를 좌측에서 보았을 때의 태생) 의3 개가 사용됩니다. rewrite.def 하, 사전의 태생으로부터 각각의 내부 태생에의 매핑을 정의합니다.

구체적으로 이하와 같은 일이 매핑 함수를 적절히 정의하는 것으로 실현될 수 있습니다.

rewrite.def 에는 3 개의 섹션이 있습니다.

각각의 섹션의 뒤에, 1 행에1 개의 매핑 룰이 계속 됩니다. 매핑 룰은


매치 패턴  
변환처
그렇다고 하는 형식에서 기술합니다. 매핑 룰은 선두로부터 순서에 주사 되어 최초로 매치한 것이 사용됩니다.

매치 패턴에서는 간단한 정규 표현이를 사용할 수 있습니다.

변환처는 $1 $2, $3.. 그렇다고 하는 매크로를 사용해 태생의 각 요소 (CSV 그리고 기록된 요소) 의 내용을 참조할 수 있습니다.

례

[unigram rewrite]
# 
읽기,
발음을 제거해, 
품사1,2,3,4,
활용형,
활용형,
원형,
읽어 
(을)를 사용한다
*,*,*,*,*,*,*,*  $1,$2,$3,$4,$5,$6,$7,$8
# 
읽기가 없는 경우는 무시
*,*,*,*,*,*,*    $1,$2,$3,$4,$5,$6,$7,*

[left rewrite]
(
조사|
조동사),*,*,*,*,*,(
없다|
없다)    $1,$2,$3,$4,$5,$6,
없다
(
조사|
조동사),
종조사,*,*,*,*,(
|
요)   $1,$2,$3,$4,$5,$6,

...

[right rewrite]
(
조사|
조동사),*,*,*,*,*,(
없다|
없다)    $1,$2,$3,$4,$5,$6,
없다
(
조사|
조동사),
종조사,*,*,*,*,(
|
요)   $1,$2,$3,$4,$5,$6,

..

feature.def

내부 상태의 소생렬로부터 CRF 의 소생렬을 추출하기 위한 템플릿을 정의한 파일입니다

각 행이 1 템플릿에 대응합니다. UNIGRAM 그럼 글자 만의 것은 UNIGRAM 용 의 템플릿, BIGRAM 그럼 글자 만의 것은 연접용의 템플릿입니다.

각 템플릿에서는, 이하의 매크로를 사용할 수 있습니다

례

UNIGRAM W0:%F[6]
UNIGRAM W1:%F[0]/%F[6]
UNIGRAM W2:%F[0],%F?[1]/%F[6]
UNIGRAM W3:%F[0],%F[1],%F?[2]/%F[6]
UNIGRAM W4:%F[0],%F[1],%F[2],%F?[3]/%F[6]

UNIGRAM T0:%t
UNIGRAM T1:%F[0]/%t
UNIGRAM T2:%F[0],%F?[1]/%t
UNIGRAM T3:%F[0],%F[1],%F?[2]/%t
UNIGRAM T4:%F[0],%F[1],%F[2],%F?[3]/%t

BIGRAM B00:%L[0]/%R[0]
BIGRAM B01:%L[0],%L?[1]/%R[0]
BIGRAM B02:%L[0]/%R[0],%R?[1]
BIGRAM B03:%L[0]/%R[0],%R[1],%R?[2]
BIGRAM B04:%L[0],%L?[1]/%R[0],%R[1],%R?[2]
BIGRAM B05:%L[0]/%R[0],%R[1],%R[2],%R?[3]
BIGRAM B06:%L[0],%L?[1]/%R[0],%R[1],%R[2],%R?[3]
... 

학습용 코파스의 준비

학습 데이터는, MeCab 의 디폴트 출력과 동일 포맷으로 기술합니다.


타로    
명사,
고유 명사,
인명,
명,*,*,
타로,
타로,
타로

하      
조사,
계조사,*,*,*,*,
하,
하,
와

하나꼬    
명사,
고유 명사,
인명,
명,*,*,
하나꼬,
하나코,
하나코

하지만      
조사,
격조사,
일반,*,*,*, 
하지만,
가,
가

좋아    
명사,
형용동사 어간,*,*,*,*, 
좋아,
빈틈,
빈틈

(이)다      
조동사,*,*,*, 
특수·다,
기본형,
(이)다,
다,
다
.       
기호,
구두점,*,*,*,*, . , . , . 
EOS

소주    
명사,
일반,*,*,*,*,
소주,
쇼우츄우,
쇼 츄-

좋아    
명사,
형용동사 어간,*,*,*,*,
좋아,
빈틈,
빈틈

의      
조사,
연체화,*,*,*,*, 
의,
노,
노

아버지    
명사,
일반,*,*,*,*,
아버지,
아버지,
아버지
.       
기호,
구두점,*,*,*,*, . , . , . 
EOS
... 

탭으로 단락지어진 최초의 부분이 표층 문자입니다. 다음에 태생 배열을 CSV 그리고 표현한 문장 자렬이 계속 됩니다. 문장의 단락에는 EOS 만의 행을 둡니다.

학습용 바이너리 사전의 작성

현재의 작업 디렉토리를 WORK (으)로 합니다. WORK 이하에 seed (와)과 final (와)과 말하는 두 개의 디렉토리를 만들어 주세요.

cd $WORK
mkdir seed final

seed 디렉토리에 조금 전 설명한 이하의 파일을 카피합니다.

례

% cd $WORK/seed
% ls 
Adj.csv          Interjection.csv   Noun.name.csv    Noun.verbal.csv  Symbol.csv        rewrite.def
Adnominal.csv    Noun.adjv.csv      Noun.number.csv  Others.csv       Verb.csv          unk.def
Adverb.csv       Noun.adverbal.csv  Noun.org.csv     Postp-col.csv    char.def
Auxil.csv        Noun.csv           Noun.others.csv  Postp.csv        corpus
Conjunction.csv  Noun.demonst.csv   Noun.place.csv   Prefix.csv       dicrc
Filler.csv       Noun.nai.csv       Noun.proper.csv  Suffix.csv       feature.def

이하의 커멘드를 실행해, 학습용 바이너리 사전을 작성합니다.

% cd $WORK/seed
% /usr/local/libexec/mecab/mecab-dict-index


이하와 같이 -d,  -o 
(을)를 사용할 수도 있습니다. 
% /usr/local/libexec/mecab/mecab-dict-index -d $WORK/seed -o $WORK/seed

CRF 파라미터의 학습

% cd $WORK/seed
% /usr/local/libexec/mecab/mecab-cost-train -c 1.0 corpus model


이하와 같이 -d 
(을)를 사용해 사전을 지정할 수도 있습니다<
% /usr/local/libexec/mecab/mecab-cost-train -d $WORK/seed -c 1.0 $WORK/seed/corpus $WORK/seed/model

mecab-cost-train (은)는 바이너리 모델의 작성때에 대량의 메모리를 소비합니다. 이하와 같이 바이너리 모델의 작성을 별프로세스로 실시하는 것으로 메모리 소비를 억제할 수 있습니다.

% /usr/local/libexec/mecab/mecab-cost-train -y -c 1.0 corpus model
% /usr/local/libexec/mecab/mecab-cost-train -b model.txt model

하이퍼 파라미터C 하, 학습의 「힘」을 결정합니다. C (을)를 크게 하면, 학습 데이터로 할 수 있을 뿐(만큼) 피트하려고 합니다만, 과학습할 가능성이 있습니다. 작게 하면, 과학습을 피하려고 합니다만, 충분한 학습을 할 수 없을 가능성이 있습니다. 적절한 C 하, 교차 검정등의 모델 선택 수법으로 발견적으로 찾아낼 수 밖에 없습니다. 디폴트의 값은 1. 0 되고 있습니다.

-f 옵션에 의해서 태생 빈도의 반응을 일으키는 최소의 물리량을 지정할 수 있습니다. 예를 들면, -f 3 (으)로 하면, 학습 데이터중에3 회이상 출현한 태생만을 사용합니다. 적절한 태생 반응을 일으키는 최소의 물리량은, 교차 검정등의 모델 선택 수법으로 발견적으로 찾아낼 수 밖에 없습니다.

학습중, 이하와 같은 정보가 출력됩니다.

reading corpus ... adding virtual node: 
명사,
고유 명사,
지역,
일반,*,*,
동일,
트우니치,
트우니치
adding virtual node: 
부사,
조사류 접속,*,*,*,*,
꽤,
카나리,
카나리

Number of sentences: 32
Number of features:  47547
eta:                 0.00010
freq:                1
C(sigma^2):          1.00000

iter=0 err=1.00000 F=0.41186 target=1691.68869 diff=1.00000
iter=1 err=1.00000 F=0.68727 target=1077.14848 diff=0.36327
iter=2 err=0.87500 F=0.81904 target=621.20311 diff=0.42329
iter=3 err=0.81250 F=0.86354 target=384.72432 diff=0.38068
iter=4 err=0.68750 F=0.93685 target=233.72722 diff=0.39248
..

배포용 사전의 작성

% cd $WORK/seed
% /usr/local/libexec/mecab/mecab-dict-gen -o ../final -m model


이하와 같이 -d,  -o 
(을)를 사용해 사전을 지정할 수도 있습니다
% /usr/local/libexec/mecab/mecab-dict-gen -o $WORK/final -d $WORK/seed -m $WORK/seed/model

배포용 사전은, seed 사전과 다른 디렉토리에 출력하지 않으면 안됩니다. 통상, 배포 사전 디렉토리 final (을)를 어카이브(archive) 해 유저에게 배포합니다.

해석용 바이너리 사전의 작성

% cd $WORK/final
% /usr/local/libexec/mecab/mecab-dict-index 


이하와 같이 -d,  -o 
(을)를 사용할 수도 있습니다. 
% /usr/local/libexec/mecab/mecab-dict-index -d $WORK/final -o $WORK/final

지금 만든 사전을 사용해 실제로 해석해 보겠습니다.

% mecab -d $WORK/final

소주 좋아하는 아버지. 

소주    
명사,
일반,*,*,*,*,
소주,
쇼우츄우,
쇼 츄-

좋아    
명사,
형용동사 어간,*,*,*,*,
좋아, 
빈틈, 
빈틈

의      
조사,
연체화,*,*,*,*,
의,
노,
노

아버지    
명사,
일반,*,*,*,*,
아버지, 
아버지, 
아버지
.       
기호,
구두점,*,*,*,*,.,.,. 
EOS

평가

테스트 데이터를 준비합니다. 테스트 데이터는 MeCab 의 디폴트 출력과 동일 포맷으로 기술합니다.

우선, mecab-test-gen (을)를 사용해 테스트코파스(test) (으)로부터, 문장만(test.sen) (을)를 추출합니다.

% /usr/local/libexec/mecab/mecab-test-gen < test > test.sen

test.sen (을)를 조금 전 만든 사전으로 해석합니다.

% mecab -d $WORK/final test.sen > test.result

평가 스크립트 mecab-system-eval (을)를 실행합니다. 제일 인수가 시스템의 결과, 제2 인수가 정답의 파일입니다.

% /usr/local/libexec/mecab/mecab-system-eval test.result test
                    precision          recall              F
LEVEL 0:    98.6887(647112/655710) 98.9793(647112/653785) 98.8338
LEVEL 1:    98.2163(644014/655710) 98.5055(644014/653785) 98.3607
LEVEL 2:    97.2230(637501/655710) 97.5093(637501/653785) 97.3659
LEVEL 4:    96.8367(634968/655710) 97.1218(634968/653785) 96.9791

-l 옵션에 의해서, 어느 태생의 레벨을 사용해 평가할까 지정할 수 있습니다.


$Id: learn.html 65 2007-01-30 00:52:53Z taku-ku $;