lingo de pacote fornece as estruturas e algoritmos de dados necessários para o processamento de linguagem natural.
Especificamente, ele fornece um tagger de POS ( lingo/pos ), um analisador de dependência ( lingo/dep ) e um tokenizador básico ( lingo/lexer ) para o inglês. Ele também fornece estruturas de dados para manter corpusos ( lingo/corpus ) e bancos de árvores ( lingo/treebank ).
O objetivo deste pacote é fornecer um pipeline de qualidade de produção para o processamento de linguagem natural.
O pacote é go -gettable: go get -u github.com/chewxy/lingo
Este pacote e suas subpackagens dependem de muito poucos pacotes externos. Aqui estão eles:
| Pacote | Usado para | Vitalidade | Notas | Licença |
|---|---|---|---|---|
| Gorgonia | Aprendizado de máquina | Vital. Não será difícil reescrevê -los, mas por quê? | Mesmo autor | Licença de Gorgonia (tipo Apache 2.0) |
| GographViz | Visualização de anotações e outras visualizações relacionadas a gráficos | Vital para visualizações, que são um recurso agradável de ter | API mudou pela última vez em 12 de abril de 2017 | Licença GographViz (Apache 2.0) |
| erros | Erros | O pacote não morre sem ele, mas é muito bom ter | API estável para o ano passado | Licença de erros (MIT/BSD) |
| definir | Definir operações | Pode ser facilmente substituído | API estável para o ano passado | Defina a licença (MIT/BSD) |
Veja os pacotes individuais para uso. Há também um monte de executáveis no diretório cmd . Eles devem ser exemplos de como um pipeline de processamento de linguagem natural pode ser configurado.
Um pipeline de linguagem natural com este pacote é fortemente acionado por canais. Aqui está um exemplo para análise de dependência:
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 tarefas específicas (marcação de POS, análise, reconhecimento de entidade nomeado etc.), consulte o ReadMe de cada subpackagem. Este pacote por si só fornece principalmente as estruturas de dados que as subpackagens usarão.
Talvez a estrutura de dados mais importante seja a *Annotation . Basicamente, mantém uma palavra e os metadados associados para a palavra.
Para pastas de dependência, o gráfico assume três formulários: *Dependency , *DependencyTree e *Annotation . Todas as três formas são convertíveis de uma para outra. TODO: Explique a justificativa por trás de cada tipo de dados.
Uma peculiaridade específica que você deve ter notado é que o POSTag e DependencyType são codificados como constantes. De fato, este pacote fornece duas variações de cada uma: uma de Stanford/Penn Treebank e uma da Universidade dependências.
A principal razão para codificar isso é principalmente por razões de desempenho - sabendo com antecedência quanto alocar reduz muito trabalho adicional que o programa precisa fazer. Também reduz as chances de mutar uma variável global.
É claro que isso ocorre como uma troca - os programas são limitados a essas duas opções. Felizmente, há apenas um número limitado de tags e tipos de relação de dependência. Dois dos mais populares (Stanford/PTB e dependências universais) foram implementados.
As seguintes tags de construção são suportadas:
Para usar um conjunto de tag ou relset específico, crie seu programa assim: go build -tags='stanfordtags' .
A tag padrão e os tipos Rel de dependência são a versão de dependências universais.
Você também deve observar que o Tokenizer, lingo/lexer não é o seu tokenizador de NLP comum. É um tokenizador que tokeniza pelo espaço, com algumas regras específicas para o inglês. Foi inspirado na palestra de Rob Pike sobre Lexers. Eu pensei que seria legal escrever algo assim para a PNL.
Os casos de teste no lingo/lexer mostram como ele lida com o Unicode e outros ingleses patalógicos.
consulte Contribuindo.md para mais informações
Este pacote está licenciado sob a licença do MIT.