El paquete lingo proporciona las estructuras de datos y los algoritmos necesarios para el procesamiento del lenguaje natural.
Específicamente, proporciona un tagger POS ( lingo/pos ), un analizador de dependencia ( lingo/dep ) y un tokenizador básico ( lingo/lexer ) para el inglés. También proporciona estructuras de datos para sostener corpus ( lingo/corpus ) y bancos de árboles ( lingo/treebank ).
El objetivo de este paquete es proporcionar una tubería de calidad de producción para el procesamiento del lenguaje natural.
El paquete es GO -Gettable: go get -u github.com/chewxy/lingo
Este paquete y sus subpackages dependen de muy pocos paquetes externos. Aquí están:
| Paquete | Utilizado para | Vitalidad | Notas | Licencia |
|---|---|---|---|---|
| gorgonia | Aprendizaje automático | Vital. No será difícil reescribirlos, pero ¿por qué? | Mismo autor | Licencia de Gorgonia (como Apache 2.0) |
| gographviz | Visualización de anotaciones y otras visualizaciones relacionadas con gráficos | Vital para visualizaciones, que son una característica agradable | La API cambió por última vez el 12 de abril de 2017 | Licencia GographViz (Apache 2.0) |
| errores | Errores | El paquete no morirá sin él, pero es muy agradable tener | API estable durante el año pasado | Licencia de errores (MIT/BSD como) |
| colocar | Establecer operaciones | Se puede reemplazar fácilmente | API estable durante el año pasado | Establecer licencia (MIT/BSD-Like) |
Vea los paquetes individuales para su uso. También hay un montón de ejecutables en el directorio cmd . Están destinados a ser ejemplos sobre cómo se puede configurar una tubería de procesamiento del lenguaje natural.
Una tubería de lenguaje natural con este paquete es muy impulsada por los canales. Aquí hay un ejemplo para el análisis de la dependencia:
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
}
}
}Para tareas específicas (etiquetado con POS, análisis, reconocimiento de entidad nombrado, etc.), consulte el readMe de cada subpackaje. Este paquete por sí mismo proporciona principalmente las estructuras de datos que utilizarán los subpackages.
Quizás la estructura de datos más importante es la estructura *Annotation . Básicamente contiene una palabra y los metadatos asociados para la palabra.
Para los analizados de dependencia, el gráfico toma tres formas: *Dependency , *DependencyTree y *Annotation . Las tres formas son convertibles de una a otra. TODO: Explique la justificación detrás de cada tipo de datos.
Una peculiaridad particular que puede haber notado es que el POSTag y DependencyType están codificados como constantes. De hecho, este paquete proporciona dos variaciones de cada una: una de Stanford/Penn Treebank y otra de UniversalDependencies.
La razón principal para la codificación difícil de estos es principalmente por razones de rendimiento: saber con anticipación cuánto asignar reduce mucho trabajo adicional que el programa tiene que hacer. También reduce las posibilidades de mutar una variable global.
Por supuesto, esto se produce como una compensación: los programas se limitan a estas dos opciones. Afortunadamente, solo hay un número limitado de etiquetas POS y tipos de relaciones de dependencia. Se han implementado dos de los más populares (Stanford/PTB y Dependencias Universales).
Se admiten las siguientes etiquetas de compilación:
Para usar un conjunto de etiquetas o relset específico, construya su programa así: go build -tags='stanfordtags' .
La etiqueta predeterminada y los tipos de REL de dependencia son la versión de las dependencias universales.
También debe tener en cuenta que el tokenizer, lingo/lexer no es su tokenizer NLP habitual de NLP. Es un tokenizador que tokeniza por espacio, con algunas reglas específicas para el inglés. Fue inspirado en la charla de Rob Pike sobre Lexers. Pensé que sería genial escribir algo así para PNL.
Los casos de prueba en el paquete lingo/lexer muestran cómo maneja Unicode y otro inglés patalógico.
ver contribuyente.md para más información
Este paquete tiene licencia bajo la licencia MIT.