Module communautaire génial

Rakuten MA

README japonais (japonais)

Présentation

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. Génère une segmentation des 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 compacte du modèle.
  • Fourni 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 E-commerce.

Démo

Vous pouvez essayer Rakuten MA sur la page de démonstration (le chargement de cette page peut prendre un certain temps).

Utilisation

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 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 la <head> de 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

  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 le featset fonctions en fonction de votre langage (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é 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 l' featset (et éventuellement, ctype_func , hash_func , etc.)
  4. Alimentez vos phrases d'entraînement une par une (de la première à la dernière) à la train_one(sent) .
  5. Habituellement, SCW converge suffisamment après une epoch (une passe à 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 , selon quoi et combien vous voulez "re-former".)
  3. Alimentez vos phrases de formation une par une à la train_one(sent) .

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 avoir appliqué le 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 le modèle entraîné taille.

Vous pouvez l'exécuter sur les node scripts/minify.js [input_model_file] [output_model_file] pour créer une version minifiée 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 -Former le modèle minifié. Si nécessaire, re-former le modèle d'abord, puis le minifier.

Documentation API

Constructeur La 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 paramètres hyper de SCW (par défaut: phi = 2048 , c = 0.003906 ).
Les méthodes La description
tokenize(input) Tokenise 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 [jeton, balise PoS]). 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 à celle sent ) , sys est la sortie du système utilisant le (ancien) modèle, et updated est un indicateur binaire (Vrai / Faux) signifiant 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 d'étiquette séquentiel. Actuellement, "IOB2" et "SBIEO" sont pris en charge. La spécification d'autres schémas d'étiquette entraîne une exception.
Propriétés La description
featset Spécifiez 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 de fonctions par défaut pour le japonais et le chinois, respectivement. Voir ci-dessous ("Modèles de fonctions pris en charge") pour plus de détails sur les modèles de fonctions .
ctype_func Spécifiez 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 regarder. en 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écifiez la fonction de hachage à utiliser pour le hachage de fonctionnalité. Par défaut = undefined (pas de hachage de fonctionnalité). Une fonction de hachage de fonctionnalité avec bit espace de hachage 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 pris en charge et les versions de Node.js?

  • A. We confirmed that Rakuten MA runs in the following environments :
    • Internet Explorer 8 (version 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 (version 0.10.13 ou supérieure)

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

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

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

  • A. Veuillez créer un problème sur Github issues https://github.com/rakuten-nlp/rakutenma/issues .
  • Alternatively pouvez également créer une demande d'extraction 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 écrivez le vôtre (si nécessaire) avant de soumettre une demande de tirage.
  • 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 fonction de hachage de fonctionnalité ( hash_func ) utilisés pour la formation. N'oubliez pas d'utiliser la fonction de hachage de fonctionnalité de 15 bits ( rma.hash_func = RakutenMA.create_hash_func(15); ) lors de l'utilisation les modèles groupés ( 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 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]; ) afin de la consulter sur les navigateurs. Voir 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 le fait pour vous. Nous vous recommandons de travailler sur Node.js pour la formation des modèles, etc., puis de le convertir pour une utilisation par navigateur .

Appendice

Supported feature templates

Modèle d'entité La description
w7 Unigramme du personnage (c-3)
w8 Unigramme du personnage (c-2)
w9 Unigramme du personnage (c-1)
w0 Unigramme 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 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 Bigram du personnage (c-3 c-2)
b8 Bigram (C-2 C-1)
b9 Bigram du personnage (c-1 c0)
b1 Caractère bigramme (c0 c + 1)
b2 Bigramme du personnage (c + 1 c + 2)
b3 Bigramme du personnage (c + 2 c + 3)
d7 Type de caractère bigramme (t-3 t-2)
d8 Type de caractère bigramme (t-2 t-1)
d9 Type de caractère bigramme (t-1 t0)
d1 Type de caractère bigramme (t0 t + 1)
d2 Type de caractère bigramme (t + 1 t + 2)
d3 Type de caractère bigramme (t + 2 t + 3)
autres Si vous spécifiez une fonction d' featset personnalisée dans le tableau de l'ensemble de fonctions, 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 un type de caractère et un 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) 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

Tag La description
AD Adverb
AS Aspect particule
BA ba3 (en ba-construction)
CC Coordination de la coordination
CD Numéro cardinal
CS Conjonction subordonnée
DEC de5 (Complémentisateur / Nominaliseur)
DEG de5 (Génitif / Associatif)
DER de5 (résultant)
DEV de5 (Manière)
DT Déterminer
ETC Autres
FW Mot étranger
IJ Interjection
JJ Autre modificateur de nom
LB bei4 (en longue construction bei)
LC Localisateur
M Mot de mesure
MSP Autre particule
NN Autre nom
NN-SHORT Autre nom (abréviation)
NR Nom propre
NR-SHORT Nom propre (abréviation)
NT Nom temporel
NT-SHORT Nom temporel (abréviation)
OD Nombre ordinal
ON Onomatopée
P Préposition
PN Pronom
PU Ponctuation
SB bei4 (en bref bei-construction)
SP Particule finale de phrase
URL URL
VA Adjectif prédictif
VC Copule
VE you3 (verbe principal)
VV Autre verbe
X Autres

PoS tag list in Japanese and correspondence to BCCWJ tags

Tag Nom JA d'origine Anglais
Ac Adjectif-général Adjectif-Commun
A-dp Adjectif-non indépendant Dépendant de l'adjectif
C Adverb Conjonction
D Pronom Pronom
E Argot anglais Mot anglais
F Adverb Adverb
Ic Verbe général Interjection-Commun
Jc Forme mot-général Nom adjectival-commun
J-tari Mot de forme - タ リ Adjectival Noun-Tari
J-xs Forme des verbes auxiliaires Tige Adjectival Noun-AuxVerb
M-aa Grant Mark-AA Signe auxiliaire-AA
Mc Grant Mark-General Signe auxiliaire-Commun
M-cp Support de fermeture de marque de subvention Signe auxiliaire - parenthèse ouverte
M-op Support de marque de subvention ouvert Signe auxiliaire - Fermer la parenthèse
Mp Période de cotisation de la subvention Signe auxiliaire-Période
Nn Nom-nom Noun-Noun
N-nc Nom-nom commun Nom-nom commun
N-pn Nom propre Nom-nom propre
N-xs Tige substantielle auxiliaire Tige Noun-AuxVerb
O そ の 他 Autres
P Conjonction Préfixe
P-fj Particule-adverbe Particule-Adverbial
P-jj Particule-quasi-particule Particule-Phrasal
Pk Particule à particules Marquage de caisses à particules
P-rj Particules-Particules départementales Liaison de particules
P-sj Particule particule-série Particule-Conjonctif
Qa Conjonction-adjectif Suffixe-Adjectif
Qj Mots de clôture - Mots en forme Suffixe-nom adjectival
Qn Remarques finales-nom Suffixe-nom
Qv Conjonctif-verbal Suffixe-Verbe
R Conjonction Adjectif nominal
Sc Mark-General Signe commun
Sl Mark-text Sign-Letter
U URL URL
Vc Verbe général Verbe-commun
V-dp Verbes Dépendant du verbe
W Vierge Espace blanc
X Verbe auxiliaire AuxVerb

Remerciements

Les développeurs voudraient 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 basé sur l'apprentissage en ligne. COLING 2014 Demo Session, 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. (Quelques informations en anglais peuvent être trouvées ici .) [ Site ]

Jialei Wang, Peilin Zhao et Steven C. Hoi. Exact soft soft weighted trust learning. 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 .