Ngrams es un índice N-Gram simple capaz de aprender de un corpus de datos y generar una salida aleatoria en el mismo estilo. Los sistemas de índice y tokenización se implementan como interfaces, por lo que puede rodar su propia solución.
Puede probar ngrams ejecutando el pequeño servidor web REST en cmd/rest/trigrams.go . También hay un ejemplo GRPC-Proto en cmd/grpc .
$ git clone https://github.com/mochi-co/ngrams.git
$ cd ngrams
$ go test -cover ./...
$ go build cmd/rest/trigrams.go
or
$ go run cmd/rest/trigrams.go
El servidor web servirá dos puntos finales:
localhost:8080/learn Indexa un cuerpo de datos de texto plano. Se pueden encontrar textos de entrenamiento en training .
$ curl --data-binary @"training/pride-prejudice.txt" localhost:8080/learn
# {"parsed_tokens":139394}
curl -d 'posting a string of text' -H "Content-Type: text/plain" -X POST localhost:8080/learn
# {"parsed_tokens":5}
localhost:8080/generate[?limit=n] Genera una salida aleatoria de los ngrams aprendidos. El parámetro de consulta limit se puede usar para cambiar el número de tokens utilizados para crear la salida (predeterminado 50).
$ curl localhost:8080/generate
# {
"body": "They have solaced their wretchedness, however, and had a most conscientious
and polite young man, that might be able to keep him quiet. The arrival of the
fugitives. Not so much wickedness existed in the only one daughter will be
having a daughter married.",
"limit": 50
}
$ curl localhost:8080/generate?limit=10
# {
"body": "Of its late possessor, she added, so untidy.",
"limit": 10
}
Un ejemplo de uso como biblioteca se puede encontrar en cmd/rest/trigrams.go . El ejemplo de Trigrams utiliza tokenizers.DefaultWord Tokenizer, que analizará y formateará ngrams basados en reglas generales del alfabeto latino.
import "github.com/mochi-co/ngrams" // Initialize a new ngram index for 3-grams (trigrams), with default options.
index = ngrams . NewIndex ( 3 , nil )
// Parse and index ngrams from a dataset.
tokens , err := index . Parse ( "to be or not to be, that is the question." )
// Generate a random sequence from the indexed ngrams.
out , err := index . Babble ( "to be" , 50 ) Tanto los mecanismos de almacenamiento de datos como de tokenización para el indexador pueden reemplazarse satisfaciendo las interfaces de la tienda y el tokenizador, lo que permite ajustar al indexador para diferentes fines. El índice admite BigRams, Trigrams, Quadgrams, etc., al cambiar el valor de NewIndex n (3).
// Initialize with custom tokenizers and memory stores.
// The DefaultWordTokenizer take a bool to strip linebreaks in parsed text.
index = ngrams . NewIndex ( 3 , ngrams. Options {
Store : stores . NewMemoryStore (),
Tokenizer : tokenizers . NewDefaultWordTokenizer ( true ),
}) Un tokenizador consiste en un método Tokenize que se utiliza para analizar los datos de entrada en tokens NGRAM, y un método Format que los vuelve a unir en un formato esperado. La biblioteca usa tokenizers.DefaultWord Tokenizer de forma predeterminada, que es un tokenizador simple para analizar la mayoría de los idiomas basados en latín (inglés, francés, etc.) en tokens NGRAM.
El método Format realizará un intento de mejor esfuerzo para reconstruir cualquier tokens NGRAM seleccionado de manera gramaticalmente correcta (o lo que sea apropiado para el tipo de tokenización que se realiza).
Se pueden crear nuevos tokenizers satisfaciendo la interfaz tokenizers.Tokenizer , como para la tokenización de conjuntos de datos CJK o secuencias amino.
Por defecto, el índice utiliza una tienda en memoria, stores.MemoryStore . Este es un almacén de memoria básico que almacena los ngrams as-is. Es ideal para pequeños ejemplos, pero si estaba indexando millones de tokens, sería bueno pensar en la compresión o alias.
Se pueden crear nuevas tiendas satisfaciendo las stores.Store Interfaz de almacenamiento.
Se alienta las contribuciones a ngrams . Abra un problema para informar un error o hacer una solicitud de función. ¡Las solicitudes de extracción bien consideradas son bienvenidas!
Mit.
Los textos de capacitación provienen del Proyecto Gutenberg.