Introduction
Rakuten MA (analyseur morphologique) est un analyseur morphologique (segmenteur de mots + PoS Tagger) pour le chinois et le japonais écrit uniquement en JavaScript.
Rakuten MA présente les caractéristiques uniques suivantes :
- Implémentation JavaScript pure. Fonctionne à la fois sur les navigateurs modernes et sur node.js.
- Implémente un modèle de balisage de caractères indépendant de la langue. Produit une segmentation de mots et des balises PoS pour le chinois/japonais.
- Prend en charge la mise à jour incrémentielle des modèles par apprentissage en ligne (Soft Confidence Weighted, Wang et al. ICML 2012).
- Ensemble de fonctionnalités personnalisables.
- Prend en charge le hachage, la quantification et l’élagage des fonctionnalités pour une représentation compacte du modèle.
- Livré avec des modèles chinois et japonais formés à partir de corpus généraux (CTB [Xue et al. 2005] et BCCWJ [Maekawa 2008]) et de corpus de commerce électronique.
Démo
Vous pouvez essayer Rakuten MA sur la page de démonstration (le chargement de cette page peut prendre un certain temps).
Usage
Download & Install
Puisque Rakuten MA est une bibliothèque JavaScript, aucune installation n'est nécessaire. Clonez le référentiel git en tant que
1git clone https://github.com/rakuten-nlp/rakutenma.git
ou téléchargez l'archive zip à partir d'ici : https://github.com/rakuten-nlp/rakutenma/archive/master.zip
Si Node.js est installé, vous pouvez exécuter la démo en
1node demo.js
qui est identique à l'exemple d'utilisation ci-dessous.
npm package
Vous pouvez également utiliser Rakuten MA en tant que package npm. Vous pouvez l'installer en :
1npm install rakutenma
Les fichiers de modèles peuvent être trouvés sous 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)
Incluez l'extrait de code suivant dans <head>
votre code 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'analyse et le résultat ressemblent à ceci :
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
- Charger un modèle existant, par exemple,
model = JSON.parse(fs.readFileSync("model_file"));
alorsrma = new RakutenMA(model);
ourma.set_model(model);
- Précisez
featset
en fonction de votre langue (par exemple,rma.featset = RakutenMA.default_featset_zh;
pour le chinois etrma.featset = RakutenMA.default_featset_ja;
pour le japonais). - N'oubliez pas d'utiliser la fonction de hachage des fonctionnalités 15 bits (
rma.hash_func = RakutenMA.create_hash_func(15);
) lorsque vous utilisez les modèles fournis (model_zh.json
etmodel_ja.json
). - Utilisez-le
rma.tokenize(input)
pour analyser votre entrée.
Training your own analysis model from scratch
- Préparez votre corpus de formation (un ensemble de phrases de formation où une phrase n'est qu'un tableau de [jeton, balise PoS] corrects).
- Initialisez une instance RakutenMA avec
new RakutenMA()
. - Spécifiez
featset
. (et éventuellement ,ctype_func
,hash_func
etc.) - Nourrissez vos phrases d'entraînement une à une (de la première à la dernière) à la
train_one(sent)
méthode. - Habituellement, SCW converge suffisamment après un
epoch
(un passage à travers l'ensemble du corpus de formation), mais vous pouvez répéter l'étape 4. pour obtenir des performances encore meilleures.
Voir scripts/train_zh.js
(pour le chinois) et scripts/train_ja.js
(pour le japonais) pour voir un exemple montrant comment entraîner votre propre modèle.
Re-training an existing model (domain adaptation, fixing errors, etc.)
- Chargez un modèle existant et initialisez une instance RakutenMA (voir « Utilisation de modèles groupés pour analyser des phrases en chinois/japonais » ci-dessus).
- Préparez vos données d'entraînement (cela peut comprendre quelques phrases seulement, selon ce que vous souhaitez "recycler" et dans quelle mesure).
- Nourrissez vos phrases d’entraînement une par une à la
train_one(sent)
méthode.
Reducing the model size
La taille du modèle pourrait toujours être un problème pour la distribution côté client même après l'application du hachage des fonctionnalités. Nous avons inclus un script scripts/minify.js
qui applique la quantification des fonctionnalités (voir [Hagiwara et Sekine COLING 2014] pour les détails) pour réduire la taille du modèle entraîné.
Vous pouvez l'exécuter node scripts/minify.js [input_model_file] [output_model_file]
pour créer une version minifiée du fichier modèle.
N'oubliez pas : il supprime également la partie "sigma" du modèle entraîné, ce qui signifie que vous ne pouvez plus réentraîner le modèle minifié. Si nécessaire, réentraîner le modèle d'abord, puis réduisez-le.
Documentation API
Constructeur | Description |
---|---|
RakutenMA(model, phi, c) |
Crée une nouvelle instance RakutenMA. model (facultatif) spécifie l'objet modèle avec lequel initialiser l'instance RakutenMA. phi et c (tous deux facultatifs) sont des hyper paramètres de SCW (par défaut : phi = 2048 , c = 0.003906 ). |
Méthodes | Description |
---|---|
tokenize(input) |
Tokenise input (chaîne) et renvoie le résultat tokenisé (paires [token, PoS tag]). |
train_one(sent) |
Met à jour le modèle actuel (si nécessaire) en utilisant la réponse donnée sent (paires [token, PoS tag]). La valeur de retour est un objet avec trois propriétés ans , sys , et updated , où ans est la réponse donnée (identique à sent ), sys est la sortie du système utilisant l'(ancien) modèle, et updated est un indicateur binaire (Vrai/Faux) indiquant si le modèle a été mis à jour (car sys il était différent de ans ) ou non. |
set_model(model) |
Définit le modèle de l'instance Rakuten MA sur model . |
set_tag_scheme(scheme) |
Définit le schéma de balises d'étiquetage séquentiel. Actuellement, "IOB2" et "SBIEO" sont pris en charge. La spécification d'autres schémas de balises provoque une exception. |
Propriétés | Description |
---|---|
featset |
Spécifie un tableau de modèles de fonctionnalités (chaîne) utilisés pour l'analyse. Vous pouvez utiliser RakutenMA.default_featset_ja et RakutenMA.default_featset_zh comme ensembles de fonctionnalités par défaut pour le japonais et le chinois, respectivement. Voir ci-dessous (« Modèles de fonctionnalités pris en charge ») pour plus de détails sur les modèles de fonctionnalités. |
ctype_func |
Spécifie la fonction utilisée pour convertir un caractère en son type de caractère. RakutenMA.ctype_ja_default_func est la fonction de type de caractère par défaut utilisée pour le japonais. Vous pouvez également appeler RakutenMA.create_ctype_chardic_func(chardic) pour créer une fonction de type de caractère qui prend un caractère pour le rechercher chardic et renvoyer sa valeur. (Pour exemple, RakutenMA.create_ctype_chardic_func({"A": "type1"}) renvoie une fonction f où f("A") renvoie "type1" et [] autrement.) |
hash_func |
Spécifie la fonction de hachage à utiliser pour le hachage de fonctionnalités. Par défaut = undefined (pas de hachage de fonctionnalités). Une fonction de hachage de fonctionnalités avec bit un espace de hachage de -bit peut être créée en appelant RakutenMA.create_hash_func(bit) . |
Termes et conditions
La distribution, la modification et l'utilisation académique/commerciale de Rakuten MA sont autorisées, à condition que vous vous conformiez à la licence Apache version 2.0 http://www.apache.org/licenses/LICENSE-2.0.html .
Si vous utilisez Rakuten MA à des fins de recherche, veuillez citer notre article sur Rakuten MA [Hagiwara et Sekine 2014]
FAQ (Foire aux questions)
Q. Quels sont les navigateurs et les versions de Node.js pris en charge ?
- R. Nous avons confirmé que Rakuten MA fonctionne dans les environnements suivants :
- Internet Explorer 8 (ver. 8.0.7601.17414 ou supérieure)
- Google Chrome (version 35.0.1916.153 ou supérieure)
- Firefox (version 16.0.2 ou supérieure)
- Safari (version 6.1.5 ou supérieure)
- Node.js (ver. 0.10.13 ou supérieure)
Q. L'utilisation commerciale est-elle autorisée ?
- R. Oui, à condition de respecter les termes et conditions. Voir « Conditions générales » ci-dessus pour plus de détails.
Q. J'ai trouvé un bug / une erreur d'analyse / etc. Où dois-je le signaler ?
- A. Veuillez créer un problème sur les problèmes Github https://github.com/rakuten-nlp/rakutenma/issues .
- Alternatively, vous pouvez créer une pull request si vous modifiez le code. Rakuten MA dispose d'une suite de tests utilisant Jasmine http://jasmine.github.io/ . Veuillez vous assurer que tous les tests réussissent (aucune erreur après l'exécution
jasmine-node spec
) et écrivez le vôtre ( si nécessaire) avant de soumettre une pull request. - Finally, si votre question n'est toujours pas résolue, veuillez nous contacter à prj-rakutenma [at] mail.rakuten.com.
Q. Les résultats de la tokenisation semblent étranges (en particulier, la phrase est divisée en caractères individuels sans balises PoS)
- A. Vérifiez si vous utilisez le même ensemble de fonctionnalités (
featset
) et la même fonction de hachage de fonctionnalités (hash_func
) utilisés pour la formation. N'oubliez pas d'utiliser la fonction de hachage de fonctionnalités 15 bits (rma.hash_func = RakutenMA.create_hash_func(15);
) lorsque vous utilisez les modèles fournis (model_zh.json
etmodel_ja.json
).
Q. Quels scripts (simplifiés/traditionnels) sont pris en charge pour le chinois ?
- R. Actuellement, seul le chinois simplifié est pris en charge.
Q. Pouvons-nous utiliser le même fichier modèle au format JSON pour les navigateurs ?
- R. Oui et non. Bien que la structure de données interne des modèles soit la même, vous devez ajouter une affectation (par exemple,
var model = [JSON representation];
) afin de pouvoir y faire référence sur les navigateurs. Voir la différence entremodel_zh.json
(pour Node.js) etmodel_zh.js
(pour les navigateurs). Il existe un mini scriptscripts/convert_for_browser.js
qui fait cela pour vous. Nous vous recommandons de travailler sur Node.js pour la formation du modèle, etc., puis de le convertir pour les utilisations du navigateur.
annexe
Supported feature templates
Modèle de fonctionnalités | Description |
---|---|
w7 | Unigramme de caractère (c-3) |
w8 | Unigramme de caractère (c-2) |
w9 | Unigramme de caractère (c-1) |
w0 | Unigramme de caractère (c0) |
w1 | Unigramme de caractère (c+1) |
w2 | Unigramme de caractère (c+2) |
w3 | Unigramme de caractère (c+3) |
c7 | Unigramme de type de caractère (t-3) |
c8 | Unigramme de type de caractère (t-2) |
c9 | Unigramme de type de caractère (t-1) |
c0 | Unigramme de type de caractère (t0) |
c1 | Unigramme de type de caractère (t+1) |
c2 | Unigramme de type de caractère (t+2) |
c3 | Unigramme de type de caractère (t+3) |
b7 | Bigramme de caractère (c-3 c-2) |
b8 | Bigramme de caractère (c-2 c-1) |
b9 | Caractère bigramme (c-1 c0) |
b1 | Bigramme de caractères (c0 c+1) |
b2 | Caractère bigramme (c+1 c+2) |
b3 | Caractère bigramme (c+2 c+3) |
d7 | Bigramme de type de caractère (t-3 t-2) |
d8 | Bigramme de type de caractère (t-2 t-1) |
d9 | Bigramme de type de caractère (t-1 t0) |
d1 | Bigramme de type de caractère (t0 t+1) |
d2 | Bigramme de type de caractère (t+1 t+2) |
d3 | Bigramme de type de caractère (t+2 t+3) |
autres | Si vous spécifiez une fonction de fonctionnalité personnalisée dans le featset tableau, la fonction sera appelée avec deux arguments _t et i , où _t est une fonction qui prend une position j et renvoie l'objet caractère à cette position, et i est la position actuelle. Un objet caractère est un objet avec deux propriétés c et t qui sont respectivement caractère et type de caractère. La valeur de retour de cette fonction est utilisée comme valeur de caractéristique. (Par exemple, si vous spécifiez une fonction f(_t, i) which returns _t(i).t; , elle renvoie le type de caractère de la position actuelle, qui est fondamentalement le même que le modèle c0 . ) |
PoS tag list in Chinese
Étiqueter | Description |
---|---|
ANNONCE | Adverbe |
COMME | Particules d'aspect |
BA | ba3 (en ba-construction) |
CC | Conjonction de coordination |
CD | nombre cardinal |
CS | Conjonction de subordination |
DÉC | de5 (Complémentateur/Nominaliseur) |
DEG | de5 (génitif/associatif) |
DER | de5 (Résultatif) |
DÉVELOPPEUR | de5 (Manière) |
DT | Déterminant |
ETC | Autres |
FW | Mot étranger |
je | Interjection |
JJ | Autre nom-modificateur |
KG | bei4 (en longue bei-construction) |
CL | Localisateur |
M | Mesurer le mot |
MSP | Autres particules |
N.N. | Autre nom |
NN-COURT | Autre nom (abrév.) |
NR | Nom propre |
NR-COURT | Nom propre (abrév.) |
NT | nom temporel |
NT-COURT | Nom temporel (abrév.) |
DO | Nombre ordinal |
SUR | Onomatopée |
P. | Préposition |
PN | Pronom |
Unité centrale | Ponctuation |
SB | bei4 (en bref bei-construction) |
PS | Particule finale de la phrase |
URL | URL |
Virginie | Adjectif prédicatif |
Capital-risque | Copule |
VE | you3 (verbe principal) |
VV | Autre verbe |
X | Autres |
PoS tag list in Japanese and correspondence to BCCWJ tags
Étiqueter | Nom JA original | Anglais |
---|---|---|
Ac | adjectif général | Adjectif-Commun |
A-dp | adjectif - non autonome possible | Adjectif-dépendant |
C | ramasser des mots | Conjonction |
D | pronom | Pronom |
E | Anglais | mot anglais |
F | adverbe | Adverbe |
IC | émouvoir verbe-général | Interjection-commune |
jc | Forme du mot-général | Nom adjectival-commun |
J-tari | Forme du mot-タリ | Nom adjectival-Tari |
J-xs | Forme du mot-tige du mot auxiliaire | Adjectival Nom-AuxVerbe radical |
M-aa | Marque de subvention-AA | Signe auxiliaire-AA |
Mc | Subvention générale | Signe auxiliaire-Commun |
M-cp | Supports supplémentaires fermés par marque | Signe auxiliaire-Parenthèse ouverte |
Serpillière | Marque de subvention - parenthèses ouvertes | Signe auxiliaire-Fermer la parenthèse |
Député | Période de subvention | Signe auxiliaire-Période |
Nn | nom - nom | Nom-Nom |
N-nc | nom - nom commun | Nom-Nom commun |
N-pn | nom - nom propre | Nom-nom propre |
N-xs | nom-tige auxiliaire | Tige Nom-AuxVerbe |
Ô | そのlui | Autres |
P. | connecteur | Préfixe |
P-fj | particule-adverbe particule | Particule-Adverbiale |
P-jj | Particule - particule quasi-corps | Phrase de particules |
Pk | Particule de cas de particules | Marquage des cas de particules |
P-rj | particule - particule | Liaison des particules |
P-sj | Particule - particule de connexion | Particule-Conjonctive |
Qa | suffixe-adjectif | Suffixe-Adjectif |
Qj | suffixe - forme du mot | Suffixe-Adjectival Nom |
Qn | suffixe - nom | Suffixe-Nom |
Qv | suffixe-verbe | Suffixe-Verbe |
R. | mots conjoints | Adjectif adnominal |
Sc | Notation générale | Signe-Commun |
SL | texte-jeton | Lettre-signature |
U | URL | URL |
Vc | verbe-général | Verbe-Commun |
V-dp | Verbe - non autonome possible | Dépendant du verbe |
W | vide | Espaces |
X | verbe auxiliaire | AuxVerbe |
Remerciements
Les développeurs tiennent à remercier Satoshi Sekine, Satoko Marumoto, Yoichi Yoshimoto, Keiji Shinzato, Keita Yaegashi et Soh Masuko pour leur contribution à ce projet.
Les références
Masato Hagiwara et Satoshi Sekine. Analyseur morphologique chinois/japonais léger côté client basé sur l'apprentissage en ligne. Session de démonstration COLING 2014, pages 39-43, 2014. [ PDF ]
Kikuo Maekawa, Compilation du corpus Kotonoha-BCCWJ (en japonais), Nihongo no kenkyu (Études en japonais), 4(1):82–95, 2008. (Certaines informations en anglais peuvent être trouvées ici .) [ Site ]
Jialei Wang, Peilin Zhao et Steven C. Hoi. Apprentissage exact pondéré en termes de confiance, dans Proc. of ICML 2012, pages 121-128, 2012. [ PDF ]
Naiwen Xue, Fei Xia, Fu-dong Chiou et Marta Palmer. The Penn Chinese Treebank: Phrase structure annotation of a large corpus. Natural Language Engineering, 11(2):207–238, 2005. [ PDF ] [ Site ]
© 2014, 2015 Rakuten NLP Project. Tous droits réservés. / Sponsorisé par Rakuten, Inc. et Rakuten Institute of Technology .