prose est une bibliothèque de traitement de la langue naturelle (l'anglais uniquement, pour le moment) en Pure Go . Il prend en charge la tokenisation, la segmentation, le marquage d'une partie du discours et l'extraction de l'entité nommée.
Vous pouvez trouver un résumé plus détaillé sur les performances de la bibliothèque ici: Présentation prose v2.0.0: apporter la NLP à faire .
$ go get github.com/jdkato/prose/v2 package main
import (
"fmt"
"log"
"github.com/jdkato/prose/v2"
)
func main () {
// Create a new document with the default configuration:
doc , err := prose . NewDocument ( "Go is an open-source programming language created at Google." )
if err != nil {
log . Fatal ( err )
}
// Iterate over the doc's tokens:
for _ , tok := range doc . Tokens () {
fmt . Println ( tok . Text , tok . Tag , tok . Label )
// Go NNP B-GPE
// is VBZ O
// an DT O
// ...
}
// Iterate over the doc's named-entities:
for _ , ent := range doc . Entities () {
fmt . Println ( ent . Text , ent . Label )
// Go GPE
// Google GPE
}
// Iterate over the doc's sentences:
for _ , sent := range doc . Sentences () {
fmt . Println ( sent . Text )
// Go is an open-source programming language created at Google.
}
}Le processus de création de documents adhère à la séquence d'étapes suivante:
tokenization -> POS tagging -> NE extraction
segmentation
Chaque étape peut être désactivée (en supposant que les étapes ultérieures ne sont pas requises) en passant l' option fonctionnelle appropriée. Pour désactiver l'extraction de l'entité nommée, par exemple, vous effectuez ce qui suit:
doc , err := prose . NewDocument (
"Go is an open-source programming language created at Google." ,
prose . WithExtraction ( false )) prose comprend un tokenizer capable de traiter le texte moderne, y compris les travées de caractère non-mot illustrées ci-dessous.
| Taper | Exemple |
|---|---|
| Adresses e-mail | [email protected] |
| Hashtags | #trending |
| Mentions | @jdkato |
| URL | https://github.com/jdkato/prose |
| Émoticônes | :-) , >:( , o_0 , etc. |
package main
import (
"fmt"
"log"
"github.com/jdkato/prose/v2"
)
func main () {
// Create a new document with the default configuration:
doc , err := prose . NewDocument ( "@jdkato, go to http://example.com thanks :)." )
if err != nil {
log . Fatal ( err )
}
// Iterate over the doc's tokens:
for _ , tok := range doc . Tokens () {
fmt . Println ( tok . Text , tok . Tag )
// @jdkato NN
// , ,
// go VB
// to TO
// http://example.com NN
// thanks NNS
// :) SYM
// . .
}
} prose comprend l'un des segments de phrases les plus précis disponibles, selon les règles d'or créées par les développeurs du pragmatic_segmenter .
| Nom | Langue | Licence | GRS (anglais) | GRS (Autre) | Vitesse† |
|---|---|---|---|---|---|
| Segmenter pragmatique | Rubis | Mit | 98,08% (51/52) | 100,00% | 3,84 s |
| prose | Aller | Mit | 75,00% (39/52) | N / A | 0,96 s |
| Tactfultokizer | Rubis | GNU GPLV3 | 65,38% (34/52) | 48,57% | 46,32 s |
| Opennlp | Java | Aplv2 | 59,62% (31/52) | 45,71% | 1,27 s |
| Standford Corenlp | Java | GNU GPLV3 | 59,62% (31/52) | 31,43% | 0,92 s |
| Splitta | Python | Aplv2 | 55,77% (29/52) | 37,14% | N / A |
| Punkt | Python | Aplv2 | 46,15% (24/52) | 48,57% | 1,79 s |
| SRX anglais | Rubis | GNU GPLV3 | 30,77% (16/52) | 28,57% | 6.19 s |
| Scapel | Rubis | GNU GPLV3 | 28,85% (15/52) | 20,00% | 0,13 s |
† Les tests d'origine ont été effectués à l'aide d'un MacBook Pro 3.7 GHz quad-core Intel Xeon E5 exécutant 10.9.5 , tandis que
prosea été chronométrée à l'aide d'un MacBook Pro 2.9 GHz Intel Core i7 exécutant 10.13.3 .
package main
import (
"fmt"
"strings"
"github.com/jdkato/prose/v2"
)
func main () {
// Create a new document with the default configuration:
doc , _ := prose . NewDocument ( strings . Join ([] string {
"I can see Mt. Fuji from here." ,
"St. Michael's Church is on 5th st. near the light." }, " " ))
// Iterate over the doc's sentences:
sents := doc . Sentences ()
fmt . Println ( len ( sents )) // 2
for _ , sent := range sents {
fmt . Println ( sent . Text )
// I can see Mt. Fuji from here.
// St. Michael's Church is on 5th st. near the light.
}
} prose comprend un tagger basé sur le tagger de POS "rapide et précis" de TextBlob. Vous trouverez ci-dessous une comparaison de ses performances avec la mise en œuvre par NLTK du même tagueur sur le corpus Treebank:
| Bibliothèque | Précision | Moyenne à 5 points (SEC) |
|---|---|---|
| NLTK | 0,893 | 7.224 |
prose | 0,961 | 2.538 |
(Voir scripts/test_model.py pour plus d'informations.)
La liste complète des balises POS prises en charge est donnée ci-dessous.
| ÉTIQUETER | DESCRIPTION |
|---|---|
( | support rond gauche |
) | support rond |
, | virgule |
: | côlon |
. | période |
'' | Marque de citation de clôture |
`` | Marque de citation d'ouverture |
# | signe du numéro |
$ | devise |
CC | conjonction, coordination |
CD | numéro cardinal |
DT | déterminant |
EX | existentiel là-bas |
FW | parole étrangère |
IN | conjonction, subordonné ou préposition |
JJ | adjectif |
JJR | adjectif, comparatif |
JJS | adjectif, superlatif |
LS | Liste du marqueur de l'élément |
MD | verbe, auxiliaire modal |
NN | Nom, singulier ou messe |
NNP | nom, bon singulier |
NNPS | Nom, bon pluriel |
NNS | Nom, pluriel |
PDT | prédéterminateur |
POS | fin possessive |
PRP | pronom, personnel |
PRP$ | pronom, possessif |
RB | adverbe |
RBR | adverbe, comparatif |
RBS | adverbe, superlatif |
RP | adverbe, particule |
SYM | symbole |
TO | infinival à |
UH | interjection |
VB | verbe, forme de base |
VBD | verbe, passé |
VBG | verbe, gérondif ou participe présent |
VBN | verbe, participe passé |
VBP | Verbe, non 3e personne singulier présent |
VBZ | verbe, troisième personne |
WDT | wh-déterminner |
WP | WH-PRONOUN, PERSONNEL |
WP$ | WH-PRONOUN, possessif |
WRB | wh-adverbe |
prose v2.0.0 comprend une version bien améliorée du package de morceaux de V1.0.0, qui peut identifier par défaut les personnes ( PERSON ) et géographique / politique ( GPE ).
package main
import (
"github.com/jdkato/prose/v2"
)
func main () {
doc , _ := prose . NewDocument ( "Lebron James plays basketball in Los Angeles." )
for _ , ent := range doc . Entities () {
fmt . Println ( ent . Text , ent . Label )
// Lebron James PERSON
// Los Angeles GPE
}
} Cependant, dans le but de rendre cette fonctionnalité plus utile, nous avons rendu simple pour former vos propres modèles pour des cas d'utilisation spécifiques. Voir Prodigy + prose : Enseignement de machine radicalement efficace en Go pour un tutoriel.