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
featset
in 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.json
emodel_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.js
che 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. phi e 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é sys era 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_ja e RakutenMA.default_featset_zh come 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 chardic e restituirne il valore. (Per esempio, RakutenMA.create_ctype_chardic_func({"A": "type1"}) restituisce una funzione f dove 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 bit spazio 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.json
emodel_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.js
che 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 _t e i , dove _t è una funzione che prende una posizione j e restituisce l'oggetto carattere in quella posizione ed i è la posizione corrente. Un oggetto carattere è un oggetto con due proprietà c e t che 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 .