Leggimi giapponese (日本语ドキュメント)
introduzione
Rakuten MA (analizzatore morfologico) è un analizzatore morfologico (word segmenter + PoS Tagger) per cinese e giapponese scritto esclusivamente in JavaScript.
Rakuten MA ha le seguenti caratteristiche uniche:
- Pura implementazione JavaScript Funziona sia sui browser moderni che su node.js.
- Implementa un modello di tagging dei caratteri indipendente dalla lingua e genera la segmentazione delle parole e i tag PoS per cinese/giapponese.
- Supporta l'aggiornamento incrementale dei modelli tramite l'apprendimento online (Soft Confidence Weighted, Wang et al. ICML 2012).
- Set di funzionalità personalizzabili.
- Supporta funzionalità di hashing, quantizzazione e sfoltimento 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 sulla pagina demo (potrebbe volerci un po' di tempo per caricare questa pagina).
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 con
1node demo.js
che è identico all'esempio di utilizzo riportato di seguito.
npm package
Puoi anche usare Rakuten MA come pacchetto npm Puoi installarlo:
1npm install rakutenma
I file del modello si trovano 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 frammento di codice nel <head>
tuo 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 questo:
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
- Carica un modello esistente, ad esempio,
model = JSON.parse(fs.readFileSync("model_file"));
quindirma = new RakutenMA(model);
orma.set_model(model);
- Specifica in
featset
base alla tua lingua (ad es.rma.featset = RakutenMA.default_featset_zh;
per cinese erma.featset = RakutenMA.default_featset_ja;
giapponese). - Ricordarsi di utilizzare la funzione di hashing 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 il tuo input.
Training your own analysis model from scratch
- Prepara il tuo corpus di addestramento (un insieme di frasi di addestramento in cui una frase è solo una serie di [token, tag PoS] corretti.)
- Inizializza un'istanza RakutenMA con
new RakutenMA()
. - Specificare
featset
(E FACOLTATIVAMENTE,ctype_func
,hash_func
, ecc.) - Alimenta le tue frasi di allenamento una per una (dalla prima all'ultima) al
train_one(sent)
metodo. - Di solito SCW converge abbastanza dopo uno
epoch
(un passaggio attraverso l'intero corpus di allenamento) ma è possibile ripetere il passaggio 4. per ottenere prestazioni ancora migliori.
Vedere scripts/train_zh.js
(per il cinese) e scripts/train_ja.js
(per il giapponese) per vedere un esempio che mostra come addestrare il proprio 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 in cinese/giapponese" sopra)
- Prepara i tuoi dati di allenamento (potrebbero essere solo un paio di frasi, a seconda di cosa e quanto vuoi "riqualificare".)
- Alimenta le tue frasi di allenamento una per una al
train_one(sent)
metodo.
Reducing the model size
La dimensione del modello potrebbe essere ancora un problema per la distribuzione lato client anche dopo l'applicazione dell'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 le dimensioni del modello addestrato.
Puoi eseguirlo node scripts/minify.js [input_model_file] [output_model_file]
per creare una versione ridotta del file del modello.
Ricorda: elimina anche la parte "sigma" del modello addestrato, il che significa che non sei più in grado di riaddestrare il modello minimizzato. Se necessario, riaddestrare prima il modello, quindi minimizzarlo.
Documentazione API
Costruttore | Descrizione |
---|---|
RakutenMA(model, phi, c) |
. Crea RakutenMA Una nuova nuova istanza model specifica (opzionale) all'oggetto esempio Modello con il inizializzare il RakutenMA. phi E c (entrambi opzionali) sono iper parametri del SCW (default: phi = 2048 , c = 0.003906 ). |
metodi | Descrizione |
---|---|
tokenize(input) |
Tokenizza input (stringa) e restituisce il risultato tokenizzato (coppie [token, PoS tag]). |
train_one(sent) |
Gli aggiornamenti Il modello corrente (SE necessario) l'utilizzo della risposta GIVEN sent ([token, the PoS Tag] coppie) Del valore restituito È UN Oggetto con tre proprietà ans , sys , e updated , DOV'È ans La risposta GIVEN (Same AS sent ), sys IS L'output di sistema utilizza il (vecchio) modello ed updated è un flag binario (vero/falso) che indica se il modello è stato aggiornato (perché sys era diverso da ans ) o meno. |
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 una serie 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. Vedere di seguito ("Modelli di funzionalità supportati") per i dettagli dei modelli di funzionalità. |
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 richiede un carattere per cercarlo chardic e restituisce il suo 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à.Predefinito = undefined (nessun hashing delle funzionalità).Una funzione di hashing delle funzionalità con bit spazio hash a -bit può essere creata 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 l'utente sia conforme alla versione 2.0 della licenza Apache http://www.apache.org/licenses/LICENSE-2.0.html .
Se stai usando Rakuten MA per scopi di ricerca, ti preghiamo di citare 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 (versione 8.0.7601.17414 o successiva)
- Google Chrome (ver. 35.0.1916.153 o superiore)
- Firefox (ver. 16.0.2 o superiore)
- Safari (ver. 6.1.5 o superiore)
- Node.js (ver. 0.10.13 o superiore)
D. È consentito l'uso commerciale?
- R. Sì, purché rispetti i termini e le condizioni.Vedi "Termini e condizioni" sopra per i dettagli.
D. Ho trovato un bug/errore di analisi/ecc. Dove devo segnalare?
- 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 usando 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. Verificare se si sta utilizzando lo stesso set di funzioni (
featset
) e la funzione di hashing delle funzioni (hash_func
) utilizzata per l'addestramento. Ricordarsi di utilizzare la funzione di hashing delle funzioni 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 interna dei modelli sia la stessa, è necessario aggiungere l'assegnazione (ad es.
var model = [JSON representation];
) per fare riferimento ad essa sui browser. Vedere la differenza tramodel_zh.json
(per Node.js) emodel_zh.js
(per browser). C'è 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.
Appendice
Supported feature templates
Modello di funzionalità | Descrizione |
---|---|
w7 | Unigramma di carattere (c-3) |
w8 | Unigramma di carattere (c-2) |
w9 | Unigramma di carattere (c-1) |
w0 | Unigramma di caratteri (c0) |
w1 | Unigramma di carattere (c+1) |
w2 | Unigramma di carattere (c+2) |
w3 | Unigramma di carattere (c+3) |
c7 | Tipo di carattere unigramma (t-3) |
c8 | Tipo di carattere unigramma (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 specifichi una funzione caratteristica personalizzata featset nell'array, 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 si specifica una funzione f(_t, i) che returns _t(i).t; , restituisce il tipo di carattere della posizione corrente, che è sostanzialmente lo stesso del modello c0 .) |
PoS tag list in Chinese
Etichetta | Descrizione |
---|---|
ANNO DOMINI | Avverbio |
COME | Aspetto Particella |
BA | ba3 (in ba-costruzione) |
CC | Congiunzione coordinativa |
cd | numero cardinale |
CS | Congiunzione subordinata |
DEC | de5 (Complementatore/Nominalizzatore) |
DEG | de5 (genitivo/associativo) |
DER | de5 (Risultante) |
DEV | de5 (modo) |
DT | Determinatore |
ECCETERA | Altri |
FW | Parola straniera |
IJ | Interiezione |
JJ | Altro sostantivo modificatore |
LIBBRE | bei4 (in costruzione bei lunga) |
LC | Localizzatore |
m | Misura le parole |
MSP | Altra particella |
NN | altro sostantivo |
NN-CORTO | Altro nome (abbreviato) |
NR | Nome proprio |
NR-CORTO | Nome proprio (abbreviato) |
NT | sostantivo temporale |
NT-CORTO | Sostantivo temporale (abbreviato) |
OD | Numero ordinale |
SU | onomatopea |
P | Preposizione |
PN | Pronome |
PU | Punteggiatura |
SB | bei4 (in breve bei-costruzione) |
SP | Frase finale Particella |
URL | URL |
VA | Aggettivo predicativo |
VC | Copula |
VE | tu3 (verbo principale) |
VV | Altro verbo |
X | Altri |
PoS tag list in Japanese and correspondence to BCCWJ tags
Etichetta | Nome JA originale | inglese |
---|---|---|
AC | Aggettivo-generale | Aggettivo-Comune |
A-dp | Aggettivi-non autosufficienti | Aggettivo-dipendente |
C | Parole di collegamento | Congiunzione |
D | sinonimo | Pronome |
E | inglese | parola inglese |
F | avverbio | Avverbio |
Circuito integrato | Verbi commoventi-Generale | Interiezione-Comune |
Jc | Forma parole-generale | Aggettivo Sostantivo-Comune |
J-tari | Forma parola-タリ | Sostantivo aggettivale-Tari |
J-xs | Forma parole-radice del verbo ausiliario | radice aggettivale sostantivo-verbo ausiliario |
M-aa | Marchio di sovvenzione-AA | Segno ausiliario-AA |
Mc | Segno di sovvenzione generale | Segno ausiliario-Comune |
M-cp | Parentesi chiusa con segno di sovvenzione | Segno ausiliario-parentesi aperta |
Mocio | Segno di sovvenzione aperto tra parentesi | Segno ausiliario-Chiudi parentesi |
Mp | Periodo di contrassegno del sussidio | Segno ausiliario-Periodo |
Nn | sostantivo-sostantivo | nome-nome |
N-nc | Sostantivo-nome comune | Sostantivo-Nome Comune |
N-pn | Sostantivo-nome proprio | Sostantivo-nome proprio |
N-xs | Sostantivo-verbo ausiliario radice | Sostantivo-AuxVerb radice |
oh | ? | Altri |
P | Parole congiunte | Prefisso |
P-fj | Ausiliario-avverbiale | Particella-avverbiale |
P-jj | Parole ausiliarie-Parole ausiliarie quasi-soggettive | Frase-particella |
Pk | Parole ausiliarie-Parole ausiliarie maiuscole e minuscole | Marcatura di particelle |
P-rj | Parole ausiliarie-Parole ausiliarie | Legame delle particelle |
P-sj | Parole ausiliarie-Parole ausiliarie | Congiuntivo particellare |
Qa | Suffisso-aggettivo | Suffisso-aggettivo |
Qj | Parole a forma di suffisso | Suffisso-aggettivo sostantivo |
Qn | Suffisso-sostantivo | Suffisso-Nome |
Qv | Suffisso-verbale | Suffisso-Verbo |
R | Parole congiunte | Aggettivo adnominale |
Ns | Mark-generale | Segno-Comune |
Sl | Segna-testo | Segno-Lettera |
tu | URL | URL |
Vc | Verbo-generale | Verbo-Comune |
V-dp | Verbi-Indipendenza Possibilità | Verbo-dipendente |
W | vuoto | spazi bianchi |
X | Verbo ausiliare | AuxVerb |
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 demo 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 corretto e ponderato in base alla confidenza. In Proc. of ICML 2012, pagine 121–128, 2012. [ PDF ]
Naiwen Xue, Fei Xia, Fu-dong Chiou e Marta Palmer.The Penn Chinese treebank: Annotazione della struttura della frase di un grande corpus. Natural Language Engineering, 11(2):207–238, 2005. [ PDF ] [ Sito ]
© 2014, Progetto Rakuten NLP 2015. Tutti i diritti riservati. / Sponsorizzato da Rakuten, Inc. e Rakuten Institute of Technology .