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
featset
dependendo 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.json
emodel_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_func
etc.) - 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.js
que 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. phi e c (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 propiedades ans , sys e updated , onde ans é a resposta dada (igual que sent ), sys é a saída do sistema usando o modelo (antigo) e updated é unha bandeira binaria (Verdadero/Falso) que significa se o modelo foi actualizado (porque sys era diferente de ans ) 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_ja e RakutenMA.default_featset_zh como 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 chamar RakutenMA.create_ctype_chardic_func(chardic) para crear unha función de tipo de carácter que leva un carácter para buscalo chardic e devolver o seu valor. (Para exemplo, RakutenMA.create_ctype_chardic_func({"A": "type1"}) devolve unha función f onde f("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). bit Pódese crear unha función de hash de función con espazo hash de -bit chamando a RakutenMA.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.json
emodel_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.js
que 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 featset matriz, chamarase á función con dous argumentos _t e i , onde _t é unha función que toma unha posición j e devolve o obxecto carácter nesa posición e i é a posición actual. Un obxecto carácter é un obxecto con dúas propiedades c e t que 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ón f(_t, i) que returns _t(i).t; , entón está devolvendo o tipo de carácter da posición actual, que é basicamente o mesmo que o modelo c0 .) |
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 .