Module communautaire génial

Rakuten MA

LISEZMOI japonais (日本语 ド キ ュ メ ン ト)

introduction

Rakuten MA (analyseur morphologique) est un analyseur morphologique (segmenteur de mots + Tagger PoS) pour le chinois et le japonais écrit uniquement en JavaScript.

Rakuten MA présente les caractéristiques uniques suivantes:

  • Implémentation purement JavaScript. Fonctionne à la fois sur les navigateurs modernes et 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.
  • Supports incremental update of models by online learning (Soft Confidence Weighted , Wang et al. ICML 2012).
  • Ensemble de fonctionnalités personnalisables.
  • Supports feature hashing , la quantification et l'élagage des fonctionnalités pour une représentation de modèle compacte.
  • 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

Étant donné que Rakuten MA est une bibliothèque JavaScript, aucune installation n'est nécessaire. Clonez le référentiel git comme

1
git 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

1
node 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:

1
npm install rakutenma

Les fichiers de modèle se trouvent 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 le <head> de votre 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

  1. Load an existing model , par exemple, model = JSON.parse(fs.readFileSync("model_file")); puis rma = new RakutenMA(model); ou rma.set_model(model);
  2. Spécifiez featset fonction de votre featset (par exemple, rma.featset = RakutenMA.default_featset_zh; pour le chinois et rma.featset = RakutenMA.default_featset_ja; pour le japonais).
  3. 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 et model_ja.json ).
  4. Utilisez rma.tokenize(input) pour analyser votre entrée.

Training your own analysis model from scratch

  1. Prepare your training corpus (a set of training sentences where a sentence is just an array of correct [token , balise PoS] Prepare your training corpus (a set of training sentences where a sentence is just an array of correct [token ).)
  2. Initialisez une instance RakutenMA avec le new RakutenMA() .
  3. Spécifiez featset . (Et éventuellement, ctype_func , hash_func , etc.)
  4. Envoyez vos phrases d'entraînement une par une (du premier au dernier) à la train_one(sent) .
  5. Généralement, SCW converge suffisamment après une epoch (un passage à travers tout le 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.)

  1. Chargez un modèle existant et initialisez une instance RakutenMA. (Voir «Utilisation de modèles groupés pour analyser des phrases chinoises / japonaises» ci-dessus)
  2. Prepare your training data (this could be as few as a couple of sentences , en fonction de ce que vous voulez et de combien vous voulez "re-former".)
  3. Envoyez vos phrases d'entraînement une par une à la train_one(sent) .

Reducing the model size

La taille du modèle peut encore ê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 plus de détails) pour réduire le modèle entraîné Taille.

Vous pouvez l'exécuter node scripts/minify.js [input_model_file] [output_model_file] pour créer une version réduite du fichier de modèle. N'oubliez pas: il supprime également la partie "sigma" du modèle entraîné, ce qui signifie que vous ne pouvez plus re - Entraînez le modèle minifié Si nécessaire, réentraînez d'abord le modèle, puis réduisez-le.

Documentation API

Constructeur La description
RakutenMA(model, phi, c) Crée une nouvelle instance RakutenMA. model (facultatif) spécifie l'objet de modèle pour initialiser l'instance avec RakutenMA. phi et c (deux en option) sont des paramètres hyper de SCW (par défaut: phi = 2048 , c = 0.003906 ).
Méthodes La description
tokenize(input) Tokenize l' 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 système utilisant le (ancien) modèle, et updated est un indicateur binaire (Vrai / Faux) indiquant si le modèle a été mis à jour (car sys é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 entraîne une exception.
Propriétés La description
featset Spécifie un tableau de modèles d' RakutenMA.default_featset_ja (chaîne) utilisés pour l'analyse. Vous pouvez utiliser RakutenMA.default_featset_ja et RakutenMA.default_featset_zh comme ensembles d' RakutenMA.default_featset_zh par défaut pour le japonais et le chinois, respectivement. Voir ci-dessous ("Modèles d' RakutenMA.default_featset_zh pris en charge") pour plus de détails sur les modèles d'entité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 up in chardic et renvoie sa valeur. (Par exemple, RakutenMA.create_ctype_chardic_func({"A": "type1"}) renvoie une fonction ff("A") renvoie "type1" et [] sinon.)
hash_func Spécifie la fonction de hachage à utiliser pour le hachage de fonctionnalités. Par défaut = undefined (pas de hachage de fonctionnalité). Une fonction de hachage de fonctionnalité avec bit espace de hachage bit -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 and Sekine 2014]

