Introdución
Rakuten MA (analizador morfolóxico) é un analizador morfolóxico (segmentador de palabras + PoS Tagger) para chinés e xaponés escrito exclusivamente en JavaScript.
Rakuten MA ten as seguintes características únicas:
- Implementación pura de JavaScript. Funciona tanto en navegadores modernos como en node.js.
- Implementa un modelo de etiquetado de caracteres independente da linguaxe. Produce segmentación de palabras e etiquetas PoS para chinés/xaponés.
- Admite a actualización incremental de modelos mediante a aprendizaxe en liña (Soft Confidence Weighted, Wang et al. ICML 2012).
- Conxunto de funcións personalizables.
- Admite funcións de hash, cuantificación e poda para a representación do modelo compacto.
- Incluído con modelos chineses e xaponeses adestrados a partir de corpus xerais (CTB [Xue et al. 2005] e BCCWJ [Maekawa 2008]) e corpus de comercio electrónico.
Demostración
Podes probar Rakuten MA na páxina de demostración (pode tardar un tempo en cargar esta páxina).
Uso
Download & Install
Dado que Rakuten MA é unha biblioteca JavaScript, non hai necesidade de instalación. Clona o repositorio git como
1git clone https://github.com/rakuten-nlp/rakutenma.git
ou descarga o arquivo zip desde aquí: https://github.com/rakuten-nlp/rakutenma/archive/master.zip
Se tes Node.js instalado, podes executar a demostración mediante
1node demo.js
que é idéntico ao exemplo de uso que aparece a continuación.
npm package
Tamén podes usar Rakuten MA como paquete npm. Podes instalalo mediante:
1npm install rakutenma
Os ficheiros do modelo pódense atopar en 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)
Inclúe o seguinte fragmento de código no <head>código 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>
A análise e o resultado ten o seguinte aspecto:
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
- Cargue un modelo existente, por exemplo, model = JSON.parse(fs.readFileSync("model_file"));entónrma = new RakutenMA(model);ourma.set_model(model);
- Especifique featsetdependendo da súa lingua (por exemplo,rma.featset = RakutenMA.default_featset_zh;para chinés erma.featset = RakutenMA.default_featset_ja;xaponés).
- Lembra usar a función de hash de funcións de 15 bits ( rma.hash_func = RakutenMA.create_hash_func(15);) cando utilices os modelos incluídos (model_zh.jsonemodel_ja.json).
- Use rma.tokenize(input)para analizar a súa entrada.
Training your own analysis model from scratch
- Prepare o seu corpus de adestramento (un conxunto de frases de adestramento onde unha oración é só unha matriz de [token, etiqueta PoS] correcta)
- Inicialice unha instancia de RakutenMA con new RakutenMA().
- Especifique featset. (e opcionalmente ,ctype_func,hash_funcetc.)
- Alimenta as túas frases de adestramento unha por unha (da primeira á última) co train_one(sent)método.
- Normalmente SCW converxe o suficiente despois dunha epoch(unha pasada por todo o corpus de adestramento) pero pode repetir o paso 4. para conseguir un rendemento aínda mellor.
Consulta scripts/train_zh.js(para chinés) e scripts/train_ja.js(para xaponés) para ver un exemplo que mostra como adestrar o teu propio modelo.
Re-training an existing model (domain adaptation, fixing errors, etc.)
- Carga un modelo existente e inicializa unha instancia de RakutenMA (consulta "Utilizar modelos agrupados para analizar frases en chinés/xaponés" máis arriba)
- Prepare os seus datos de adestramento (poden ser tan poucos como un par de frases, dependendo de que e canto quere "readestrar").
- Alimenta as túas frases de adestramento unha a unha co train_one(sent)método.
Reducing the model size
O tamaño do modelo aínda pode ser un problema para a distribución do cliente mesmo despois de aplicar o hash de funcións. Incluímos un script scripts/minify.jsque aplica a cuantificación de funcións (consulta [Hagiwara e Sekine COLING 2014] para obter máis información) para reducir o tamaño do modelo adestrado.
Podes executalo node scripts/minify.js [input_model_file] [output_model_file]para crear unha versión reducida do ficheiro do modelo.
 Lembra: tamén elimina a parte "sigma" do modelo adestrado, o que significa que xa non podes volver adestrar o modelo reducido. Se é necesario, volve adestrar. primeiro o modelo e despois minízao.
