If you like the project, please ★ star this repository to show your support!
A Machine Learning library written in pure Go designed to support relevant neural architectures in Natural Language Processing.
spaGO is self-contained, in that it uses its own lightweight computational graph framework for both training and inference, easy to understand from start to finish.
Natural Language Processing
- Memory-efficient Word Embeddings (with badger key–value store)
- Character Language Models
- Recurrent Sequence Labeler with CRF on top ( e.g. Named Entities Recognition)
- Transformer models:
Internal Machine Learning Framework
- Define-by-Run (default, just like PyTorch does)
- Define-and-Run (similar to the static graph of TensorFlow)
- Gradient descent (Adam, RAdam, RMS-Prop, AdaGrad, SGD)
- Differential Evolution
- Feed-forward models (Linear, Highway, Convolution, ...)
- Recurrent models (LSTM, GRU, BiLSTM...)
- Attention mechanisms (Self-Attention, Multi-Head Attention, ...)
- Recursive auto-encoders
spaGO is compatible with pre-trained state-of-the-art neural models:
Clone this repo or get the library:
go get -u github.com/nlpodyssey/spago
spaGO supports two main use cases, which are explained more in detail in the following.
Several programs can be leveraged to tour the current NLP capabilities in spaGO. A list of the demos now follows.
- Hugging Face Importer
- Masked Language Model
- Question Answering
- Machine Translation
- Named Entities Recognition
The Docker image can be built like this.
docker build -t spago:main . -f Dockerfile
You can access the core functionality of spaGO, i.e. optimizing mathematical expressions by back-propagating gradients through a computational graph, in your own code by using spaGO in library mode.
At a high level, it comprises four main modules:
To get started, look at the implementation of built-in neural models, such as the LSTM. Don't be afraid, it is straightforward Go code. The idea is that you could have written spaGO :)
You may find a Feature Source Tree useful for a quick overview of the library's package organization.
There is also a repo with handy examples, such as MNIST classification.
We're not at a v1.0.0 yet, so spaGO is currently work-in-progress.
However, it has been running smoothly for a quite a few months now in a system that analyzes thousands of news items a day!
Besides, it's pretty easy to get your hands on through, so you might want to use it in your real applications.
Early adopters may make use of it for production use today as long as they understand and accept that spaGO is not fully tested and that APIs might change.
Sadly, at the moment, spaGO is not GPU friendly by design.
We're glad you're thinking about contributing to spaGO! If you think something is missing or could be improved, please open issues and pull requests. If you'd like to help this project grow, we'd love to have you!
To start contributing, check the Contributing Guidelines.
We encourage you to write an issue. This would help the community grow.
If you really want to write to us privately, please email Matteo Grella with your questions or comments.
Projects Using spaGO
Below is a list of known projects that use spaGO:
- Golem - A batteries-included implementation of "TabNet: Attentive Interpretable Tabular Learning".
- WhatsNew - A simple tool to collect and process quite a few web news from multiple sources.
- Translator - A simple self-hostable Machine Translation service.
spaGO is a personal project that is part of the open-source NLP Odyssey initiative initiated by members of the EXOP team. I would therefore like to thank EXOP GmbH here, which is providing full support for development by promoting the project and giving it increasing importance.
We appreciate contributions of all kinds. We especially want to thank spaGO fiscal sponsors who contribute to ongoing project maintenance.
See our Open Collective page if you too are interested in becoming a sponsor.