Microserviço para processamento de linguagem natural utilizado pela assistenve virtual Aura para entendimento dos textos informados pelos usuários. A implementação é construída com base no pacote nlp.js.
Para executar o projeto, você precisa ter o seguinte instalado:
Feito a instalação das dependências, é necessário obter uma cópia do projeto. A forma recomendada é clonar o repositório para a sua máquina.
Para isso, rode:
git clone --recurse-submodules https://github.com/ccuffs/aura-nlp && cd aura-nlp
Isso criará e trocará para a pasta aura-nlp
com o código do projeto. Em seguinda, instale as dependências:
npm install
Existem várias formas de rodar o projeto, como a api web, treino, etc. Para saber todas as opções, rode:
node aura.js -h
Todas as funcionalidades são baseadas no formato node aura.js <comando>
, onde <comando>
é o módulo que você deseja executar.
Para iniciar o servidor web (api REST), rode o seguinte;
node aura.js serve
Após isso a aplicação estará rodando na porta 3000 e poderá ser acessada em localhost:3000.
DICA: use
node aura.js serve -p 8080
para escolher a porta do servidor web.
A API web, com todos os endpoints, estará acessivel em /api
, por exemplo localhost:3000/api. Por padrão, dois endpoints da api estão disponíveis:
- localhost:3000/api/qna/ para perguntas e respostas;
- localhost:3000/api/domain para informações de domínio específico.
Faça um teste acessando localhost:3000/api/qna/comida+favorita.
Quando o servidor web é iniciado, você pode informar quais engines (e modelos/urls) você deseja através do parâmetro -e
(ou --engine=
, cujo formato é <nome>:<url>:/path/para/modelo.nlp, <nome>:<url>:/path/para/modelo.nlp, etc
). O exemplo abaixo inicia o servidor web com duas engines (domain
e qna
), nas urls /api/domain-url
e /api/qna-url
, informando onde os modelos dessas duas engines estão:
node aura.js serve -p 3000 -e "domain:domain-url:./data/models/domain.model,qna:qna-url:./data/models/qna.model"
O repositório vem com alguns modelos muito simples prontos para uso. O ideal é você treinar seus próprios modelos. Veja nas seções a seguir como treinar seus modelos.
A melhor forma de manter um dataset para outros contribuirem é utilizar uma planilha no Google Spreadsheet. Para tornar uma delas disponível para download, faça o seguinte:
- Acesse a planilha
- Escolha
File > Publish to the web
- Configure o tipo para `Tab-separated values (.tsv)
- Clique
Publish
- Copie a URL resultante (será algo como
https://docs.google.com/spreadsheets/d/e/2PACX-1vS4GT7aqVyOHEGlSz-FPg1asFpq8ffoFwXFBoNiVQLR8uD6m2usl9t_bBwMm7VnXJoYvUFlV1HJRbJh/pub?output=tsv
).
Depois de publicar a planilha como TSV, você pode baixar e utilizar ela como dataset. Para isso, na raiz desse repositório, rode o seguinte comando (assumindo que a URL da planilha é a mesma do passo anterior; atualize a URL se sua planilha for diferente):
curl -L "https://docs.google.com/spreadsheets/d/e/2PACX-1vS4GT7aqVyOHEGlSz-FPg1asFpq8ffoFwXFBoNiVQLR8uD6m2usl9t_bBwMm7VnXJoYvUFlV1HJRbJh/pub?gid=0&single=true&output=tsv" > ./data/train/dataset.tsv
Isso criará o arquivo ./data/train/aura-domain.tsv
que pode ser utilizado para treinos.
Para treinar um novo modelo, você precisa especificar a engine e o local onde o modelo será escrito. A engine é o estilo de dados que serão processados. Atualmente existem duas engines disponíveis: domain
(conhecimento de domínio específico, inclusive NER) e qna
(perguntas e respostas).
Para treinar um modelo para a engine domain
, rode o seguinte:
node aura.js train --type="domain" --dataset="./data/train/aura-domain.tsv" --output="./data/models/domain.model"
Para treinar um modelo para a engine qna
, rode o seguinte:
node aura.js train --type="qna" --dataset="./data/train/aura-qna.tsv" --output="./data/models/qna.model"
Todas as engines são treinadas a partir de um arquivo .tsv
(tab-separed values). As seções a seguir explicam o formato de treinamento de cada engine.
Para a engine domain
, o formato do arquivo é o seguinte:
type | category | nickname | language | content |
---|---|---|---|---|
ner | hero | spiderman | en | Spiderman, Spider-man |
ner | hero | iron man | en | Iron Man, Ironman, iron-man |
ner | hero | thor | en | Thor |
ner | food | burger | en | Burguer, Hamburguer |
doc | sawhero | en | I saw %hero% eating %food% | |
doc | wanteat | en | I want to eat %food% |
A coluna type
informa o tipo da linha. Os tipos possiveis são ner
(entidade nomeada) e doc
(informação qualquer). Ambos os tipos tem uma coluna category
que informa a categoria que aquela linha/entidade pertence, e uma coluna language
que informa a linguagem.
Uma linha do tipo ner
tem os seguintes atributos:
nickname
: nome curto para a entidade em questão;content
: nomes reais da entidade, que são todas as variações possíveis do nome, separados por,
.
Uma linha do tipo doc
tem os seguintes atributos:
nickname
: (não possui, então deixar vazio).content
: frase que exemplifica o uso de algumaner
. Aqui você pode usar o nome de uma categoria de ner entre%
, por exemplo,%hero%
para se referir a todas as ners que sejam hero. A fraseI saw %hero% eating %food%
treinará o modelo para encontrar frases do tipoI saw Thor eating Hamburguer
(%hero%
é thor,%food%
é burger).
Para a engine qna
, o formato do arquivo é o seguinte:
question | answer |
---|---|
Fale sobre você | Sou uma agente virtual |
Porque você está aqui | Porque é muito legal |
Não há tipos de colunas, apenas uma organização no formato pergunta \t resposta
.
Sua ajuda é muito bem-vinda, independente da forma! Confira o arquivo CONTRIBUTING.md para conhecer todas as formas de contribuir com o projeto. Por exemplo, sugerir uma nova funcionalidade, reportar um problema/bug, enviar um pull request, ou simplemente utilizar o projeto e comentar sua experiência.
Veja o arquivo ROADMAP.md para ter uma ideia de como o projeto deve evoluir.
Esse projeto é licenciado nos termos da licença open-source MIT e está disponível de graça.
Veja todas as alterações desse projeto no arquivo CHANGELOG.md.
Abaixo está uma lista de links interessantes e projetos similares: