prose es una biblioteca de procesamiento del lenguaje natural (solo inglés, en este momento) en puro Go . Admite la tokenización, la segmentación, el etiquetado de parte del voz y la extracción de entidad nombrada.
Puede encontrar un resumen más detallado en la actuación de la biblioteca aquí: Presentación prose v2.0.0: Traer a PNL para ir .
$ 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.
}
}El proceso de creación de documentos se adhiere a la siguiente secuencia de pasos:
tokenization -> POS tagging -> NE extraction
segmentation
Cada paso puede deshabilitarse (suponiendo que no se requieran pasos posteriores) al pasar la opción funcional apropiada. Para deshabilitar la extracción de entidad nombrada, por ejemplo, haría lo siguiente:
doc , err := prose . NewDocument (
"Go is an open-source programming language created at Google." ,
prose . WithExtraction ( false )) prose incluye un tokenizador capaz de procesar el texto moderno, incluidos los tramos de caracteres que no son de palabras que se muestran a continuación.
| Tipo | Ejemplo |
|---|---|
| Direcciones de correo electrónico | [email protected] |
| Hashtags | #trending |
| Menciones | @jdkato |
| URLS | https://github.com/jdkato/prose |
| Emoticones | :-) , >:( , 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 incluye uno de los segmentos de oraciones más precisos disponibles, según las reglas de oro creadas por los desarrolladores del pragmatic_segmenter .
| Nombre | Idioma | Licencia | GRS (inglés) | GRS (otro) | Velocidad† |
|---|---|---|---|---|---|
| Segmento pragmático | Rubí | MIT | 98.08% (51/52) | 100.00% | 3.84 S |
| prosa | Ir | MIT | 75.00% (39/52) | N / A | 0.96 s |
| TactfulTokenizer | Rubí | 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 |
| División | Pitón | APLV2 | 55.77% (29/52) | 37.14% | N / A |
| Punkt | Pitón | APLV2 | 46.15% (24/52) | 48.57% | 1.79 s |
| SRX Inglés | Rubí | GNU GPLV3 | 30.77% (16/52) | 28.57% | 6.19 s |
| Escapel | Rubí | GNU GPLV3 | 28.85% (15/52) | 20.00% | 0.13 s |
† Las pruebas originales se realizaron utilizando un MacBook Pro 3.7 GHz de cuatro núcleos Intel Xeon E5 que se ejecuta 10.9.5 , mientras que
prosese cronometró utilizando un Intel Core i7 MacBook Pro 2.9 GHz que se ejecuta 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 incluye un etiquetador basado en el etiqueta POS "rápido y preciso" de TextBlob. A continuación se muestra una comparación de su desempeño contra la implementación de NLTK del mismo tagger en el Corpus TreeBank:
| Biblioteca | Exactitud | Promedio de 5 carreras (sec) |
|---|---|---|
| Nltk | 0.893 | 7.224 |
prose | 0.961 | 2.538 |
(Consulte scripts/test_model.py para obtener más información).
La lista completa de etiquetas POS compatibles se da a continuación.
| ETIQUETA | DESCRIPCIÓN |
|---|---|
( | soporte redondo izquierdo |
) | soporte redondo derecho |
, | coma |
: | colon |
. | período |
'' | Cita de cierre |
`` | Marque de apertura |
# | signo numérico |
$ | divisa |
CC | conjunción, coordinación |
CD | número cardinal |
DT | determinador |
EX | existencial allí |
FW | palabra extranjera |
IN | conjunción, subordinación o preposición |
JJ | adjetivo |
JJR | adjetivo, comparativo |
JJS | adjetivo, superlativo |
LS | Lista de marcador de elementos |
MD | verbo, auxiliar modal |
NN | sustantivo, singular o masa |
NNP | sustantivo, apropiado singular |
NNPS | sustantivo, plural adecuado |
NNS | sustantivo, plural |
PDT | predeterminador |
POS | final posesivo |
PRP | pronombre, personal |
PRP$ | pronombre, posesivo |
RB | adverbio |
RBR | adverbio, comparativo |
RBS | adverbio, superlativo |
RP | adverbio, partícula |
SYM | símbolo |
TO | infinitival a |
UH | interjección |
VB | verbo, forma base |
VBD | verbo, tiempo pasado |
VBG | verbo, gerundio o participio presente |
VBN | verbo, participio pasado |
VBP | verbo, presente singular no 3 de persona |
VBZ | verbo, tercera persona presente singular |
WDT | wheterminer |
WP | WH-PRONOUN, Personal |
WP$ | wh-pronoun, posesivo |
WRB | adverbio |
prose v2.0.0 incluye una versión muy mejorada del paquete de fragmentos de V1.0.0, que puede identificar a las personas ( PERSON ) y entidades geográficas/políticas ( GPE ) de forma predeterminada.
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
}
} Sin embargo, en un intento por hacer que esta función sea más útil, hemos hecho que sea sencillo entrenar sus propios modelos para casos de uso específicos. Ver Prodigy + prose : enseñanza de máquina radicalmente eficiente en Go para un tutorial.