lingo fournit les structures de données et les algorithmes requis pour le traitement du langage naturel.
Plus précisément, il fournit un étiqueteur POS ( lingo/pos ), un analyseur de dépendance ( lingo/dep ) et un tokenizer de base ( lingo/lexer ) pour l'anglais. Il fournit également des structures de données pour maintenir des corpus ( lingo/corpus ) et des banques d'arbres ( lingo/treebank ).
Le but de ce package est de fournir un pipeline de qualité de production pour le traitement du langage naturel.
Le package est go-gettable: go get -u github.com/chewxy/lingo
Ce package et ses sous-packages dépendent de très peu de packages externes. Les voici:
| Emballer | Utilisé pour | Vitalité | Notes | Licence |
|---|---|---|---|---|
| gorgonie | Apprentissage automatique | Vital. Il ne sera pas difficile de les réécrire, mais pourquoi? | Même auteur | Licence Gorgonia (Apache 2.0) |
| gabillard | Visualisation des annotations et d'autres visualisations liées aux graphiques | Vital pour les visualisations, qui sont une fonctionnalité agréable à avoir | API a changé le 12 avril 2017 pour la dernière fois | Licence Gobraphviz (Apache 2.0) |
| erreurs | Erreurs | Le colis ne mourra pas sans lui, mais c'est très agréable à avoir | API stable pour la dernière année | Licence d'erreurs (MIT / BSD comme) |
| ensemble | Définir les opérations | Peut être facilement remplacé | API stable pour la dernière année | Définir la licence (MIT / BSD-like) |
Voir les forfaits individuels pour l'utilisation. Il y a aussi un tas d'exécutables dans le répertoire cmd . Ils sont censés être des exemples sur la façon dont un pipeline de traitement du langage naturel peut être configuré.
Un pipeline de langage naturel avec ce package est fortement entraîné par les canaux. Voici un exemple pour l'analyse de dépendance:
func main () {
inputString: `The cat sat on the mat`
lx := lexer . New ( "dummy" , strings . NewReader ( inputString )) // lexer - required to break a sentence up into words.
pt := pos . New ( pos . WithModel ( posModel )) // POS Tagger - required to tag the words with a part of speech tag.
dp := dep . New ( depModel ) // Creates a new parser
// set up a pipeline
pt . Input = lx . Output
dp . Input = pt . Output
// run all
go lx . Run ()
go pt . Run ()
go dp . Run ()
// wait to receive:
for {
select {
case d := <- dp . Output :
// do something
case err := <- dp . Error :
// handle error
}
}
}Pour des tâches spécifiques (étiquetage de POS, analyse, reconnaissance des entités nommés, etc.), reportez-vous à la lecture de chaque sous-package. Ce package à lui seul fournit principalement les structures de données que les sous-packages utiliseront.
La structure de données la plus importante est peut-être la *Annotation . Il contient essentiellement un mot et les métadonnées associées pour le mot.
Pour les analyses de dépendance, le graphique prend trois formulaires: *Dependency , *DependencyTree et *Annotation . Les trois formulaires sont convertibles de l'un à l'autre. TODO: Expliquez la justification derrière chaque type de données.
Une bizarrerie particulière que vous avez peut-être remarquée est que le POSTag et DependencyType sont codés en dur comme des constantes. Ce package fournit en fait deux variations de chacun: une de Stanford / Penn Treebank et une des Universaldependencations.
La raison principale de la codage en dur est principalement pour des raisons de performance - savoir à propos de la quantité à allouer réduit beaucoup de travail supplémentaire que le programme a à faire. Il réduit également les chances de muter une variable globale.
Bien sûr, cela vient comme un compromis - les programmes sont limités à ces deux options. Heureusement, il n'y a qu'un nombre limité de types d'étiquette POS et de relation de dépendance. Deux des dépendances les plus populaires (Stanford / PTB et les dépendances universelles) ont été mises en œuvre.
Les balises de construction suivantes sont prises en charge:
Pour utiliser un tagset ou un relset spécifique, créez votre programme ainsi: go build -tags='stanfordtags' .
Les types de balises et de dépendances par défaut sont la version Universal Dependance.
Vous devez également noter que le tokenizer, lingo/lexer n'est pas votre tokenizer NLP habituel. C'est un tokenizer qui tokenise par espace, avec quelques règles spécifiques pour l'anglais. Il a été inspiré par la conversation de Rob Pike sur Lexers. Je pensais que ce serait cool d'écrire quelque chose comme ça pour NLP.
Les cas de test dans Package lingo/lexer montrent comment il gère Unicode et d'autres anglais pathalogiques.
Voir contribution.md pour plus d'informations
Ce package est concédé sous licence MIT.