Documentación API
| Construtor | Descrición | 
|---|---|
| RakutenMA(model, phi, c) | Crea unha nova instancia de RakutenMA. model(opcional) especifica o obxecto modelo co que inicializar a instancia de RakutenMA.phiec(ambos opcionais) son hiperparámetros de SCW (predeterminado:phi = 2048,c = 0.003906). | 
| Métodos | Descrición | 
|---|---|
| tokenize(input) | Tokenizes input(cadea) e devolve o resultado tokenizado (pares [token, PoS tag]). | 
| train_one(sent) | Actualiza o modelo actual (se é necesario) usando a resposta dada sent(pares [token, etiqueta PoS]). O valor de retorno é un obxecto con tres propiedadesans,syseupdated, ondeansé a resposta dada (igual quesent),sysé a saída do sistema usando o modelo (antigo) eupdatedé unha bandeira binaria (Verdadero/Falso) que significa se o modelo foi actualizado (porquesysera diferente deans) ou non. | 
| set_model(model) | Establece o modelo da instancia de Rakuten MA en model. | 
| set_tag_scheme(scheme) | Establece o esquema de etiquetas secuenciais. Actualmente, "IOB2"son"SBIEO"compatibles. Especificar outros esquemas de etiquetas provoca unha excepción. | 
| Propiedades | Descrición | 
|---|---|
| featset | Especifica unha matriz de modelos de funcións (cadea) utilizados para a análise. Podes usar RakutenMA.default_featset_jaeRakutenMA.default_featset_zhcomo conxuntos de funcións predeterminados para xaponés e chinés, respectivamente. Consulta a continuación ("Modelos de funcións admitidos") para obter máis información sobre os modelos de funcións. | 
| ctype_func | Especifica a función que se usa para converter un carácter no seu tipo de carácter. RakutenMA.ctype_ja_default_funcÉ a función de tipo de carácter predeterminada que se usa para o xaponés. Como alternativa, pode chamarRakutenMA.create_ctype_chardic_func(chardic)para crear unha función de tipo de carácter que leva un carácter para buscalochardice devolver o seu valor. (Para exemplo,RakutenMA.create_ctype_chardic_func({"A": "type1"})devolve unha funciónfondef("A")devolve"type1"e[]doutro xeito.) | 
| hash_func | Especifica a función hash que se utilizará para o hash de funcións. Valor predeterminado = undefined(sen función hash).bitPódese crear unha función de hash de función con espazo hash de -bit chamando aRakutenMA.create_hash_func(bit). | 
Termos e condicións
Permítese a distribución, modificación e uso académico/comercial de Rakuten MA, sempre que cumpra coa versión 2.0 da licenza Apache http://www.apache.org/licenses/LICENSE-2.0.html .
Se está a usar Rakuten MA para fins de investigación, cite o noso artigo sobre Rakuten MA [Hagiwara e Sekine 2014]
FAQ (Preguntas máis frecuentes)
P. Cales son os navegadores compatibles e as versións de Node.js?
- R. Confirmamos que Rakuten MA funciona nos seguintes ambientes:- Internet Explorer 8 (ver. 8.0.7601.17414 ou superior)
- Google Chrome (ver. 35.0.1916.153 ou superior)
- Firefox (ver. 16.0.2 ou superior)
- Safari (ver. 6.1.5 ou superior)
- Node.js (ver. 0.10.13 ou superior)
 
