Introducción
Rakuten MA (analizador morfológico) es un analizador morfológico (segmentador de palabras + PoS Tagger) para chino y japonés escrito exclusivamente en JavaScript.
Rakuten MA tiene las siguientes características únicas:
- Implementación pura de JavaScript. Funciona tanto en navegadores modernos como en node.js.
- Implementa un modelo de etiquetado de caracteres independiente del idioma. Genera segmentación de palabras y etiquetas PoS para chino/japonés.
- Admite la actualización incremental de modelos mediante aprendizaje en línea (Soft Confidence Weighted, Wang et al. ICML 2012).
- Conjunto de funciones personalizable.
- Admite funciones hash, cuantificación y poda para una representación compacta del modelo.
- Incluye modelos chinos y japoneses entrenados a partir de corpus generales (CTB [Xue et al. 2005] y BCCWJ [Maekawa 2008]) y corpus de comercio electrónico.
Manifestación
Puede probar Rakuten MA en la página de demostración (puede que esta página tarde un poco en cargarse).
Uso
Download & Install
Dado que Rakuten MA es una biblioteca de JavaScript, no es necesario realizar ninguna instalación. Clona el repositorio de git como
1git clone https://github.com/rakuten-nlp/rakutenma.git
o descargue el archivo zip desde aquí: https://github.com/rakuten-nlp/rakutenma/archive/master.zip
Si tiene Node.js instalado, puede ejecutar la demostración haciendo clic en
1node demo.js
que es idéntico al ejemplo de uso siguiente.
npm package
También puedes usar Rakuten MA como un paquete npm. Puedes instalarlo de la siguiente manera:
1npm install rakutenma
Los archivos del modelo se pueden encontrar 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)
Incluya el siguiente fragmento de código en <head>
su 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>
El análisis y el resultado se ven así:
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 ejemplo,
model = JSON.parse(fs.readFileSync("model_file"));
entoncesrma = new RakutenMA(model);
orma.set_model(model);
- Especifique
featset
según su idioma (por ejemplo,rma.featset = RakutenMA.default_featset_zh;
para chino yrma.featset = RakutenMA.default_featset_ja;
japonés). - Recuerde utilizar la función hash de funciones de 15 bits (
rma.hash_func = RakutenMA.create_hash_func(15);
) cuando utilice los modelos incluidos (model_zh.json
ymodel_ja.json
). - Úselo
rma.tokenize(input)
para analizar su entrada.
Training your own analysis model from scratch
- Prepare su corpus de entrenamiento (un conjunto de oraciones de entrenamiento donde una oración es solo una matriz de [token, etiqueta PoS] correcta).
- Inicialice una instancia de RakutenMA con
new RakutenMA()
. - Especifique
featset
... (y opcionalmente,ctype_func
etc.hash_func
) - Introduzca sus oraciones de entrenamiento una por una (desde la primera hasta la última) al
train_one(sent)
método. - Por lo general, SCW converge lo suficiente después de uno
epoch
(una pasada por todo el corpus de entrenamiento), pero puede repetir el Paso 4 para lograr un rendimiento aún mejor.
Consulte scripts/train_zh.js
(para chino) y scripts/train_ja.js
(para japonés) para ver un ejemplo que muestra cómo entrenar su propio modelo.
Re-training an existing model (domain adaptation, fixing errors, etc.)
- Cargue un modelo existente e inicialice una instancia de RakutenMA (consulte "Uso de modelos empaquetados para analizar oraciones en chino/japonés" más arriba).
- Prepare sus datos de entrenamiento (esto podría ser tan solo un par de oraciones, dependiendo de qué y cuánto quiera "volver a entrenar").
- Introduce tus frases de entrenamiento una por una en el
train_one(sent)
método.
Reducing the model size
El tamaño del modelo aún podría ser un problema para la distribución del lado del cliente incluso después de aplicar el hash de características. Incluimos un script scripts/minify.js
que aplica la cuantificación de características (consulte [Hagiwara y Sekine COLING 2014] para obtener más detalles) para reducir el tamaño del modelo entrenado.
Puede ejecutarlo node scripts/minify.js [input_model_file] [output_model_file]
para crear una versión minimizada del archivo del modelo.
Recuerde: también elimina la parte "sigma" del modelo entrenado, lo que significa que ya no podrá volver a entrenar el modelo minimizado. Si es necesario, vuelva a entrenar Primero el modelo y luego minifíquelo.
Documentación API
Constructor | Descripción |
---|---|
RakutenMA(model, phi, c) |
Crea una nueva instancia de RakutenMA model (opcional) especifica el objeto modelo con el que inicializar la instancia de RakutenMA phi y c (ambos opcionales) son hiperparámetros de SCW (predeterminado: phi = 2048 , c = 0.003906 ). |
Métodos | Descripción |
---|---|
tokenize(input) |
Tokeniza input (cadena) y devuelve el resultado tokenizado (pares [token, etiqueta PoS]). |
train_one(sent) |
Actualiza el modelo actual (si es necesario) usando la respuesta dada sent (pares [token, etiqueta PoS]). El valor de retorno es un objeto con tres propiedades ans , sys y updated , donde ans está la respuesta dada (igual que sent ), sys es la salida del sistema usando el modelo (antiguo) y updated es un indicador binario (Verdadero/Falso) que indica si el modelo se actualizó (porque sys era diferente de ans ) o no. |
set_model(model) |
Establece el modelo de la instancia de Rakuten MA en model . |
set_tag_scheme(scheme) |
Establece el esquema de etiquetas de etiquetado secuencial. Actualmente, "IOB2" son "SBIEO" compatibles. La especificación de otros esquemas de etiquetas provoca una excepción. |
Propiedades | Descripción |
---|---|
featset |
Especifica una matriz de plantillas de funciones (cadena) utilizadas para el análisis. Puede utilizar RakutenMA.default_featset_ja y RakutenMA.default_featset_zh como conjuntos de funciones predeterminados para japonés y chino, respectivamente. Consulte a continuación ("Plantillas de funciones admitidas") para obtener detalles sobre las plantillas de funciones. |
ctype_func |
Especifica la función utilizada para convertir un carácter a su tipo de carácter. RakutenMA.ctype_ja_default_func Es la función de tipo de carácter predeterminada utilizada para japonés. Alternativamente, puede llamar RakutenMA.create_ctype_chardic_func(chardic) para crear una función de tipo de carácter que toma un carácter para buscarlo chardic y devolver su valor. (Para Por ejemplo, RakutenMA.create_ctype_chardic_func({"A": "type1"}) devuelve una función f donde f("A") devuelve "type1" y [] en caso contrario.) |
hash_func |
Especifica la función hash que se utilizará para el hash de características. Predeterminado = undefined (sin hash de características). bit Se puede crear una función de hash de características con espacio hash de bits llamando a RakutenMA.create_hash_func(bit) . |
Términos y condiciones
Se permite la distribución, modificación y uso académico/comercial de Rakuten MA, siempre que cumpla con la licencia Apache versión 2.0 http://www.apache.org/licenses/LICENSE-2.0.html .
Si utiliza Rakuten MA con fines de investigación, cite nuestro artículo sobre Rakuten MA [Hagiwara y Sekine 2014]
Preguntas frecuentes (Preguntas frecuentes)
P. ¿Cuáles son los navegadores y las versiones de Node.js compatibles?
- R. Confirmamos que Rakuten MA se ejecuta en los siguientes entornos:
- Internet Explorer 8 (versión 8.0.7601.17414 o superior)
- Google Chrome (versión 35.0.1916.153 o superior)
- Firefox (versión 16.0.2 o superior)
- Safari (versión 6.1.5 o superior)
- Node.js (versión 0.10.13 o superior)
P. ¿Está permitido el uso comercial?
- R. Sí, siempre y cuando sigas los términos y condiciones. Consulta "Términos y condiciones" más arriba para obtener más detalles.
P. Encontré un error/error de análisis/etc. ¿Dónde debo informar?
- R. Cree un problema en Problemas de Github https://github.com/rakuten-nlp/rakutenma/issues .
- Alternatively, puede crear una solicitud de extracción si modifica el código. Rakuten MA tiene un conjunto de pruebas que utiliza Jasmine http://jasmine.github.io/ . Asegúrese de que todas las pruebas pasen (sin errores después de ejecutarlas
jasmine-node spec
) y escriba las suyas propias ( si es necesario) antes de enviar una solicitud de extracción. - Finally, si su pregunta aún no se resuelve, contáctenos en prj-rakutenma [arroba] mail.rakuten.com.
P. Los resultados de la tokenización parecen extraños (específicamente, la oración se divide en caracteres individuales sin etiquetas PoS)
- R. Compruebe si está utilizando el mismo conjunto de funciones (
featset
) y la función hash de funciones (hash_func
) utilizada para el entrenamiento. Recuerde utilizar la función hash de funciones de 15 bits (rma.hash_func = RakutenMA.create_hash_func(15);
) cuando utilice los modelos incluidos (model_zh.json
ymodel_ja.json
).
P. ¿Qué escrituras (simplificadas/tradicionales) son compatibles con el chino?
- R. Actualmente sólo se admite el chino simplificado.
P. ¿Podemos utilizar el mismo archivo de modelo en formato JSON para navegadores?
- R. Sí y no. Aunque la estructura de datos interna de los modelos es la misma, es necesario agregar una asignación (por ejemplo,
var model = [JSON representation];
) para poder hacer referencia a ella en los navegadores. Vea la diferencia entremodel_zh.json
(para Node.js) ymodel_zh.js
(para navegadores). Hay un mini scriptscripts/convert_for_browser.js
que hace esto por usted. Le recomendamos que trabaje en Node.js para el entrenamiento de modelos, etc. y luego lo convierta para uso del navegador.
Apéndice
Supported feature templates
Plantilla de función | Descripció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 personajes (c-3 c-2) |
b8 | Bigrama de personajes (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 | Bigrama de tipo de personaje (t-3 t-2) |
d8 | Bigrama de tipo de personaje (t-2 t-1) |
d9 | Bigrama de tipo de carácter (t-1 t0) |
d1 | Bigrama de tipo de carácter (t0 t+1) |
d2 | Bigrama de tipo de carácter (t+1 t+2) |
d3 | Bigrama de tipo de carácter (t+2 t+3) |
otros | Si especifica una función de característica personalizada en la featset matriz, la función se llamará con dos argumentos _t y i , donde _t es una función que toma una posición j y devuelve el objeto de carácter en esa posición, y i es la posición actual. Un objeto de carácter es un objeto con dos propiedades c y t que son carácter y tipo de carácter, respectivamente. El valor de retorno de esa función se utiliza como valor de característica. (Por ejemplo, si especifica una función f(_t, i) cual returns _t(i).t; , entonces devuelve el tipo de carácter de la posición actual, que es Básicamente lo mismo que la plantilla c0 ). |
PoS tag list in Chinese
Etiqueta | Descripción |
---|---|
ANUNCIO | Adverbio |
COMO | Partículas de aspecto |
licenciado en Letras | ba3 (en ba-construcción) |
CC | Conjunción de coordinación |
CD | número cardinal |
CS | Conjunción subordinada |
DIC | de5 (Complementador/Nominalizador) |
grados | de5 (Genitivo/Asociativo) |
DER | de5 (Resultativo) |
DESARROLLO | de5 (Manera) |
DT | Determinante |
ETC | Otros |
FW | palabra extranjera |
yo | Interjección |
J.J. | Otro modificador de sustantivo |
libra | bei4 (en construcción bei larga) |
LC | Localizador |
METRO | Palabra de medida |
MSP | Otras partículas |
NN | otro sustantivo |
NN-CORTO | Otro sustantivo (abrev.) |
NR | Nombre propio |
NR-CORTO | Nombre propio (abrev.) |
Nuevo Testamento | Sustantivo temporal |
NT-CORTO | Sustantivo temporal (abrev.) |
sobredosis | Número ordinal |
EN | Onomatopeya |
PAG | Preposición |
PN | Pronombre |
PU | Puntuación |
SB | bei4 (en resumen, bei-construcción) |
SP | Partícula final de oración |
URL | URL |
Virginia | Adjetivo predicativo |
VC | Cópula |
VE | tú3 (verbo principal) |
V.V. | Otro verbo |
X | Otros |
PoS tag list in Japanese and correspondence to BCCWJ tags
Etiqueta | Nombre original de JA | Inglés |
---|---|---|
C.A | adjetivo-general | Adjetivo-Común |
a-dp | adjetivo - posible no autosuficiente | Dependiente del adjetivo |
C | recoger palabras | Conjunción |
D | pronombre | Pronombre |
mi | Inglés | palabra inglesa |
F | adverbio | Adverbio |
ic | verbo en movimiento general | Interjección-Común |
jc | Forma de palabra general | Sustantivo adjetivo-común |
j-tari | Palabra de forma-タリ | Sustantivo adjetivo-Tari |
J-xs | Forma la raíz de la palabra auxiliar | Raíz del verbo auxiliar del sustantivo adjetivo |
M-aa | Marca de subvención-AA | Señal auxiliar-AA |
Mc | Marco de subvención general | Signo auxiliar-Común |
m-cp | Corchetes suplementarios con marca cerrada | Signo auxiliar-Paréntesis abierto |
Fregar | Marca de subvención - corchetes abiertos | Signo auxiliar-Cerrar paréntesis |
diputado | Período de subvención | Signo auxiliar-Período |
nn | sustantivo - sustantivo | Sustantivo-Sustantivo |
n-nc | sustantivo - sustantivo común | Sustantivo común |
N-pn | sustantivo - nombre propio | Sustantivo propio |
n-xs | raíz auxiliar del sustantivo | Raíz del verbo auxiliar del sustantivo |
oh | él | Otros |
PAG | conector | Prefijo |
P-fj | partícula-adverbio partícula | Partícula adverbial |
P-jj | Partícula - partícula cuasicuerpo | Frase de partícula |
Paquete | Partícula-caja de partículas | Marcado de caja de partículas |
p-rj | partícula - partícula | Unión de partículas |
P-sj | Partícula - partícula conectora | Partícula-conjuntiva |
qa | adjetivo-sufijo | Sufijo-Adjetivo |
qj | sufijo - palabra de forma | Sufijo-Adjetivo Sustantivo |
qn | sufijo - sustantivo | Sufijo-sustantivo |
qv | verbo-sufijo | Verbo sufijo |
R | palabras unidas | Adjetivo adnominal |
Carolina del Sur | Notación general | Signo común |
SL | texto-token | Carta de firma |
Ud. | URL | URL |
vc | verbo general | Verbo común |
V-dp | Verbo - posible no autosuficiente | Dependiente del verbo |
W. | blanco | Espacio en blanco |
X | verbo auxiliar | Verbo auxiliar |
Expresiones de gratitud
Los desarrolladores desean agradecer a Satoshi Sekine, Satoko Marumoto, Yoichi Yoshimoto, Keiji Shinzato, Keita Yaegashi y Soh Masuko por su contribución a este proyecto.
Referencias
Masato Hagiwara y Satoshi Sekine. Analizador morfológico chino/japonés ligero del lado del cliente basado en el aprendizaje en línea. Sesión de demostración de COLING 2014, páginas 39-43, 2014. [ PDF ]
Kikuo Maekawa. Compilación del corpus Kotonoha-BCCWJ (en japonés). Nihongo no kenkyu (Estudios en japonés), 4(1):82–95, 2008. (Se puede encontrar información en inglés aquí .) [ Sitio ]
Jialei Wang, Peilin Zhao y Steven C. Hoi, Aprendizaje ponderado por confianza suave exacto, en Proc. de ICML 2012, páginas 121–128, 2012. [ PDF ]
Naiwen Xue, Fei Xia, Fu-dong Chiou y Marta Palmer. The Penn Chinese treebank: Phrase Structure Annotation of a Large Corpus. Natural Language Engineering, 11(2):207–238, 2005. [PDF ] [ Sitio ]
© 2014, Proyecto Rakuten PNL 2015. Todos los derechos reservados. / Patrocinado por Rakuten, Inc. y el Instituto de Tecnología Rakuten .