Introducció
Rakuten MA (analitzador morfològic) és un analitzador morfològic (segmentador de paraules + PoS Tagger) per a xinès i japonès escrit exclusivament en JavaScript.
Rakuten MA té les següents característiques úniques:
- Implementació pura de JavaScript. Funciona tant en navegadors moderns com en node.js.
- Implementa un model d'etiquetatge de caràcters independent de l'idioma. Produeix segmentació de paraules i etiquetes PoS per a xinès/japonès.
- Admet l'actualització incremental de models mitjançant l'aprenentatge en línia (Soft Confidence Weighted, Wang et al. ICML 2012).
- Conjunt de funcions personalitzables.
- Admet funcions hashing, quantificació i poda per a la representació compacta del model.
- Inclou models xinesos i japonesos formats a partir de corpus generals (CTB [Xue et al. 2005] i BCCWJ [Maekawa 2008]) i corpus de comerç electrònic.
Demostració
Podeu provar Rakuten MA a la pàgina de demostració (pot trigar una estona a carregar aquesta pàgina).
Ús
Download & Install
Com que Rakuten MA és una biblioteca de JavaScript, no cal instal·lar-lo. Clonar el repositori git com a
1git clone https://github.com/rakuten-nlp/rakutenma.git
o descarregueu l'arxiu zip des d'aquí: https://github.com/rakuten-nlp/rakutenma/archive/master.zip
Si teniu Node.js instal·lat, podeu executar la demostració
1node demo.js
que és idèntic a l'exemple d'ús següent.
npm package
També podeu utilitzar Rakuten MA com a paquet npm. Podeu instal·lar-lo mitjançant:
1npm install rakutenma
Els fitxers del model es poden trobar a 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)
Incloeu el fragment de codi següent al <head>
vostre codi 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>
L'anàlisi i el resultat són els següents:
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
- Carregueu un model existent, per exemple,
model = JSON.parse(fs.readFileSync("model_file"));
llavorsrma = new RakutenMA(model);
orma.set_model(model);
- Especifiqueu
featset
en funció de la vostra llengua (p. ex.,rma.featset = RakutenMA.default_featset_zh;
per al xinès irma.featset = RakutenMA.default_featset_ja;
per al japonès). - Recordeu utilitzar la funció hash de funcions de 15 bits (
rma.hash_func = RakutenMA.create_hash_func(15);
) quan utilitzeu els models inclosos (model_zh.json
imodel_ja.json
). - Utilitzeu-lo
rma.tokenize(input)
per analitzar la vostra entrada.
Training your own analysis model from scratch
- Prepareu el vostre corpus d'entrenament (un conjunt d'oracions d'entrenament on una frase és només una sèrie de [token, etiqueta PoS] correcte).
- Inicialitzeu una instància de RakutenMA amb
new RakutenMA()
. - Especifiqueu
featset
. (i, opcionalment,ctype_func
,hash_func
, etc.) - Alimenta les teves frases d'entrenament una per una (de la primera a l'última) amb el
train_one(sent)
mètode. - Normalment, SCW convergeix prou després d'una
epoch
(una passada per tot el corpus d'entrenament), però podeu repetir el pas 4 per aconseguir un rendiment encara millor.
Vegeu scripts/train_zh.js
(per al xinès) i scripts/train_ja.js
(per al japonès) per veure un exemple que mostra com entrenar el vostre propi model.
Re-training an existing model (domain adaptation, fixing errors, etc.)
- Carregueu un model existent i inicialitzeu una instància de RakutenMA. (vegeu "Ús de models agrupats per analitzar frases xineses/japoneses" més amunt)
- Prepareu les vostres dades d'entrenament (podrien ser només un parell de frases, depenent de què i quant vulgueu "reentrenar").
- Alimenta les teves frases d'entrenament una per una amb el
train_one(sent)
mètode.
Reducing the model size
La mida del model encara podria ser un problema per a la distribució del costat del client fins i tot després d'aplicar la funció hashing. Hem inclòs un script scripts/minify.js
que aplica la quantificació de característiques (vegeu [Hagiwara i Sekine COLING 2014] per obtenir-ne més detalls) per reduir la mida del model entrenat.
Podeu executar-lo node scripts/minify.js [input_model_file] [output_model_file]
per fer una versió minificada del fitxer del model.
Recordeu: també elimina la part "sigma" del model entrenat, és a dir, que ja no podreu tornar a entrenar el model minificat. Si cal, torneu a entrenar-lo. primer el model i després reduïu-lo.
Documentació de l'API
Constructor | Descripció |
---|---|
RakutenMA(model, phi, c) |
Crea una instància de RakutenMA nova. model (opcional) especifica l'objecte model amb què inicialitzar la instància de RakutenMA. phi i c (ambdós opcionals) són híper paràmetres de SCW (per defecte: phi = 2048 , c = 0.003906 ). |
Mètodes | Descripció |
---|---|
tokenize(input) |
Tokenitza input (cadena) i retorna el resultat tokenitzat (parells de [token, etiqueta PoS]). |
train_one(sent) |
Actualitza el model actual (si cal) utilitzant la resposta donada sent (parells [token, etiqueta PoS]). El valor de retorn és un objecte amb tres propietats ans , sys i updated , on ans és la resposta donada (igual que sent ), sys és la sortida del sistema que utilitza el model (antic) i updated és un indicador binari (Vertader/Fals) que significa si el model s'ha actualitzat (perquè sys era diferent de ans ) o no. |
set_model(model) |
Estableix el model de la instància de Rakuten MA a model . |
set_tag_scheme(scheme) |
Estableix l'esquema d'etiquetes d'etiquetes seqüencials. Actualment, "IOB2" i "SBIEO" s'admeten. L'especificació d'altres esquemes d'etiquetes provoca una excepció. |
Propietats | Descripció |
---|---|
featset |
Especifica una sèrie de plantilles de característiques (cadena) utilitzades per a l'anàlisi. Podeu utilitzar RakutenMA.default_featset_ja i RakutenMA.default_featset_zh com a conjunts de característiques predeterminades per al japonès i el xinès, respectivament. Vegeu a continuació ("Plantilles de funcions admeses") per obtenir els detalls de les plantilles de funcions. |
ctype_func |
Especifica la funció que s'utilitza per convertir un caràcter al seu tipus de caràcter. RakutenMA.ctype_ja_default_func És la funció de tipus de caràcter predeterminada que s'utilitza per al japonès. De manera alternativa, podeu trucar RakutenMA.create_ctype_chardic_func(chardic) per crear una funció de tipus de caràcter que pren un caràcter per buscar-lo chardic i retornar-ne el valor. (Per a per exemple, RakutenMA.create_ctype_chardic_func({"A": "type1"}) retorna una funció f on f("A") retorna "type1" i [] d'una altra manera.) |
hash_func |
Especifica la funció hash que s'ha d'utilitzar per a la funció hash. Per defecte = undefined (no hi ha hash). Es pot crear una funció hash amb bit espai hash de -bit cridant a RakutenMA.create_hash_func(bit) . |
Termes i condicions
Es permet la distribució, la modificació i l'ús acadèmic/comercial de Rakuten MA, sempre que compleixi amb la versió 2.0 de la llicència d'Apache http://www.apache.org/licenses/LICENSE-2.0.html .
Si utilitzeu Rakuten MA amb finalitats de recerca, si us plau, cita el nostre article sobre Rakuten MA [Hagiwara i Sekine 2014]
Preguntes Freqüents (Preguntes Freqüents)
P. Quins són els navegadors compatibles i les versions de Node.js?
- R. Hem confirmat que Rakuten MA s'executa en els entorns següents:
- Internet Explorer 8 (versió 8.0.7601.17414 o superior)
- Google Chrome (versió 35.0.1916.153 o superior)
- Firefox (ver. 16.0.2 o superior)
- Safari (versió 6.1.5 o superior)
- Node.js (versió 0.10.13 o superior)
P. Es permet l'ús comercial?
- R. Sí, sempre que seguiu els termes i condicions. Consulteu "Termes i condicions" més amunt per obtenir-ne els detalls.
P. He trobat un error/error d'anàlisi/etc. On he d'informar?
- R. Creeu un problema a Github issues https://github.com/rakuten-nlp/rakutenma/issues .
- Alternatively, podeu crear una sol·licitud d'extracció si modifiqueu el codi. Rakuten MA té una suite de proves que utilitza Jasmine http://jasmine.github.io/ . Assegureu-vos que totes les proves passen (sense errors després d'executar-se
jasmine-node spec
) i escriviu la vostra ( si cal) abans d'enviar una sol·licitud d'extracció. - Finally, si la vostra pregunta encara no s'ha resolt, poseu-vos en contacte amb nosaltres a prj-rakutenma [at] mail.rakuten.com.
P. Els resultats de la tokenització semblen estranys (concretament, la frase es divideix en caràcters individuals sense etiquetes PoS)
- A. Comproveu si utilitzeu el mateix conjunt de funcions (
featset
) i la funció de resum de funcions (hash_func
) que s'utilitzen per a l'entrenament. Recordeu que heu d'utilitzar la funció de resum de funcions de 15 bits (rma.hash_func = RakutenMA.create_hash_func(15);
) quan utilitzeu els models inclosos (model_zh.json
imodel_ja.json
).
P. Quins scripts (simplificats/tradicionals) són compatibles amb el xinès?
- R. Actualment només s'admet el xinès simplificat.
P. Podem utilitzar el mateix fitxer de model en format JSON per als navegadors?
- R. Sí i no. Tot i que l'estructura de dades interna dels models és la mateixa, heu d'afegir una assignació (p. ex.
var model = [JSON representation];
) per fer-hi referència als navegadors. Vegeu la diferència entremodel_zh.json
(per a Node.js) imodel_zh.js
(per a navegadors). Hi ha un mini scriptscripts/convert_for_browser.js
que ho fa per vosaltres. Us recomanem que treballeu amb Node.js per a l'entrenament de models, etc. i després el convertiu per als usos del navegador.
Apèndix
Supported feature templates
Plantilla de funció | Descripció |
---|---|
w7 | Unigrama de caràcters (c-3) |
w8 | Unigrama de caràcters (c-2) |
w9 | Unigrama de caràcters (c-1) |
w0 | Unigrama de caràcters (c0) |
w1 | Unigrama de caràcters (c+1) |
w2 | Unigrama de caràcters (c+2) |
w3 | Unigrama de caràcters (c+3) |
c7 | Unigrama de tipus de caràcter (t-3) |
c8 | Unigrama de tipus de caràcter (t-2) |
c9 | Unigrama de tipus de caràcter (t-1) |
c0 | Unigrama de tipus de caràcter (t0) |
c1 | Unigrama de tipus de caràcter (t+1) |
c2 | Unigrama de tipus de caràcter (t+2) |
c3 | Unigrama de tipus de caràcter (t+3) |
b7 | Bigrama del caràcter (c-3 c-2) |
b8 | Bigrama de caràcters (c-2 c-1) |
b9 | Bigrama de caràcters (c-1 c0) |
b1 | Bigram de caràcters (c0 c+1) |
b2 | Bigram de caràcters (c+1 c+2) |
b3 | Bigrama de caràcters (c+2 c+3) |
d7 | Tipus de caràcter bigrama (t-3 t-2) |
d8 | Tipus de caràcter bigrama (t-2 t-1) |
d9 | Tipus de caràcter bigrama (t-1 t0) |
d1 | Bigram tipus de caràcter (t0 t+1) |
d2 | Tipus de caràcter bigrama (t+1 t+2) |
d3 | Bigrama tipus de caràcter (t+2 t+3) |
altres | Si especifiqueu una funció de característica personalitzada a la featset matriu, la funció es cridarà amb dos arguments _t i i , on _t és una funció que pren una posició j i retorna l'objecte caràcter en aquesta posició, i i és la posició actual. Un objecte caràcter és un objecte. amb dues propietats c i t que són caràcter i tipus de caràcter, respectivament. El valor de retorn d'aquesta funció s'utilitza com a valor de característica. (Per exemple, si especifiqueu una funció f(_t, i) que returns _t(i).t; , aleshores retorna el tipus de caràcter de la posició actual, que és bàsicament el mateix que la plantilla c0 .) |
PoS tag list in Chinese
Etiqueta | Descripció |
---|---|
AD | Adverbi |
AS | Partícules d'aspecte |
BA | ba3 (en ba-construcció) |
CC | Conjunció coordinadora |
CD | Número cardinal |
CS | Conjunció subordinada |
DES | de5 (complementador/nominalitzador) |
DEG | de5 (genitiu/associatiu) |
DER | de5 (Resultatiu) |
DEV | de5 (manera) |
DT | Determinador |
ETC | Altres |
FW | Paraula estrangera |
ij | Interjecció |
JJ | Un altre nom-modificador |
LB | bei4 (en bei-construcció llarga) |
LC | Localitzador |
M | Mesura la paraula |
MSP | Altres partícules |
NN | Un altre substantiu |
NN-CURT | Un altre substantiu (abrev.) |
NR | Nom propi |
NR-CURT | Nom propi (abrev.) |
Nou Testament | Nom temporal |
NT-CURT | Nom temporal (abrev.) |
OD | Nombre ordinal |
ON | Onomatopeia |
P | Preposició |
PN | Pronom |
PU | Puntuació |
SB | bei4 (en resum bei-construcció) |
SP | Partícula final de frase |
URL | URL |
VA | Adjectiu predicatiu |
VC | Còpula |
VE | tu3 (verb principal) |
VV | Un altre verb |
X | Altres |
PoS tag list in Japanese and correspondence to BCCWJ tags
Etiqueta | Nom original JA | Anglès |
---|---|---|
AC | adjectiu-general | Adjectiu-Comú |
A-dp | adjectiu - possible no autosuficient | Dependent de l'adjectiu |
C | agafar paraules | Conjunció |
D | pronom | Pronom |
E | Anglès | paraula anglesa |
F | adverbi | Adverbi |
I C | moviment verb-general | Interjecció-Comú |
jc | Forma paraula general | Adjectival Nom-Comú |
J-tari | Forma paraula-タリ | Adjectival Nom-Tari |
J-xs | Forma paraula auxiliar-rama de paraula | Adjectival Nom-AuxVerb tronc |
M-aa | Marca de subvenció-AA | Senyal auxiliar-AA |
Mc | Subvenció marca general | Signe auxiliar-Comú |
M-cp | Suports suplementaris amb marca tancada | Signe auxiliar-Parèntesis obert |
M-op | Marca de subvenció - parèntesis oberts | Signe auxiliar-Parèntesis de tancament |
MP | Període marca de subvenció | Signe auxiliar-Període |
Nn | substantiu - substantiu | Nom-substantiu |
N-nc | substantiu - substantiu comú | Nom-substantiu comú |
N-pn | substantiu - nom propi | Nom-Nom propi |
N-xs | tija substantiu-auxiliar | Nom-AuxVerb tronc |
O | そのell | Altres |
P | connector | Prefix |
P-fj | partícula-adverbi partícula | Partícula-Adverbial |
P-jj | Partícula - partícula quasi cos | Partícula-Frasal |
Pk | Partícula de cas de partícules | Marcatge de cas de partícules |
P-rj | partícula - partícula | Unió de partícules |
P-sj | Partícula - partícula de connexió | Partícula-conjuntiva |
Qa | sufix-adjectiu | Sufix-adjectiu |
Qj | sufix - paraula de forma | Sufix-Adjectival Nom |
Qn | sufix - substantiu | Sufix-substantiu |
Qv | sufix-verb | Sufix-Verb |
R | paraules unides | Adjectiu adnominal |
Sc | Notació general | Signe-Comú |
SL | token-text | Signe-Carta |
U | URL | URL |
Vc | verb-general | Verb-Comú |
V-dp | Verb - possible no autosuficient | Dependent del verb |
W | en blanc | Espai blanc |
X | verb auxiliar | AuxVerb |
Agraïments
Els desenvolupadors volen agrair a Satoshi Sekine, Satoko Marumoto, Yoichi Yoshimoto, Keiji Shinzato, Keita Yaegashi i Soh Masuko la seva contribució a aquest projecte.
Referències
Masato Hagiwara i Satoshi Sekine Analitzador morfològic xinès/japonès lleuger per al client basat en l'aprenentatge en línia Sessió de demostració COLING 2014, pàgines 39-43, 2014. [ PDF ]
Kikuo Maekawa. Compilació del corpus Kotonoha-BCCWJ (en japonès). Nihongo no kenkyu (Estudis en japonès), 4(1):82–95, 2008. (Podeu trobar informació en anglès aquí .) [ Lloc ]
Jialei Wang, Peilin Zhao i Steven C. Hoi. Aprenentatge suau exacte ponderat per la confiança. A Proc. of ICML 2012, pàgines 121–128, 2012. [ PDF ]
Naiwen Xue, Fei Xia, Fu-dong Chiou i Marta Palmer The Penn Chinese treebank: Phrase structure annotation of a large corpus, Natural Language Engineering, 11(2):207–238, 2005. [ PDF ] [ Lloc ]
© 2014, 2015 Rakuten NLP Project. Tots els drets reservats. / Patrocinat per Rakuten, Inc. i Rakuten Institute of Technology .