FAQ (questions fréquemment posées)

Q. Quels sont les navigateurs et les versions Node.js pris en charge?

  • A. We confirmed that Rakuten MA runs in the following environments :
    • Internet Explorer 8 (ver. 8.0.7601.17414 ou supérieur)
    • Google Chrome (ver.35.0.1916.153 ou supérieur)
    • Firefox (version 16.0.2 ou supérieure)
    • Safari (version 6.1.5 ou supérieure)
    • Node.js (ver. 0.10.13 ou supérieur)

Q. L'utilisation commerciale est-elle autorisée?

  • A. Yes , tant que vous respectez les conditions générales. Voir «Conditions générales» ci-dessus pour plus de détails.

Q. J'ai trouvé un bogue / une erreur d'analyse / etc. Où dois-je signaler?

  • A. Veuillez créer un problème sur les problèmes Github https://github.com/rakuten-nlp/rakutenma/issues .
  • Alternatively pouvez également 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 de la jasmine-node spec ) et rédigez le vôtre (si nécessaire) avant de soumettre une demande d'extraction.
  • 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ées pour l'entraînement. N'oubliez pas d'utiliser la fonction de hachage de fonctionnalités 15 bits ( rma.hash_func = RakutenMA.create_hash_func(15); ) lors de l'utilisation les modèles fournis ( model_zh.json et model_ja.json ).

Q. Quels scripts (simplifié / traditionnel) sont pris en charge pour le chinois?

  • A. Actuellement, seul le chinois simplifié est pris en charge.

Q. Pouvons-nous utiliser le même fichier de modèle au format JSON pour les navigateurs?

  • A. Yes and no. Although internal data structure of models is the same , vous devez ajouter une affectation (par exemple, var model = [JSON representation]; ) pour y faire référence dans les navigateurs. Voyez la différence entre model_zh.json ( pour Node.js) et model_zh.js (pour les navigateurs). Il existe un mini-script scripts/convert_for_browser.js qui fait cela pour vous. Nous vous recommandons de travailler sur Node.js pour la formation des modèles, etc., puis de le convertir pour les utilisations du navigateur .

appendice

Supported feature templates

