introduzione
Rakuten MA (analizzatore morfologico) è un analizzatore morfologico (segmentatore di parole + Tagger PoS) per cinese e giapponese scritto esclusivamente in JavaScript.
Rakuten MA ha le seguenti caratteristiche uniche:
- Pura implementazione JavaScript. Funziona sia su browser moderni che su node.js.
- Implementa un modello di codifica dei caratteri indipendente dalla lingua. Produce segmentazione delle parole e tag PoS per cinese/giapponese.
- Supporta l'aggiornamento incrementale dei modelli mediante l'apprendimento online (Soft Confidence Weighted, Wang et al. ICML 2012).
- Set di funzionalità personalizzabili.
- Supporta l'hashing, la quantizzazione e l'eliminazione delle funzionalità per la rappresentazione compatta del modello.
- In bundle con modelli cinesi e giapponesi formati da corpora generali (CTB [Xue et al. 2005] e BCCWJ [Maekawa 2008]) e corpora di e-commerce.
Dimostrazione
Puoi provare Rakuten MA nella pagina demo (il caricamento di questa pagina potrebbe richiedere del tempo).
Utilizzo
Download & Install
Poiché Rakuten MA è una libreria JavaScript, non è necessaria l'installazione. Clona il repository git come
1git clone https://github.com/rakuten-nlp/rakutenma.git
oppure scarica l'archivio zip da qui: https://github.com/rakuten-nlp/rakutenma/archive/master.zip
Se hai installato Node.js, puoi eseguire la demo tramite
1node demo.js
che è identico all'esempio di utilizzo riportato di seguito.
npm package
Puoi anche utilizzare Rakuten MA come pacchetto npm e installarlo tramite:
1npm install rakutenma
I file del modello possono essere trovati in 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)
Includi il seguente snippet di codice nel <head>codice 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'analisi e il risultato sono simili a questi:
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
- Caricare un modello esistente, ad esempio,
model = JSON.parse(fs.readFileSync("model_file"));quindirma = new RakutenMA(model);orma.set_model(model); - Specificare
featsetin base alla lingua (ad esempiorma.featset = RakutenMA.default_featset_zh;per il cinese erma.featset = RakutenMA.default_featset_ja;per il giapponese). - Ricordarsi di utilizzare la funzione di hashing delle funzionalità a 15 bit (
rma.hash_func = RakutenMA.create_hash_func(15);) quando si utilizzano i modelli in bundle (model_zh.jsonemodel_ja.json). - Utilizzare
rma.tokenize(input)per analizzare l'input.
Training your own analysis model from scratch
- Prepara il tuo corpus di addestramento (una serie di frasi di addestramento in cui una frase è solo un array di [token, tag PoS] corretti).
- Inizializza un'istanza RakutenMA con
new RakutenMA(). - Specificare
featset. (e facoltativamente,ctype_func,hash_func, ecc.) - Inserisci le tue frasi di allenamento una per una (dalla prima all'ultima) nel
train_one(sent)metodo. - In genere, la procedura SCW converge abbastanza dopo un passaggio
epoch(un passaggio attraverso l'intero corpus di training), ma è possibile ripetere il passaggio 4 per ottenere prestazioni ancora migliori.
Vedi scripts/train_zh.js(per il cinese) e scripts/train_ja.js(per il giapponese) per vedere un esempio che mostra come addestrare il tuo modello.
Re-training an existing model (domain adaptation, fixing errors, etc.)
- Carica un modello esistente e inizializza un'istanza RakutenMA (vedi "Utilizzo di modelli in bundle per analizzare frasi cinesi/giapponesi" sopra)
- Prepara i tuoi dati di allenamento (potrebbero essere anche solo un paio di frasi, a seconda di cosa e quanto vuoi "riqualificarti".)
- Inserisci le tue frasi di allenamento una per una nel
train_one(sent)metodo.
Reducing the model size
La dimensione del modello potrebbe ancora rappresentare un problema per la distribuzione lato client anche dopo aver applicato l'hashing delle funzionalità. Abbiamo incluso uno script scripts/minify.jsche applica la quantizzazione delle funzionalità (vedere [Hagiwara e Sekine COLING 2014] per i dettagli) per ridurre la dimensione del modello addestrato.
Puoi eseguirlo node scripts/minify.js [input_model_file] [output_model_file]per creare una versione minimizzata del file del modello.
Ricorda: elimina anche la parte "sigma" del modello addestrato, il che significa che non puoi più addestrare nuovamente il modello minimizzato. Se necessario, addestra nuovamente prima il modello e poi minimizzarlo.
Documentazione dell'API
| Costruttore | Descrizione |
|---|---|
RakutenMA(model, phi, c) |
Crea una nuova istanza RakutenMA. model(facoltativo) specifica l'oggetto del modello con cui inizializzare l'istanza RakutenMA. phie c(entrambi facoltativi) sono parametri iper di SCW (impostazione predefinita: phi = 2048, c = 0.003906). |
| Metodi | Descrizione |
|---|---|
tokenize(input) |
Tokenizza input(stringa) e restituisce il risultato tokenizzato (coppie [token, tag PoS]). |
train_one(sent) |
Aggiorna il modello corrente (se necessario) utilizzando la risposta fornita sent(coppie [token, tag PoS]). Il valore restituito è un oggetto con tre proprietà ans, sys, e updated, dove ansè la risposta fornita (uguale a sent), sysè l'output del sistema utilizzando il (vecchio) modello ed updatedè un flag binario (Vero/Falso) che indica se il modello è stato aggiornato (perché sysera diverso da ans) oppure no. |
set_model(model) |
Imposta il modello dell'istanza Rakuten MA su model. |
set_tag_scheme(scheme) |
Imposta lo schema di tag di etichettatura sequenziale. Attualmente, "IOB2"e "SBIEO"sono supportati. La specifica di altri schemi di tag provoca un'eccezione. |
| Proprietà | Descrizione |
|---|---|
featset |
Specifica un array di modelli di funzionalità (stringa) utilizzati per l'analisi. È possibile utilizzare RakutenMA.default_featset_jae RakutenMA.default_featset_zhcome set di funzionalità predefiniti rispettivamente per giapponese e cinese. Per i dettagli sui modelli di funzionalità, vedere di seguito ("Modelli di funzionalità supportati"). |
ctype_func |
Specifica la funzione utilizzata per convertire un carattere nel suo tipo di carattere. RakutenMA.ctype_ja_default_funcè la funzione di tipo di carattere predefinita utilizzata per il giapponese. In alternativa, puoi chiamare RakutenMA.create_ctype_chardic_func(chardic)per creare una funzione di tipo di carattere che accetta un carattere per cercarlo chardice restituirne il valore. (Per esempio, RakutenMA.create_ctype_chardic_func({"A": "type1"})restituisce una funzione fdove f("A")restituisce "type1"e []altrimenti.) |
hash_func |
Specifica la funzione hash da utilizzare per l'hashing delle funzionalità. Impostazione predefinita = undefined(nessun hashing delle funzionalità). È possibile creare una funzione hash delle funzionalità con bitspazio hash a -bit chiamando RakutenMA.create_hash_func(bit). |
Termini e Condizioni
La distribuzione, la modifica e l'uso accademico/commerciale di Rakuten MA sono consentiti, a condizione che tu sia conforme alla licenza Apache versione 2.0 http://www.apache.org/licenses/LICENSE-2.0.html .
Se utilizzi Rakuten MA per scopi di ricerca, cita il nostro articolo su Rakuten MA [Hagiwara e Sekine 2014]
FAQ (domande frequenti)
D. Quali sono i browser supportati e le versioni di Node.js?
- R. Abbiamo confermato che Rakuten MA funziona nei seguenti ambienti:
- Internet Explorer 8 (ver. 8.0.7601.17414 o successiva)
- Google Chrome (ver. 35.0.1916.153 o successiva)
- Firefox (ver. 16.0.2 o successiva)
- Safari (ver. 6.1.5 o successiva)
- Node.js (ver. 0.10.13 o successiva)
D. È consentito l'uso commerciale?
- R. Sì, purché si rispettino i termini e le condizioni. Per i dettagli vedere "Termini e condizioni" sopra.
D. Ho trovato un bug/errore di analisi/ecc. Dove devo segnalarlo?
- R. Crea un problema su Github Issues https://github.com/rakuten-nlp/rakutenma/issues .
- Alternatively, puoi creare una richiesta pull se modifichi il codice. Rakuten MA ha una suite di test che utilizza Jasmine http://jasmine.github.io/ . Assicurati che tutti i test passino (nessun errore dopo l'esecuzione
jasmine-node spec) e scrivi il tuo ( se necessario) prima di inviare una richiesta pull. - Finally, se la tua domanda non è ancora stata risolta, contattaci all'indirizzo prj-rakutenma [at] mail.rakuten.com.
D. I risultati della tokenizzazione sembrano strani (nello specifico, la frase è suddivisa in singoli caratteri senza tag PoS)
- A. Controllare se si sta utilizzando lo stesso set di funzionalità (
featset) e la stessa funzione di hashing delle funzionalità (hash_func) utilizzati per l'addestramento. Ricordarsi di utilizzare la funzione di hashing delle funzionalità a 15 bit (rma.hash_func = RakutenMA.create_hash_func(15);) quando si utilizzano i modelli in bundle (model_zh.jsonemodel_ja.json).
D. Quali script (semplificato/tradizionale) sono supportati per il cinese?
- R. Attualmente è supportato solo il cinese semplificato.
D. Possiamo utilizzare lo stesso file modello nel formato JSON per i browser?
- R. Sì e no. Sebbene la struttura dei dati interni dei modelli sia la stessa, è necessario aggiungere l'assegnazione (ad esempio,
var model = [JSON representation];) per farvi riferimento nei browser. Vedere la differenza tramodel_zh.json(per Node.js) emodel_zh.js(per i browser). Esiste un mini scriptscripts/convert_for_browser.jsche fa questo per te. Ti consigliamo di lavorare su Node.js per l'addestramento del modello, ecc., e quindi di convertirlo per l'utilizzo nel browser.
Appendice
Supported feature templates
| Modello di funzionalità | Descrizione |
|---|---|
| w7 | Unigramma di caratteri (c-3) |
| w8 | Unigramma di caratteri (c-2) |
| w9 | Unigramma di caratteri (c-1) |
| w0 | Unigramma di caratteri (c0) |
| w1 | Unigramma di caratteri (c+1) |
| w2 | Unigramma di caratteri (c+2) |
| w3 | Unigramma di caratteri (c+3) |
| c7 | Tipo di carattere unigramma (t-3) |
| c8 | Unigramma di tipo carattere (t-2) |
| c9 | Tipo di carattere unigramma (t-1) |
| c0 | Tipo di carattere unigramma (t0) |
| c1 | Tipo di carattere unigramma (t+1) |
| c2 | Tipo di carattere unigramma (t+2) |
| c3 | Tipo di carattere unigramma (t+3) |
| b7 | Bigramma di caratteri (c-3 c-2) |
| b8 | Bigramma di caratteri (c-2 c-1) |
| b9 | Bigramma di caratteri (c-1 c0) |
| b1 | Bigramma di caratteri (c0 c+1) |
| b2 | Bigramma di caratteri (c+1 c+2) |
| b3 | Bigramma di caratteri (c+2 c+3) |
| d7 | Tipo di carattere bigramma (t-3 t-2) |
| d8 | Tipo di carattere bigramma (t-2 t-1) |
| d9 | Tipo di carattere bigramma (t-1 t0) |
| d1 | Tipo di carattere bigramma (t0 t+1) |
| d2 | Tipo di carattere bigramma (t+1 t+2) |
| d3 | Tipo di carattere bigramma (t+2 t+3) |
| altri | Se si specifica una funzione caratteristica personalizzata nell'array featset, la funzione verrà chiamata con due argomenti _te i, dove _tè una funzione che prende una posizione je restituisce l'oggetto carattere in quella posizione ed iè la posizione corrente. Un oggetto carattere è un oggetto con due proprietà ce tche sono rispettivamente carattere e tipo di carattere. Il valore restituito di tale funzione viene utilizzato come valore della caratteristica. (Ad esempio, se specifichi una funzione f(_t, i)quale returns _t(i).t;, restituisce il tipo di carattere della posizione corrente, che è sostanzialmente uguale al modello c0.) |
PoS tag list in Chinese
| Etichetta | Descrizione |
|---|---|
| ANNO DOMINI | Avverbio |
| COME | Particelle d'aspetto |
| BA | ba3 (nella costruzione ba) |
| CC | Congiunzione coordinativa |
| CD | numero cardinale |
| CS | Congiunzione subordinata |
| DIC | de5 (Complementatore/Nominalizzatore) |
| GRADO | de5 (genitivo/associativo) |
| DER | de5 (Risultativo) |
| DEV | de5 (Modo) |
| DT | Determinante |
| ECCETERA | Altri |
| FW | Parola straniera |
| ij | Interiezione |
| JJ | Altro modificatore di sostantivo |
| LIBBRE | bei4 (nella costruzione bei lunga) |
| LC | Localizzatore |
| M | Misura le parole |
| MSP | Altre particelle |
| NN | Altro sostantivo |
| NN-CORTO | Altro sostantivo (abbrev.) |
| NR | Nome proprio |
| NR-CORTO | Nome proprio (abbrev.) |
| NT | Sostantivo temporale |
| NT-CORTO | Sostantivo temporale (abbrev.) |
| OD | Numero ordinale |
| SU | Onomatopea |
| P | Preposizione |
| PN | Pronome |
| PU | Punteggiatura |
| SB | bei4 (in breve bei-costruzione) |
| SP | Particella finale della frase |
| URL | URL |
| VA | Aggettivo predicativo |
| V.C | Copula |
| VE | tu3 (verbo principale) |
| VV | Altro verbo |
| X | Altri |
PoS tag list in Japanese and correspondence to BCCWJ tags
| Etichetta | Nome originale JA | Inglese |
|---|---|---|
| AC | aggettivo generale | Aggettivo-Comune |
| A-dp | aggettivo - possibile non autosufficiente | Dipendente dall'aggettivo |
| C | raccogliere le parole | Congiunzione |
| D | pronome | Pronome |
| E | Inglese | parola inglese |
| F | avverbio | Avverbio |
| Circuito integrato | verbo mobile generale | Interiezione-Comune |
| jc | Forma parola-generale | Sostantivo aggettivale-comune |
| J-tari | Forma parola-タリ | Sostantivo aggettivale-Tari |
| J-xs | Forma la radice della parola ausiliaria | Sostantivo aggettivale-AuxVerbo radice |
| M-aa | Marchio di sovvenzione-AA | Segno ausiliario-AA |
| Mc | Sovvenzione generale | Segno ausiliario-comune |
| M-cp | Parentesi chiuse con segno supplementare | Segno ausiliario: parentesi aperta |
| Mocio | Marchio di sovvenzione - parentesi aperte | Segno ausiliario: chiudi parentesi |
| deputato | Periodo di riferimento del sussidio | Segno-periodo ausiliario |
| Non | sostantivo - sostantivo | Sostantivo-Sostantivo |
| N-nc | sostantivo - nome comune | Sostantivo-sostantivo comune |
| N-pn | sostantivo - nome proprio | Sostantivo-nome proprio |
| N-x | radice sostantivo-ausiliaria | Sostantivo-AuxVerbo stelo |
| O | そのlui | Altri |
| P | connettore | Prefisso |
| P-fj | particella-avverbio particella | Particella-Avverbiale |
| P-jj | Particella - particella quasi-corpo | Frasale particellare |
| Pk | Particella-caso di particelle | Marcatura di casi di particelle |
| P-rj | particella - particella | Legame di particelle |
| P-sj | Particella: particella connettiva | Congiuntivo particellare |
| Qa | aggettivo-suffisso | Aggettivo-suffisso |
| Qj | suffisso: parola di forma | Sostantivo suffisso-aggettivale |
| Qn | suffisso - sostantivo | Suffisso-sostantivo |
| Qv | suffisso-verbo | Suffisso-Verbo |
| R | parole congiunte | Aggettivo adnominale |
| SC | Notazione generale | Segno-comune |
| SL | testo-token | Lettera-segno |
| U | URL | URL |
| Vc | verbo generale | Verbo-comune |
| V-dp | Verbo: possibile non autosufficiente | Dipendente dal verbo |
| W | vuoto | Spazio bianco |
| X | verbo ausiliare | AuxVerbo |
Ringraziamenti
Gli sviluppatori desiderano ringraziare Satoshi Sekine, Satoko Marumoto, Yoichi Yoshimoto, Keiji Shinzato, Keita Yaegashi e Soh Masuko per il loro contributo a questo progetto.
Riferimenti
Masato Hagiwara e Satoshi Sekine. Analizzatore morfologico cinese/giapponese leggero lato client basato sull'apprendimento online. Sessione dimostrativa COLING 2014, pagine 39-43, 2014. [ PDF ]
Kikuo Maekawa. Compilazione del corpus Kotonoha-BCCWJ (in giapponese). Nihongo no kenkyu (Studi in giapponese), 4(1):82–95, 2008. (Alcune informazioni in inglese possono essere trovate qui .) [ Sito ]
Jialei Wang, Peilin Zhao e Steven C. Hoi. Apprendimento esatto ponderato con confidenza morbida. In Proc. di ICML 2012, pagine 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. Natural Language Engineering, 11(2):207–238, 2005. [ PDF ] [ Sito ]
© 2014, 2015 Rakuten NLP Project. Tutti i diritti riservati. / Sponsorizzato da Rakuten, Inc. e Rakuten Institute of Technology .

