Invoering
Rakuten MA (morfologische analysator) is een morfologische analysator (woordsegmentor + PoS Tagger) voor Chinees en Japans, puur geschreven in JavaScript.
Rakuten MA heeft de volgende unieke kenmerken:
- Pure JavaScript-implementatie. Werkt zowel op moderne browsers als op node.js.
- Implementeert een taalonafhankelijk tekentaggingmodel. Voert woordsegmentatie en PoS-tags uit voor Chinees/Japans.
- Ondersteunt de stapsgewijze update van modellen door online leren (Soft Confidence Weighted, Wang et al. ICML 2012).
- Aanpasbare functieset.
- Ondersteunt hashing, kwantisering en snoeien van functies voor compacte modelweergave.
- Gebundeld met Chinese en Japanse modellen die zijn getraind op basis van algemene corpora (CTB [Xue et al. 2005] en BCCWJ [Maekawa 2008]) en e-commerce corpora.
Demo
U kunt Rakuten MA uitproberen op de demopagina (het kan even duren voordat deze pagina is geladen).
Gebruik
Download & Install
Omdat Rakuten MA een JavaScript-bibliotheek is, is installatie niet nodig. Kloon de git-repository als
1git clone https://github.com/rakuten-nlp/rakutenma.git
of download het zip-archief hier: https://github.com/rakuten-nlp/rakutenma/archive/master.zip
Als u Node.js hebt geïnstalleerd, kunt u de demo uitvoeren via
1node demo.js
wat identiek is aan het onderstaande gebruiksvoorbeeld.
npm package
U kunt Rakuten MA ook als npm-pakket gebruiken. U kunt het als volgt installeren:
1npm install rakutenma
De modelbestanden vindt u onder 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)
Neem het volgende codefragment op in <head>
uw 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>
De analyse en het resultaat zien er als volgt uit:
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
- Laad een bestaand model, bijvoorbeeld
model = JSON.parse(fs.readFileSync("model_file"));
danrma = new RakutenMA(model);
ofrma.set_model(model);
- Specificeer
featset
afhankelijk van uw taal (bijvoorbeeldrma.featset = RakutenMA.default_featset_zh;
voor Chinees enrma.featset = RakutenMA.default_featset_ja;
voor Japans). - Vergeet niet om de 15-bit feature hashing-functie (
rma.hash_func = RakutenMA.create_hash_func(15);
) te gebruiken bij gebruik van de gebundelde modellen (model_zh.json
enmodel_ja.json
). - Gebruik
rma.tokenize(input)
om uw invoer te analyseren.
Training your own analysis model from scratch
- Bereid uw trainingscorpus voor (een reeks trainingszinnen waarbij een zin slechts een reeks correcte [token, PoS-tag] is).
- Initialiseer een RakutenMA-instantie met
new RakutenMA()
. - Geef op
featset
(en optioneel,ctype_func
,hash_func
, enz.) - Voer uw trainingszinnen één voor één in (van de eerste tot de laatste) aan de
train_one(sent)
methode. - Normaal gesproken convergeert SCW voldoende na één keer
epoch
(één keer door het hele trainingscorpus), maar u kunt stap 4 herhalen om nog betere prestaties te bereiken.
Zie scripts/train_zh.js
(voor Chinees) en scripts/train_ja.js
(voor Japans) voor een voorbeeld van hoe u uw eigen model kunt trainen.
Re-training an existing model (domain adaptation, fixing errors, etc.)
- Laad een bestaand model en initialiseer een RakutenMA-instantie (zie 'Gebundelde modellen gebruiken om Chinese/Japanse zinnen te analyseren' hierboven)
- Bereid uw trainingsgegevens voor (dit kan slechts een paar zinnen zijn, afhankelijk van wat en hoeveel u wilt "opnieuw trainen").
- Voer uw trainingszinnen één voor één in op de
train_one(sent)
methode.
Reducing the model size
De modelgrootte kan nog steeds een probleem zijn voor distributie aan de clientzijde, zelfs na het toepassen van feature-hashing. We hebben een script toegevoegd scripts/minify.js
dat feature-kwantisering toepast (zie [Hagiwara en Sekine COLING 2014] voor de details) om de getrainde modelgrootte te verkleinen.
U kunt het uitvoeren node scripts/minify.js [input_model_file] [output_model_file]
om een verkleinde versie van het modelbestand te maken.
Let op: het verwijdert ook het 'sigma'-gedeelte van het getrainde model, wat betekent dat u het verkleinde model niet langer opnieuw kunt trainen. Indien nodig kunt u het opnieuw trainen eerst het model en verklein het vervolgens.
API-documentatie
Constructeur | Beschrijving |
---|---|
RakutenMA(model, phi, c) |
Creëert een nieuwe RakutenMA-instantie. model (optioneel) specificeert het modelobject waarmee de RakutenMA-instantie moet worden geïnitialiseerd. phi en c (beide optioneel) zijn hyperparameters van SCW (standaard: phi = 2048 , c = 0.003906 ). |
Methoden | Beschrijving |
---|---|
tokenize(input) |
Tokeniseert input (tekenreeks) en retourneert een getokeniseerd resultaat ([token, PoS tag]-paren). |
train_one(sent) |
Werkt het huidige model bij (indien nodig) met behulp van het gegeven antwoord sent ([token, PoS tag]-paren). De geretourneerde waarde is een object met drie eigenschappen ans , sys , en updated , waar ans is het gegeven antwoord (hetzelfde als sent ), sys is de systeemuitvoer met het (oude) model, en updated is een binaire (True/False) vlag die aangeeft of het model is bijgewerkt (omdat sys het anders was dan ans ) of niet. |
set_model(model) |
Stelt het model van de Rakuten MA-instantie in op model . |
set_tag_scheme(scheme) |
Stelt het tagschema voor sequentiële labels in. Momenteel worden "IOB2" deze "SBIEO" ondersteund. Het opgeven van andere tagschema's veroorzaakt een uitzondering. |
Eigenschappen | Beschrijving |
---|---|
featset |
Specificeert een reeks functiesjablonen (tekenreeksen) die worden gebruikt voor analyse. U kunt RakutenMA.default_featset_ja en gebruiken RakutenMA.default_featset_zh als standaardfunctiesets voor respectievelijk Japans en Chinees. Zie hieronder ('Ondersteunde functiesjablonen') voor meer informatie over functiesjablonen. |
ctype_func |
Specificeert de functie die wordt gebruikt om een teken naar het tekentype te converteren. RakutenMA.ctype_ja_default_func is de standaard tekentypefunctie die wordt gebruikt voor Japans. Als alternatief kunt u RakutenMA.create_ctype_chardic_func(chardic) een tekentypefunctie aanroepen die een teken nodig heeft om het op te zoeken chardic en de waarde ervan terug te geven. (Voor retourneert bijvoorbeeld RakutenMA.create_ctype_chardic_func({"A": "type1"}) een functie f waarbij f("A") retourneert "type1" en [] anders.) |
hash_func |
Specificeert de hash-functie die moet worden gebruikt voor feature-hashing. Standaard = undefined (geen feature-hashing). Een feature-hash-functie met bit -bit hash-ruimte kan worden gemaakt door RakutenMA.create_hash_func(bit) . |
Voorwaarden
Distributie, wijziging en academisch/commercieel gebruik van Rakuten MA is toegestaan, op voorwaarde dat u voldoet aan de Apache-licentie versie 2.0 http://www.apache.org/licenses/LICENSE-2.0.html .
Als u Rakuten MA voor onderzoeksdoeleinden gebruikt, citeer dan ons artikel over Rakuten MA [Hagiwara en Sekine 2014]
FAQ (veelgestelde vragen)
V. Wat zijn ondersteunde browsers en Node.js-versies?
- A. We hebben bevestigd dat Rakuten MA in de volgende omgevingen draait:
- Internet Explorer 8 (versie 8.0.7601.17414 of hoger)
- Google Chrome (versie 35.0.1916.153 of hoger)
- Firefox (versie 16.0.2 of hoger)
- Safari (versie 6.1.5 of hoger)
- Node.js (versie 0.10.13 of hoger)
V. Is commercieel gebruik toegestaan?
- A. Ja, zolang u zich aan de algemene voorwaarden houdt. Zie 'Algemene voorwaarden' hierboven voor meer informatie.
V. Ik heb een bug/analysefout/etc gevonden. Waar moet ik dit melden?
- A. Maak een probleem aan op Github issues https://github.com/rakuten-nlp/rakutenma/issues .
- Alternatively, je kunt een pull-request aanmaken als je de code wijzigt. Rakuten MA heeft een testsuite met Jasmine http://jasmine.github.io/ . Zorg ervoor dat alle tests slagen (geen fouten na het uitvoeren van
jasmine-node spec
) en schrijf je eigen ( indien nodig) voordat u een pull-verzoek indient. - FinallyAls uw vraag nog steeds niet is opgelost, neem dan contact met ons op via prj-rakutenma [at] mail.rakuten.com.
Q. De resultaten van tokenisatie zien er vreemd uit (de zin is met name opgesplitst in afzonderlijke tekens zonder PoS-tags)
- A. Controleer of u dezelfde functieset (
featset
) en de functie-hashing-functie (hash_func
) gebruikt die voor training worden gebruikt. Vergeet niet de 15-bits functie-hashing-functie (rma.hash_func = RakutenMA.create_hash_func(15);
) te gebruiken wanneer u de gebundelde modellen (model_zh.json
enmodel_ja.json
) gebruikt.
V. Welke scripts (vereenvoudigd/traditioneel) worden ondersteund voor Chinees?
- A. Momenteel wordt alleen vereenvoudigd Chinees ondersteund.
V. Kunnen we hetzelfde modelbestand in JSON-indeling gebruiken voor browsers?
- A. Ja en nee. Hoewel de interne gegevensstructuur van modellen hetzelfde is, moet u een toewijzing (bijvoorbeeld
var model = [JSON representation];
) toevoegen om ernaar te verwijzen in browsers. Bekijk het verschil tussenmodel_zh.json
(voor Node.js) enmodel_zh.js
(voor browsers). Er is een miniscriptscripts/convert_for_browser.js
dat dit voor u doet. We raden u aan om aan Node.js te werken voor modeltraining etc. en het vervolgens te converteren voor browsergebruik.
Bijlage
Supported feature templates
Functiesjabloon | Beschrijving |
---|---|
w7 | Karakterunigram (c-3) |
w8 | Karakterunigram (c-2) |
w9 | Karakterunigram (c-1) |
w0 | Tekenunigram (c0) |
w1 | Tekenunigram (c+1) |
w2 | Tekenunigram (c+2) |
w3 | Tekenunigram (c+3) |
c7 | Tekentype unigram (t-3) |
c8 | Tekentype unigram (t-2) |
c9 | Tekentype unigram (t-1) |
c0 | Tekentype unigram (t0) |
c1 | Tekentype unigram (t+1) |
c2 | Tekentype unigram (t+2) |
c3 | Tekentype unigram (t+3) |
b7 | Karakterbigram (c-3 c-2) |
b8 | Karakterbigram (c-2 c-1) |
b9 | Karakterbigram (c-1 c0) |
b1 | Karakterbigram (c0 c+1) |
b2 | Karakterbigram (c+1 c+2) |
b3 | Karakterbigram (c+2 c+3) |
d7 | Tekentype biggram (t-3 t-2) |
d8 | Tekentype bigram (t-2 t-1) |
d9 | Tekentype biggram (t-1 t0) |
d1 | Tekentype biggram (t0 t+1) |
d2 | Tekentype biggram (t+1 t+2) |
d3 | Tekentype biggram (t+2 t+3) |
anderen | Als u een aangepaste featurefunctie in de featset array opgeeft, wordt de functie aangeroepen met twee argumenten _t en i , waar _t is een functie die een positie inneemt j en het karakterobject op die positie retourneert, en i de huidige positie is. met twee eigenschappen c en t die respectievelijk karakter en karaktertype zijn. De geretourneerde waarde van die functie wordt gebruikt als de featurewaarde. (Als u bijvoorbeeld een functie opgeeft f(_t, i) die returns _t(i).t; , retourneert deze het tekentype van de huidige positie, namelijk in principe hetzelfde als de sjabloon c0 .) |
PoS tag list in Chinese
Label | Beschrijving |
---|---|
ADVERTENTIE | Bijwoord |
ALS | Aspectdeeltjes |
BA | ba3 (in ba-constructie) |
CC | Coördinerende conjunctie |
CD | hoofdtelwoord |
CS | Ondergeschikte conjunctie |
DEC | de5 (aanvuller/nominalisator) |
GR | de5 (genitief/associatief) |
DER | de5 (Resultatief) |
DEV | de5 (Manier) |
DT | Bepaler |
ENZ | Anderen |
FW | Buitenlands woord |
ij | Tussenwerpsel |
JJ | Andere zelfstandig naamwoord-modificator |
POND | bei4 (in lange bei-constructie) |
LC | Localisator |
M | Meetwoord |
MSP | Andere deeltjes |
NN | Ander zelfstandig naamwoord |
NN-KORT | Ander zelfstandig naamwoord (afkorting) |
NR | Eigen naam |
NR-KORT | Eigennaam (afkorting) |
NT | Tijdelijk zelfstandig naamwoord |
NT-KORT | Tijdelijk zelfstandig naamwoord (afkorting) |
O.D | Rangtelwoord |
OP | Onomatopee |
P | Voorzetsel |
PN | Voornaamwoord |
PU | Interpunctie |
SB | bei4 (kortweg bei-constructie) |
SP | Zin-finale deeltje |
URL | URL |
VA | Predicatief bijvoeglijk naamwoord |
VC | Koppelwoord |
VE | jij3 (hoofdwerkwoord) |
VV | Ander werkwoord |
X | Anderen |
PoS tag list in Japanese and correspondence to BCCWJ tags
Label | Originele JA-naam | Engels |
---|---|---|
Ac | bijvoeglijk naamwoord-algemeen | Bijvoeglijk naamwoord-gemeenschappelijk |
A-dp | bijvoeglijk naamwoord - niet-zelfredzaam mogelijk | Bijvoeglijk naamwoord-afhankelijk |
C | woorden oppakken | Voegwoord |
D | voornaamwoord | Voornaamwoord |
E | Engels | Engels woord |
F | bijwoord | Bijwoord |
Ik | bewegend werkwoord-algemeen | Tussenwerpsel-algemeen |
jc | Vorm woord-algemeen | Bijvoeglijk naamwoord-gemeenschappelijk |
J-tari | Vorm woord-タリ | Bijvoeglijk naamwoord-Tari |
J-xs | Vorm woord-hulpwoordstam | Bijvoeglijk naamwoord-AuxVerb stam |
M-aa | Subsidiemerk-AA | Hulpbord-AA |
Mc | Subsidiemerk-algemeen | Hulpteken-gemeenschappelijk |
M-cp | Aanvullende merk-gesloten haakjes | Hulpteken-haakje openen |
Dweil | Subsidieteken - open haakjes | Hulpteken-haakje sluiten |
Kamerlid | Subsidiemerkperiode | Hulpteken-periode |
Nn | zelfstandig naamwoord - zelfstandig naamwoord | Zelfstandig naamwoord |
N-nc | zelfstandig naamwoord - zelfstandig naamwoord | Zelfstandig naamwoord |
N-pn | zelfstandig naamwoord - eigennaam | Zelfstandig naamwoord |
N-xs | zelfstandig naamwoord-hulpstam | Zelfstandig naamwoord-AuxVerb stam |
O | そのhem | Anderen |
P | aansluiting | Voorvoegsel |
P-fj | deeltje-bijwoord deeltje | Deeltjes-bijwoordelijk |
P-jj | Deeltje - quasi-lichaamsdeeltje | Deeltjeszin |
PK | Deeltjes-geval deeltje | Markering van deeltjesbehuizing |
P-rj | deeltje - deeltje | Deeltjesbindend |
P-sj | Deeltje - verbindend deeltje | Deeltjes-conjunctief |
Qa | achtervoegsel-bijvoeglijk naamwoord | Achtervoegsel-bijvoeglijk naamwoord |
Qj | achtervoegsel - vormwoord | Achtervoegsel-bijvoeglijk naamwoord |
Qn | achtervoegsel - zelfstandig naamwoord | Achtervoegsel-zelfstandig naamwoord |
Qv | achtervoegsel-werkwoord | Achtervoegsel-werkwoord |
R | samengevoegde woorden | Adnominaal bijvoeglijk naamwoord |
sc | Notatie-algemeen | Teken-gemeenschappelijk |
SL | token-tekst | Tekenbrief |
U | URL | URL |
Vc | werkwoord-algemeen | Werkwoord-gemeenschappelijk |
V-dp | Werkwoord - niet-zelfredzaam mogelijk | Werkwoordafhankelijk |
W | blanco | Witte ruimte |
X | hulpwerkwoord | Hulpwerkwoord |
Dankbetuigingen
De ontwikkelaars willen Satoshi Sekine, Satoko Marumoto, Yoichi Yoshimoto, Keiji Shinzato, Keita Yaegashi en Soh Masuko bedanken voor hun bijdrage aan dit project.
Referenties
Masato Hagiwara en Satoshi Sekine. Lichtgewicht Chinees/Japanse morfologische analyser aan de clientzijde, gebaseerd op online leren. COLING 2014 demosessie, pagina's 39-43, 2014. [ PDF ]
Kikuo Maekawa. Compilatie van het Kotonoha-BCCWJ-corpus (in het Japans). Nihongo no kenkyu (Studies in het Japans), 4(1):82–95, 2008. (Enige Engelse informatie kunt u hier vinden .) [ Site ]
Jialei Wang, Peilin Zhao en Steven C. Hoi. Exact zacht, op vertrouwen gewogen leren. In Proc. van ICML 2012, pagina's 121–128, 2012. [ PDF ]
Naiwen Xue, Fei Xia, Fu-dong Chiou en Marta Palmer. De Chinese boombank van Penn: Annotatie van de zinsstructuur van een groot corpus. Natural Language Engineering, 11(2):207–238, 2005. [PDF ] [ Site ]
© 2014, 2015 Rakuten NLP Project. Alle rechten voorbehouden. / Gesponsord door Rakuten, Inc. en Rakuten Institute of Technology .