Modèle de fonctionnalité La description
w7 Caractère unigramme (c-3)
w8 Caractère unigramme (c-2)
w9 Caractère unigramme (c-1)
w0 Caractère unigramme (c0)
w1 Caractère unigramme (c + 1)
w2 Caractère unigramme (c + 2)
w3 Caractère unigramme (c + 3)
c7 Type de caractère unigramme (t-3)
c8 Type de caractère unigramme (t-2)
c9 Type de caractère unigramme (t-1)
c0 Type de caractère unigramme (t0)
c1 Type de caractère unigramme (t + 1)
c2 Type de caractère unigramme (t + 2)
c3 Type de caractère unigramme (t + 3)
b7 Caractère bigramme (c-3 c-2)
b8 Caractère bigramme (c-2 c-1)
b9 Caractère bigramme (c-1 c0)
b1 Caractère bigramme (c0 c + 1)
b2 Caractère bigramme (c + 1 c + 2)
b3 Caractère bigramme (c + 2 c + 3)
d7 Bigramme de type caractère (t-3 t-2)
d8 Bigramme de type caractère (t-2 t-1)
d9 Bigramme de type caractère (t-1 t0)
d1 Bigramme de type caractère (t0 t + 1)
d2 Bigramme de type caractère (t + 1 t + 2)
d3 Bigramme de type caractère (t + 2 t + 3)
autres Si vous spécifiez une fonction de fonction personnalisée dans le tableau featset , 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 de type caractère et type caractère. La valeur de retour de cette fonction est utilisée comme valeur de fonction. (Par exemple, si vous spécifiez une fonction f(_t, i) qui returns _t(i).t; puis il 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

Marque La description
UN D Adverbe
COMME Particule d'aspect
BA ba3 (dans ba-construction)
CC Conjonction de coordination
CD nombre cardinal
CS Conjonction de subordination
DÉC de5 (Complémentateur / Nominalisateur)
DEG de5 (Génitif / Associatif)
DER de5 (résultant)
DEV de5 (Manière)
DT Déterminant
ETC Autres
FW Mot étranger
IJ Interjection
JJ Autre nom-modificateur
KG bei4 (en long bei-construction)
LC Localizer
M Mesurer le mot
MSP Autre particule
NN Autre nom
NN-COURT Autre nom (abréviation)
NR Nom propre
NR-SHORT Nom propre (abréviation)
NT Nom temporel
NT-SHORT Nom temporel (abrév.)
OD Nombre ordinal
SUR Onomatopée
P Préposition
PN Pronom
PU Ponctuation
SB bei4 (en bref bei-construction)
SP Particule finale de phrase
URL URL
Virginie Adjectif prédicatif
VC Copule
VE you3 (verbe principal)
VV Autre verbe
X Autres

PoS tag list in Japanese and correspondence to BCCWJ tags

Marque Nom JA d'origine Anglais
Ac Adjectif général Adjectif commun
A-dp Possibilité indépendante des adjectifs Dépendant de l'adjectif
C Mots de connexion Conjonction
synonyme Pronom
E Anglais mot anglais
F adverbe Adverbe
Ic Toucher le verbe général Interjection-commune
JC Formez les mots-général Adjectival Noun-Common
J-tari Mot de forme- タ リ Adjectival Noun-Tari
J-xs Forme des mots-racine du verbe auxiliaire Adjectival Noun-AuxVerb tige
M-aa Note de subvention-AA Signe auxiliaire-AA
Mc Signe de subvention général Signe auxiliaire - Commun
M-cp Subvention entre parenthèses fermées Parenthèse ouverte de signe auxiliaire
Balai Subvention ouverte entre parenthèses Signe auxiliaire - Parenthèse fermée
Mp Période de cotation de la subvention Période de signe auxiliaire
Nn Nom-substantif Nom-substantif
N-nc Nom commun Nom commun
N-pn Nom propre Nom propre
N-xs Racine de mot nom-auxiliaire Potence Noun-AuxVerb
O そ の 他 Autres
P Mots communs Préfixe
P-fj Particule-adverbe Particule-Adverbial
P-jj Particule quasi-subjective de mot auxiliaire Particule-Phrasal
Pk Particule-cas particule Marquage de cas de particules
P-rj Mot copulatif auxiliaire Liaison aux particules
P-sj Mots auxiliaires - Mots auxiliaires Particule-Conjonctive
Qa Suffixe-adjectif Suffixe-Adjectif
Qj Mots en forme de suffixe Suffixe-adjectival Nom
Qn Suffixe-nom Suffixe-Nom
Qv Suffixe-verbe Suffixe-Verbe
R Mots conjoints Adjectif adnominal
Sc Mark-général Signe commun
Sl Marque-texte Lettre de signe
U URL URL
Vc Verbe-général Verbe-commun
V-dp Verbe-indépendance possible Dépendant du verbe
W Vide Espace blanc
X Verbe auxiliaire AuxVerb

Remerciements

Les développeurs tiennent à remercier Satoshi Sekine, Satoko Marumoto, Yoichi Yoshimoto, Keiji Shinzato, Keita Yaegashi et Soh Masuko pour leur contribution à ce projet.

Références

Masato Hagiwara et Satoshi Sekine. Analyseur morphologique chinois / japonais léger côté client basé sur l'apprentissage en ligne. Séance 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. (Des informations en anglais peuvent être trouvées ici .) [ Site ]

Jialei Wang, Peilin Zhao et Steven C. Hoi. Apprentissage exact pondéré par la confiance en douceur, 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. / Parrainé par Rakuten, Inc. et Rakuten Institute of Technology .