소개
Rakuten MA(형태소 분석기)는 순수 JavaScript로 작성된 중국어 및 일본어용 형태소 분석기(단어 분할기 + PoS Tagger)입니다.
라쿠텐 MA에는 다음과 같은 고유한 기능이 있습니다.
- 순수 JavaScript 구현으로 최신 브라우저와 node.js에서 모두 작동합니다.
- 언어 독립적인 문자 태깅 모델을 구현하고 중국어/일본어에 대한 단어 분할 및 PoS 태그를 출력합니다.
- 온라인 학습을 통해 모델의 증분 업데이트를 지원합니다(Soft Confidence Weighted, Wang et al. ICML 2012).
- 사용자 정의 가능한 기능 세트.
- 컴팩트한 모델 표현을 위해 기능 해싱, 양자화 및 가지치기를 지원합니다.
- 일반 말뭉치(CTB [Xue et al. 2005] 및 BCCWJ [Maekawa 2008]) 및 전자상거래 말뭉치에서 훈련된 중국 및 일본 모델이 번들로 제공됩니다.
데모
데모 페이지 에서 라쿠텐 MA를 체험해 보실 수 있습니다 .(이 페이지를 로드하는 데 시간이 걸릴 수 있습니다.)
용법
Download & Install
Rakuten MA는 JavaScript 라이브러리이므로 설치할 필요가 없습니다. git 저장소를 다음과 같이 복제하세요.
1git clone https://github.com/rakuten-nlp/rakutenma.git
또는 여기에서 zip 아카이브를 다운로드하세요: https://github.com/rakuten-nlp/rakutenma/archive/master.zip
Node.js가 설치되어 있는 경우 다음을 통해 데모를 실행할 수 있습니다.
1node demo.js
이는 아래 사용 예와 동일합니다.
npm package
Rakuten MA를 npm 패키지로 사용할 수도 있습니다. 다음 방법으로 설치할 수 있습니다.
1npm install rakutenma
모델 파일은 아래에서 찾을 수 있습니다 node_modules/rakutenma/
.
Usage Example (on Node.js)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52// RakutenMA demo
// Load necessary libraries
var RakutenMA = require('./rakutenma');
var fs = require('fs');
// Initialize a RakutenMA instance
// with an empty model and the default ja feature set
var rma = new RakutenMA();
rma.featset = RakutenMA.default_featset_ja;
// Let's analyze a sample sentence (from http://tatoeba.org/jpn/sentences/show/103809)
// With a disastrous result, since the model is empty!
console.log(rma.tokenize("彼は新しい仕事できっと成功するだろう。"));
// Feed the model with ten sample sentences from tatoeba.com
var tatoeba = JSON.parse(fs.readFileSync("tatoeba.json"));
for (var i = 0; i < 10; i ++) {
rma.train_one(tatoeba[i]);
}
// Now what does the result look like?
console.log(rma.tokenize("彼は新しい仕事できっと成功するだろう。"));
// Initialize a RakutenMA instance with a pre-trained model
var model = JSON.parse(fs.readFileSync("model_ja.json"));
rma = new RakutenMA(model, 1024, 0.007812); // Specify hyperparameter for SCW (for demonstration purpose)
rma.featset = RakutenMA.default_featset_ja;
// Set the feature hash function (15bit)
rma.hash_func = RakutenMA.create_hash_func(15);
// Tokenize one sample sentence
console.log(rma.tokenize("うらにわにはにわにわとりがいる"));
// Re-train the model feeding the right answer (pairs of [token, PoS tag])
var res = rma.train_one(
[["うらにわ","N-nc"],
["に","P-k"],
["は","P-rj"],
["にわ","N-n"],
["にわとり","N-nc"],
["が","P-k"],
["いる","V-c"]]);
// The result of train_one contains:
// sys: the system output (using the current model)
// ans: answer fed by the user
// update: whether the model was updated
console.log(res);
// Now what does the result look like?
console.log(rma.tokenize("うらにわにはにわにわとりがいる"));
Usage Example (on browsers)
<head>
HTML에 다음 코드 조각을 포함합니다 .
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19<script type="text/javascript" src="rakutenma.js" charset="UTF-8"></script>
<script type="text/javascript" src="model_ja.js" charset="UTF-8"></script>
<script type="text/javascript" src="hanzenkaku.js" charset="UTF-8"></script>
<script type="text/javascript" charset="UTF-8">
function Segment() {
rma = new RakutenMA(model);
rma.featset = RakutenMA.default_featset_ja;
rma.hash_func = RakutenMA.create_hash_func(15);
var textarea = document.getElementById("input");
var result = document.getElementById("output");
var tokens = rma.tokenize(HanZenKaku.hs2fs(HanZenKaku.hw2fw(HanZenKaku.h2z(textarea.value))));
result.style.display = 'block';
result.innerHTML = RakutenMA.tokens2string(tokens);
}
</script>
분석 및 결과는 다음과 같습니다.
1
2
3<textarea id="input" cols="80" rows="5"></textarea>
<input type="submit" value="Analyze" onclick="Segment()">
<div id="output"></div>
Using bundled models to analyze Chinese/Japanese sentences
- 기존 모델을 로드합니다. 예:
model = JSON.parse(fs.readFileSync("model_file"));
thenrma = new RakutenMA(model);
또는rma.set_model(model);
featset
언어에 따라 지정하십시오 (예:rma.featset = RakutenMA.default_featset_zh;
중국어,rma.featset = RakutenMA.default_featset_ja;
일본어).rma.hash_func = RakutenMA.create_hash_func(15);
번들 모델(model_zh.json
및 )을 사용할 때는 15비트 기능 해싱 함수( )를 사용해야 합니다model_ja.json
.rma.tokenize(input)
입력을 분석하는 데 사용합니다 .
Training your own analysis model from scratch
- 훈련 코퍼스(문장이 올바른 [토큰, PoS 태그]의 배열인 훈련 문장 세트)를 준비하세요.
- 를 사용하여 RakutenMA 인스턴스를 초기화합니다
new RakutenMA()
. featset
.(및 선택적으로ctype_func
,hash_func
등)을 지정합니다.- 훈련 문장을 하나씩(첫 번째부터 마지막까지)
train_one(sent)
메서드에 입력하세요. epoch
일반적으로 SCW는 한 번 (전체 훈련 자료를 한 번 통과한 후) 충분히 수렴 하지만 더 나은 성능을 얻으려면 4단계를 반복할 수 있습니다.
자신만의 모델을 학습시키는 방법을 보여주는 예를 보려면 scripts/train_zh.js
(중국어의 경우) 및 (일본어의 경우)를 참조하세요 .scripts/train_ja.js
Re-training an existing model (domain adaptation, fixing errors, etc.)
- 기존 모델을 로드하고 RakutenMA 인스턴스를 초기화합니다.(위의 "번들 모델을 사용하여 중국어/일본어 문장 분석" 참조)
- 훈련 데이터를 준비합니다. ("재훈련"하려는 내용과 정도에 따라 몇 문장이면 충분합니다.)
- 훈련 문장을 하나씩
train_one(sent)
메소드에 입력하세요.
Reducing the model size
모델 크기는 기능 해싱을 적용한 후에도 클라이언트 측 배포에 여전히 문제가 될 수 있습니다. scripts/minify.js
훈련된 모델 크기를 줄이기 위해 기능 양자화를 적용하는 스크립트(자세한 내용은 [Hagiwara 및 Sekine COLING 2014] 참조)를 포함했습니다.
이를 실행하여 node scripts/minify.js [input_model_file] [output_model_file]
모델 파일의 축소된 버전을 만들 수 있습니다.
기억하세요: 훈련된 모델의 "시그마" 부분도 삭제되므로 더 이상 축소된 모델을 재훈련할 수 없습니다. 필요한 경우 재훈련하세요. 먼저 모델을 만든 다음 축소하세요.
API 문서
건설자 | 설명 |
---|---|
RakutenMA(model, phi, c) |
새 RakutenMA 인스턴스를 생성합니다. model (선택 사항)은 RakutenMA 인스턴스를 초기화할 모델 개체를 지정합니다. phi ( c 둘 다 선택 사항)은 SCW의 하이퍼 매개 변수입니다(기본값: phi = 2048 , c = 0.003906 ). |
행동 양식 | 설명 |
---|---|
tokenize(input) |
토큰화 input (문자열)하고 토큰화된 결과([토큰, PoS 태그] 쌍)를 반환합니다. |
train_one(sent) |
주어진 답변([토큰, PoS 태그] 쌍)을 사용하여 현재 모델(필요한 경우)을 업데이트합니다 . 반환 값은 , 및 sent 의 세 가지 속성을 가진 객체입니다 . 여기서 주어진 답변( 과 동일 ) 은 다음 을 사용하는 시스템 출력입니다. (이전) 모델이며 모델이 업데이트되었는지( 와 다르기 때문에) 여부를 의미하는 이진(True/False) 플래그 입니다 .ans sys updated ans sent sys updated sys ans |
set_model(model) |
Rakuten MA 인스턴스의 모델을 로 설정합니다 model . |
set_tag_scheme(scheme) |
순차 라벨링 태그 구성표를 설정합니다. 현재 "IOB2" 및 "SBIEO" 지원됩니다. 다른 태그 구성표를 지정하면 예외가 발생합니다. |
속성 | 설명 |
---|---|
featset |
분석에 사용되는 기능 템플릿(문자열)의 배열을 지정합니다. RakutenMA.default_featset_ja 및 RakutenMA.default_featset_zh 각각 일본어와 중국어에 대한 기본 기능 세트로 사용할 수 있습니다. 기능 템플릿에 대한 자세한 내용은 아래("지원되는 기능 템플릿")를 참조하세요. |
ctype_func |
문자를 해당 문자 유형으로 변환하는 데 사용되는 함수를 지정합니다.은 RakutenMA.ctype_ja_default_func 일본어에 사용되는 기본 문자 유형 함수입니다. 또는 RakutenMA.create_ctype_chardic_func(chardic) 문자를 검색하고 chardic 해당 값을 반환하는 문자 유형 함수를 생성하기 위해 호출할 수 있습니다. 예를 들어 반환되는 함수 RakutenMA.create_ctype_chardic_func({"A": "type1"}) 를 반환 하고 그렇지 않으면 함수를 반환합니다.)f f("A") "type1" [] |
hash_func |
기능 해싱에 사용할 해시 함수를 지정합니다. 기본값 = undefined (기능 해싱 없음) -bit 해시 공간이 있는 기능 해싱 함수는 를 bit 호출하여 생성할 수 있습니다 RakutenMA.create_hash_func(bit) . |
이용약관
귀하가 Apache 라이센스 버전 2.0 (http://www.apache.org/licenses/LICENSE-2.0.html )을 준수한다는 전제 하에 Rakuten MA의 배포, 수정 및 학문적/상업적 사용이 허용됩니다 .
연구 목적으로 Rakuten MA를 사용하는 경우, Rakuten MA [Hagiwara 및 Sekine 2014]에 대한 논문을 인용해 주세요.
FAQ(자주 묻는 질문)
Q. 지원되는 브라우저와 Node.js 버전은 무엇입니까?
- A. Rakuten MA가 다음 환경에서 실행되는 것을 확인했습니다.
- Internet Explorer 8(버전 8.0.7601.17414 이상)
- 구글 크롬(버전 35.0.1916.153 이상)
- Firefox (버전 16.0.2 이상)
- 사파리 (ver. 6.1.5 이상)
- Node.js (버전 0.10.13 이상)
Q. 상업적 이용이 허용되나요?
- A. 예, 이용 약관을 준수하는 한 가능합니다. 자세한 내용은 위의 "이용 약관"을 참조하세요.
Q. 버그/분석 오류 등을 발견했는데 어디에 신고해야 하나요?
- A. Github 이슈 https://github.com/rakuten-nlp/rakutenma/issues 에서 이슈를 생성해주세요 .
- Alternatively, 코드를 수정하면 풀 요청을 생성할 수 있습니다. Rakuten MA에는 Jasmine http://jasmine.github.io/ 를 사용하는 테스트 스위트가 있습니다 . 모든 테스트가 통과되었는지(실행 후 오류 없음) 확인
jasmine-node spec
하고 직접 작성하십시오( 필요한 경우) 끌어오기 요청을 제출하기 전에. - Finally, 여전히 질문이 해결되지 않으면 prj-rakutenma [at] mail.rakuten.com으로 문의해 주세요.
Q. 토큰화 결과가 이상해 보입니다. (구체적으로 문장이 PoS 태그 없이 개별 문자로 분할되어 있습니다.)
- A. 학습에 사용된 것과 동일한 특성 세트(
featset
) 및 특성 해싱 함수( )를 사용하고 있는지 확인하십시오. 번들 모델( 및 )을 사용할 때는 15비트 특성 해싱 함수( )를 사용하는 것을 잊지 마십시오.hash_func
rma.hash_func = RakutenMA.create_hash_func(15);
model_zh.json
model_ja.json
Q. 중국어에는 어떤 스크립트(간체/번체)가 지원됩니까?
- A. 현재는 중국어 간체만 지원됩니다.
Q. 동일한 모델 파일을 JSON 형식으로 브라우저에서 사용할 수 있나요?
- A. 예, 아니오 모델의 내부 데이터 구조는 동일하지만
var model = [JSON representation];
브라우저에서 참조하기 위해서는 할당(예: )을 추가해야 합니다.model_zh.json
(Node.js의 경우)와model_zh.js
(브라우저의 경우)의 차이점을 참조하세요. 이 작업을 수행하는 미니 스크립트가 있습니다scripts/convert_for_browser.js
. 모델 교육 등을 위해 Node.js에서 작업한 다음 브라우저 사용을 위해 변환하는 것이 좋습니다.
부록
Supported feature templates
기능 템플릿 | 설명 |
---|---|
w7 | 문자 유니그램(c-3) |
w8 | 문자 유니그램(c-2) |
w9 | 문자 유니그램(c-1) |
w0 | 문자 유니그램(c0) |
w1 | 문자 유니그램(c+1) |
w2 | 문자 유니그램(c+2) |
w3 | 문자 유니그램(c+3) |
c7 | 문자 유형 유니그램(t-3) |
c8 | 문자 유형 유니그램(t-2) |
c9 | 문자 유형 유니그램(t-1) |
c0 | 문자 유형 유니그램(t0) |
c1 | 문자 유형 유니그램(t+1) |
c2 | 문자 유형 유니그램(t+2) |
c3 | 문자 유형 유니그램(t+3) |
b7 | 문자 바이그램(c-3 c-2) |
b8 | 문자 바이그램(c-2 c-1) |
b9 | 문자 바이그램(c-1 c0) |
b1 | 문자 바이그램(c0 c+1) |
b2 | 문자 바이그램(c+1 c+2) |
b3 | 문자 바이그램(c+2 c+3) |
d7 | 문자 유형 바이그램(t-3 t-2) |
d8 | 문자 유형 바이그램(t-2 t-1) |
d9 | 문자 유형 바이그램(t-1 t0) |
d1 | 문자 유형 바이그램(t0 t+1) |
d2 | 문자 유형 바이그램(t+1 t+2) |
d3 | 문자 유형 바이그램(t+2 t+3) |
다른 사람 | 배열에 사용자 정의 기능 함수를 지정하면 두 개의 인수 로 featset 함수가 호출되며 , 여기서 는 위치를 가져와 해당 위치의 캐릭터 객체를 반환하는 함수이고 는 현재 위치입니다. 각각 문자형과 문자형 이라는 두 가지 속성을 가지고 있습니다 . 해당 함수의 반환 값이 특성 값으로 사용됩니다. (예를 들어 which 함수를 지정 하면 현재 위치의 문자형이 반환됩니다. 기본적으로 템플릿과 동일합니다 .)_t i _t j i c t f(_t, i) returns _t(i).t; c0 |
PoS tag list in Chinese
꼬리표 | 설명 |
---|---|
기원 후 | 부사 |
처럼 | 측면 입자 |
학사 | ba3 (ba-construction) |
CC | 알 맞는 접속사 |
CD | 기수 |
CS | 종속의 결합 |
12월 | de5(보완자/명목화자) |
DEG | de5(속격/연관) |
DER | de5(결과) |
개발 | de5 (매너) |
DT | 결정자 |
등 | 기타 |
FW | 외국어 |
ij | 감탄사 |
JJ | 기타 명사 수식어 |
LB | bei4 (긴 bei-건설에서) |
LC | 로컬라이저 |
중 | 단어 측정 |
MSP | 기타 입자 |
NN | 다른 명사 |
NN-단축 | 다른 명사(약어) |
NR | 고유 명사 |
NR-쇼트 | 고유명사(약어) |
NT | 시간명사 |
NT-쇼트 | 시간명사(약어) |
OD | 서수 |
에 | 의성 |
피 | 전치사 |
PN | 대명사 |
PU | 구두 |
SB | bei4 (줄여서 bei-construction) |
SP | 문장 끝 입자 |
URL | URL |
버지니아 | 예측 형용사 |
VC | 접합부 |
VE | you3 (주동사) |
VV | 다른 동사 |
엑스 | 기타 |
PoS tag list in Japanese and correspondence to BCCWJ tags
꼬리표 | 원래 JA 이름 | 영어 |
---|---|---|
교류 | 형용사-일반 | 형용사-공통 |
A-dp | 형용사 - 비자립 가능 | 형용사 의존적 |
씨 | 단어를 집다 | 접속사 |
디 | 대명사 | 대명사 |
이자형 | 영어 | 영어 단어 |
에프 | 부사 | 부사 |
IC | 이동 동사-일반 | 감탄사-공통 |
jc | 모양 단어 일반 | 형용사 명사-공통 |
J-타리 | 모양 단어-타리 | 형용사 명사 - 타리 |
J-xs | 모양 단어-보조 단어 어간 | 형용사 명사-Aux동사 어간 |
으-아아 | 보조금 마크-AA | 보조 기호-AA |
맥 | 보조금 마크 일반 | 보조 기호-공통 |
M-cp | 보조 표시 닫힘 브래킷 | 보조 기호-열림 괄호 |
대걸레 | 보조금 표시 - 여는 괄호 | 보조 기호-괄호 닫기 |
국회의원 | 보조금 표시기간 | 보조 표시 기간 |
ㄴ | 명사 - 명사 | 명사-명사 |
N-NC | 명사 - 보통명사 | 명사-공통명사 |
N-pn | 명사 - 고유명사 | 명사-고유명사 |
N-xs | 명사 보조 줄기 | 명사-Aux동사 어간 |
영형 | その그 | 기타 |
피 | 커넥터 | 접두사 |
P-fj | 입자-부사 입자 | 입자-부사 |
피제이 | 입자 - 준체입자 | 입자 구문 |
PK | 입자-케이스 입자 | 입자 케이스 마킹 |
P-RJ | 입자 - 입자 | 입자 결합 |
P-sj | 입자 - 연결 입자 | 입자 결합 |
Qa | 접미사-형용사 | 접미사-형용사 |
Qj | 접미사 - 모양 단어 | 접미사-형용사 |
Qn | 접미사 - 명사 | 접미사-명사 |
Qv | 접미사-동사 | 접미사-동사 |
아르 자형 | 결합된 단어 | 관용형용사 |
SC | 표기법 일반 | 부호-공통 |
SL | 토큰 텍스트 | 서명 편지 |
유 | URL | URL |
VC | 동사 일반 | 동사-공통 |
V-dp | 동사 - 비자립 가능 | 동사 의존적 |
여 | 공백 | 공백 |
엑스 | 조동사 | Aux동사 |
감사의 말
개발자들은 이 프로젝트에 기여한 Satoshi Sekine, Satoko Marumoto, Yoichi Yoshimoto, Keiji Shinzato, Keita Yaegashi 및 Soh Masuko에게 감사의 말씀을 전하고 싶습니다.
참고자료
Masato Hagiwara 및 Satoshi Sekine, 온라인 학습을 기반으로 한 경량 클라이언트측 중국어/일본어 형태소 분석기, COLING 2014 데모 세션, 페이지 39-43, 2014. [ PDF ]
마에카와 키쿠오(Kikuo Maekawa) Kotonoha-BCCWJ 코퍼스 편집(일본어) Nihongo no kenkyo(일본어 연구), 4(1):82–95, 2008. (일부 영어 정보는 여기에서 찾을 수 있습니다 .) [ 사이트 ]
Jialei Wang, Peilin Zhao 및 Steven C. Hoi 정확한 소프트 신뢰도 가중치 학습 ICML 2012 Proc., 페이지 121-128, 2012. [ PDF ]
Naiwen Xue, Fei Xia, Fu-dong Chiou 및 Marta Palmer Penn 중국어 트리뱅크: 큰 말뭉치의 구문 구조 주석 자연 언어 공학, 11(2):207–238, 2005. [ PDF ] [ 사이트 ]
© 2014, 2015 라쿠텐 NLP 프로젝트. All Rights Reserved. / 후원: 라쿠텐, 주식회사 및 라쿠텐 공업 대학교