P. Permítese o uso comercial?
- R. Si, sempre que sigas os termos e condicións. Consulta os "Termos e condicións" máis arriba para obter máis información.
P. Atopei un erro / erro de análise / etc. Onde debo informar?
- R. Crea un problema en Github issues https://github.com/rakuten-nlp/rakutenma/issues .
- Alternatively, podes crear unha solicitude de extracción se modificas o código. Rakuten MA ten unha suite de probas usando Jasmine http://jasmine.github.io/ . Asegúrate de que todas as probas pasen (sen erros despois de executar jasmine-node spec) e escribe a túa propia ( se é necesario) antes de enviar unha solicitude de extracción.
- Finally, se a túa pregunta aínda non está resolta, póñase en contacto connosco en prj-rakutenma [en] mail.rakuten.com.
P. Os resultados da tokenización parecen estraños (específicamente, a frase divídese en caracteres individuais sen etiquetas PoS)
- R. Comproba se estás a usar o mesmo conxunto de funcións ( featset) e a función de hash de funcións (hash_func) que se usan para o adestramento. Lembra que debes usar a función de hash de funcións de 15 bits (rma.hash_func = RakutenMA.create_hash_func(15);) cando utilices os modelos incluídos (model_zh.jsonemodel_ja.json).
P. Que scripts (simplificados/tradicionais) son compatibles con chinés?
- R. Actualmente só se admite o chinés simplificado.
P. Podemos usar o mesmo ficheiro de modelo no formato JSON para os navegadores?
- R. Si e non. Aínda que a estrutura de datos interna dos modelos é a mesma, cómpre engadir unha asignación (por exemplo, var model = [JSON representation];) para facer referencia a ela nos navegadores. Consulta a diferenza entremodel_zh.json(para Node.js) emodel_zh.js(para navegadores). Hai un mini scriptscripts/convert_for_browser.jsque fai isto por ti. Recomendámosche que traballes en Node.js para adestramento de modelos, etc. e despois o convertes para usos do navegador.
Apéndice
Supported feature templates
| Modelo de características | Descrición | 
|---|---|
| w7 | Unigrama de caracteres (c-3) | 
| w8 | Unigrama de caracteres (c-2) | 
| w9 | Unigrama de caracteres (c-1) | 
| w0 | Unigrama de caracteres (c0) | 
| w1 | Unigrama de caracteres (c+1) | 
| w2 | Unigrama de caracteres (c+2) | 
| w3 | Unigrama de caracteres (c+3) | 
| c7 | Unigrama de tipo de carácter (t-3) | 
| c8 | Unigrama de tipo de carácter (t-2) | 
| c9 | Unigrama de tipo de carácter (t-1) | 
| c0 | Unigrama de tipo de carácter (t0) | 
| c1 | Unigrama de tipo de carácter (t+1) | 
| c2 | Unigrama de tipo de carácter (t+2) | 
| c3 | Unigrama de tipo de carácter (t+3) | 
| b7 | Bigrama de caracteres (c-3 c-2) | 
| b8 | Bigrama de caracteres (c-2 c-1) | 
| b9 | Bigrama de caracteres (c-1 c0) | 
| b1 | Bigrama de caracteres (c0 c+1) | 
| b2 | Bigrama de caracteres (c+1 c+2) | 
| b3 | Bigrama de caracteres (c+2 c+3) | 
| d7 | Tipo de carácter bigrama (t-3 t-2) | 
| d8 | Tipo de carácter bigrama (t-2 t-1) | 
| d9 | Tipo de carácter bigrama (t-1 t0) | 
| d1 | Tipo de carácter bigrama (t0 t+1) | 
| d2 | Tipo de carácter bigrama (t+1 t+2) | 
| d3 | Tipo de carácter bigrama (t+2 t+3) | 
| outros | Se especifica unha función de función personalizada na featsetmatriz, chamarase á función con dous argumentos_tei, onde_té unha función que toma unha posiciónje devolve o obxecto carácter nesa posición eié a posición actual. Un obxecto carácter é un obxecto con dúas propiedadescetque son carácter e tipo de carácter, respectivamente. O valor de retorno desa función utilízase como valor de característica. (Por exemplo, se especifica unha funciónf(_t, i)quereturns _t(i).t;, entón está devolvendo o tipo de carácter da posición actual, que é basicamente o mesmo que o modeloc0.) | 
PoS tag list in Chinese
| Etiquetar | Descrición | 
|---|---|
| ANUNCIO | Adverbio | 
| AS | Partículas de aspecto | 
| BA | ba3 (en ba-construción) | 
| CC | Conxunción coordinadora | 
| CD | Número cardinal | 
| CS | Conxunción subordinante | 
| DEC | de5 (complementador/nominalizador) | 
| DEG | de5 (xenitivo/asociativo) | 
| DER | de5 (Resultado) | 
| DEV | de5 (manera) | 
| DT | Determinador | 
| ETC | Outros | 
| FW | Palabra estranxeira | 
| ij | Interxección | 
| JJ | Outro substantivo modificador | 
| LB | bei4 (en long bei-construction) | 
| LC | Localizador | 
| M | Medir palabra | 
| MSP | Outras partículas | 
| NN | Outro substantivo | 
| NN-CURTO | Outro substantivo (abrev.) | 
| NR | Substantivo propio | 
| NR-CURTO | Nome propio (abrev.) | 
| NT | Substantivo temporal | 
| NT-CURTO | Substantivo temporal (abrev.) | 
| OD | Número ordinal | 
| ON | Onomatopeas | 
| P | Preposición | 
| PN | Pronome | 
| PU | A puntuación | 
| SB | bei4 (en resumo bei-construction) | 
| SP | Partícula final da frase | 
| URL | URL | 
| VA | Adxectivo predicativo | 
| VC | Cópula | 
| VE | you3 (verbo principal) | 
| VV | Outro verbo | 
| X | Outros | 
PoS tag list in Japanese and correspondence to BCCWJ tags
| Etiquetar | Nome orixinal JA | inglés | 
|---|---|---|
| Ac | adxectivo-xeral | Adxectivo-Común | 
| A-dp | adxectivo - posible non autosuficiente | Dependente do adxectivo | 
| C | recoller palabras | Conxunción | 
| D | pronome | Pronome | 
| E | inglés | Palabra inglesa | 
| F | adverbio | Adverbio | 
| I C | movemento verbo-xeral | Interxección-Común | 
| jc | Forma palabra xeral | Adxectivo Substantivo-Común | 
| J-tari | Forma palabra-タリ | Adxectivo Substantivo-Tari | 
| J-xs | Forma a palabra auxiliar palabra tronco | Substantivo adxectivo-AuxVerb tronco | 
| M-aa | Marca de subvención-AA | Sinal auxiliar-AA | 
| Mc | Subvención marca xeral | Signo auxiliar-Común | 
| M-cp | Corchetes de marca pechado suplementarios | Signo auxiliar-Paréntese aberto | 
| M-op | Marca de subvención - corchetes abertos | Signo auxiliar-Paréntese pechado | 
| MP | Período marca de subvención | Signo auxiliar-Período | 
| Nn | substantivo - substantivo | Substantivo-substantivo | 
| N-nc | substantivo - substantivo común | Substantivo-Sustantivo común | 
| N-pn | substantivo - nome propio | Substantivo-Nome propio | 
| N-xs | raíz substantivo-auxiliar | Tallo substantivo-auxverbo | 
| O | そのel | Outros | 
| P | conector | Prefixo | 
| P-fj | partícula-adverbio partícula | Partícula-Adverbial | 
| P-jj | Partícula - partícula cuasi-corpórea | Partícula-Frasal | 
| Pk | Partícula-caso partícula | Marcado de caixas de partículas | 
| P-rj | partícula - partícula | Unión de partículas | 
| P-sj | Partícula - partícula de conexión | Partícula-Conxuntivo | 
| Qa | sufixo-adxectivo | Sufixo-Adxectivo | 
| Qj | sufixo - palabra forma | Substantivo sufixo-adxectivo | 
| Qn | sufixo - substantivo | Sufixo-substantivo | 
| Qv | sufixo-verbo | Sufixo-Verbo | 
| R | palabras unidas | Adxectivo adnominal | 
| Sc | Notación xeral | Signo-Común | 
| SL | texto-token | Signo-Carta | 
| U | URL | URL | 
| Vc | verbo-xeral | Verbo-Común | 
| V-dp | Verbo - posible non autosuficiente | Dependente do verbo | 
| W | en branco | Espazo en branco | 
| X | verbo auxiliar | AuxVerb | 
Agradecementos
Os desenvolvedores queren agradecer a Satoshi Sekine, Satoko Marumoto, Yoichi Yoshimoto, Keiji Shinzato, Keita Yaegashi e Soh Masuko pola súa contribución a este proxecto.
Referencias
Masato Hagiwara e Satoshi Sekine. Analizador morfolóxico lixeiro de chinés/xaponés do lado do cliente baseado na aprendizaxe en liña. Sesión de demostración COLING 2014, páxinas 39-43, 2014. [ PDF ]
Kikuo Maekawa.Compilación do corpus Kotonoha-BCCWJ (en xaponés).Nihongo no kenkyu (Estudos en xaponés), 4(1):82–95, 2008. (Pode atopar algunha información en inglés aquí .) [ Sitio ]
Jialei Wang, Peilin Zhao e Steven C. Hoi. Aprendizaxe exacta e suave ponderada na confianza. En Proc. of ICML 2012, páxinas 121-128, 2012. [ PDF ]
Naiwen Xue, Fei Xia, Fu-dong Chiou e Marta Palmer.The Penn Chinese treebank: Phrase structure annotation of a large corpus.Enxeñería da Linguaxe Natural, 11(2):207–238, 2005. [ PDF ] [ Site ]
© 2014, 2015 Rakuten NLP Project. Todos os dereitos reservados. / Patrocinado por Rakuten, Inc. e Rakuten Institute of Technology .

