From b4719b0388a29c6f5c839c99414d48e06de70d2d Mon Sep 17 00:00:00 2001 From: rickecr Date: Fri, 19 Jun 2020 17:44:39 -0300 Subject: [PATCH 1/6] update docs --- docs/geoparsing/introdution.md | 4 +-- docs/index.md | 47 +++++++++++++++++------------- docs/topic_modeling/introdution.md | 30 +++++++++---------- 3 files changed, 43 insertions(+), 38 deletions(-) diff --git a/docs/geoparsing/introdution.md b/docs/geoparsing/introdution.md index b64d1b7..eea5971 100644 --- a/docs/geoparsing/introdution.md +++ b/docs/geoparsing/introdution.md @@ -1,10 +1,10 @@ # Introdução -PyElit é uma biblioteca desenvolvida para ser utilizada em um projeto de pesquisa no [LSI-UFCG](https://sites.google.com/view/lsi-ufcg). Entretanto, foi decidido que seria melhor disponibilizar para a comunidade, assim permitindo que outros desenvolvedores possam contribuir para melhorar a biblioteca, seja com novas funcionalidades, melhorias, mostrando BUGs e etc. +PyElit é uma biblioteca que permite realizar o geoparsing de um certo texto. Por enquanto não é possível treinar com um gazetteer passado, mas isso está com futuras funcionalidades da biblioteca. ## Objetivo -A biblioteca tem como objetivo realizar o Geoparsing de textos, permitindo que seja utilizados gazetteer para melhorar as buscas, atualmente só tem o gazetteer de algumas regiões do estado da Paraíba, em grande parte nas cidades de: Campina Grande e João Pessoa. +A biblioteca tem como um dos objetivos realizar o Geoparsing de textos, permitindo que seja utilizados gazetteer para melhorar as buscas, atualmente só tem o gazetteer de algumas regiões do estado da Paraíba, em grande parte nas cidades de: Campina Grande e João Pessoa. E também tem como objetivo realizar a classificação de textos que envolvam certos tipos de problemas urbanos. Futuramente poderiamos permitir que o usuário da biblioteca forneça os textos para que então realizassemos o tratamento e a geração de tópicos. diff --git a/docs/index.md b/docs/index.md index b1285d9..ee6da00 100644 --- a/docs/index.md +++ b/docs/index.md @@ -6,41 +6,46 @@ - [TopicModeling](#topicmodeling) ## O que é PyElit ? -PyElit, Extraction of Locations and Issues of a Text, é uma biblioteca open-source gratuita para realização de Geoparsing e Modelagem de Tópicos desenvolvida em Python. -Você trabalha com muitos textos ? Quer extrair localizações ? -Quer saber qual o problema urbano trata o seu texto ? +PyElit, Extraction of Locations and Issues of a Text, é uma biblioteca open-source para realização de Geoparsing e Modelagem de Tópicos desenvolvida em Python. É uma biblioteca desenvolvida para ser utilizada em um projeto de pesquisa no [Laboratório de Sistemas da Informação - UFCG](https://sites.google.com/view/lsi-ufcg). Entretanto foi decidido que seria melhor disponibilizar para a comunidade, assim permitindo que outros desenvolvedores possam contribuir para melhorar a biblioteca, seja com novas funcionalidades, melhorias, mostrando BUGs e etc. -O PyElit foi criado especialmente para isso. Com ele é possível extrair localizações e classificar textos que em tópicos de problemas urbanos. No inicio, a biblioteca seria usada para um projeto que necessita de saídas como essas extração de localidades e a classificação dos textos em problemas urbanos. Pesquisa realizada no [Laboratório de Sistemas da Informação - UFCG](https://sites.google.com/view/lsi-ufcg). +Você trabalha com muitos textos ? Quer extrair localizações ? Quer saber qual problema urbano é tratado no seu texto ? -Entretanto, foi decidido que a biblioteca seria disponibilizada para a comunidade. Sabemos que a biblioteca não é capaz de resolver todos os problemas, mas foi útil para o projeto que iniciou sua criação. Portanto, permitimos que os usuários da biblioteca possam fazer alterações no código fonte, adaptando ao seu problema para então obter melhores resultados em suas pesquisas, assim contribuindo para um maior número de pessoas. +PyElit tem como um dos objetivos realizar o Geoparsing de textos, permitindo que seja utilizados gazetteer para melhorar as buscas, atualmente só tem o gazetteer de algumas regiões do estado da Paraíba, em grande parte nas cidades de: Campina Grande e João Pessoa. + +E também tem como objetivo realizar a classificação de textos que envolvam certos tipos de problemas urbanos. Futuramente poderiamos permitir que os usuários da biblioteca forneça os textos para que então realizassemos o tratamento e a geração de tópicos. + +Sabemos que a biblioteca não é capaz de resolver todos os problemas, mas foi útil para o projeto que deu inicio a sua criação. Portanto permitimos que os usuários da biblioteca possam fazer alterações no código fonte, adaptando ao seu problema para então obter melhores resultados em suas pesquisas, assim a biblioteca poderá ser útil para um maior número de pessoas. E assim os usuários que conseguirem fazer melhorias poderia enviar PRs para o aprimoramento da biblioteca. ## Funcionalidades: -| Funcionalidade | Descrição | -| -------------- | --------- | -| Geoparsing | Permite extrair localizações de um texto qualquer. | -| TopicModeling | Permite classificar um dado texto para um determinado tópico de problemas urbanos | + +| Funcionalidade | Descrição | +| -------------- | --------------------------------------------------------------------------------- | +| Geoparsing | Permite extrair localizações de um texto qualquer. | +| TopicModeling | Permite classificar um dado texto para um determinado tópico de problemas urbanos | ## Geoparsing -Detalhes de como funciona e como usar o Geoparsing da biblioteca. + +Detalhes de como funciona o Geoparsing da biblioteca. - [Introdução](geoparsing/introdution.md) - - [Objetivo](geoparsing/introdution.md#objetivo) + - [Objetivo](geoparsing/introdution.md#objetivo) - [Como usar ?](geoparsing/introdution.md#como-usar-) - - [Geoparsing em texto com case correto](geoparsing/introdution.md#geoparsing-com-case-correto-sem-utilização-do-gazetteer) - - [Geoparsing em texto com case incorreto](geoparsing/introdution.md#geoparsing-com-case-incorreto-sem-utilização-do-gazetteer) - - [Geoparsing com o gazetteer(disponibilizado pela própria biblioteca)](geoparsing/introdution.md#geoparsing-com-gazetteer) + - [Geoparsing em texto com case correto](geoparsing/introdution.md#geoparsing-com-case-correto-sem-utilização-do-gazetteer) + - [Geoparsing em texto com case incorreto](geoparsing/introdution.md#geoparsing-com-case-incorreto-sem-utilização-do-gazetteer) + - [Geoparsing com o gazetteer(disponibilizado pela própria biblioteca)](geoparsing/introdution.md#geoparsing-com-gazetteer) ## TopicModeling -Detalhes de como funciona e como usar o TopicModeling da biblioteca + +Detalhes de como funciona o TopicModeling da biblioteca - [Introdução](topic_modeling/introdution.md#introdução) - - [Objetivo](topic_modeling/introdution.md#objetivo) + - [Objetivo](topic_modeling/introdution.md#objetivo) - [Como usar ?](topic_modeling/introdution.md#como-usar-) - - [Classificar um texto](topic_modeling/introdution.md#topicmodeling-classificar-um-texto) - - [Imrpimir tópicos](topic_modeling/introdution.md#topicmodeling-imprimir-tópicos) - - [Imprimir palavras chaves dos tópicos](topic_modeling/introdution.md#topicmodeling-imprimir-palavras-chaves-e-seus-pesos-em-cada-tópico) - - [Representatividade do nome dos tópicos](topic_modeling/introdution.md#topicmodeling-mudar-representatividade-do-nomes-dos-tópicos) - - [Imprimir tópico pelo ID](topic_modeling/introdution.md#topicmodeling-imprimir-um-tópico-por-meio-do-id-dele) \ No newline at end of file + - [Classificar um texto](topic_modeling/introdution.md#topicmodeling-classificar-um-texto) + - [Imrpimir tópicos](topic_modeling/introdution.md#topicmodeling-imprimir-tópicos) + - [Imprimir palavras chaves dos tópicos](topic_modeling/introdution.md#topicmodeling-imprimir-palavras-chaves-e-seus-pesos-em-cada-tópico) + - [Representatividade do nome dos tópicos](topic_modeling/introdution.md#topicmodeling-mudar-representatividade-do-nomes-dos-tópicos) + - [Imprimir tópico pelo ID](topic_modeling/introdution.md#topicmodeling-imprimir-um-tópico-por-meio-do-id-dele) diff --git a/docs/topic_modeling/introdution.md b/docs/topic_modeling/introdution.md index 1f53f28..aed898b 100644 --- a/docs/topic_modeling/introdution.md +++ b/docs/topic_modeling/introdution.md @@ -1,10 +1,10 @@ # Introdução -PyElit também é uma biblioteca que permite classificar textos que tratem de problemas urbanos. Por enquanto não é possível treinar seus próprios dados. +PyElit também é uma biblioteca que permite classificar textos que tratem de problemas urbanos. Por enquanto não é possível treinar o modelo com seus próprios dados. ## Objetivo -O módulo tem como objetivo classificar um texto em um dos problemas urbanos treinados no modelo: saneamento, trânsito, obras e diversos. O modelo foi treinado com reportagens do quadro de televisão: Calendário JPB do telejornal JPB da TV Cabo Branco. +O módulo tem como objetivo classificar um texto em um dos problemas urbanos treinados no modelo: saneamento básico, trânsito, obras e diversos. O modelo foi treinado com reportagens do quadro de televisão: Calendário JPB do telejornal JPB da TV Cabo Branco afiliada da Rede Globo. Permite também a visualização de documentos de textos daquele tópico, permite que vejamos as palavras chaves de um determinado tópico. @@ -17,11 +17,11 @@ Vamos ver alguns exemplos de como usar: ## TopicModeling: Classificar um texto ```python -m = TopicModeling() -r = m.rate_text("o ginásio da Escola Maria Honoriana Santiago está com obras paradas desde do início do ano.") +topicModeling = TopicModeling() +result = topicModeling.rate_text("o ginásio da Escola Maria Honoriana Santiago está com obras paradas desde do início do ano.") -print("Tópicos e probabilidades:", r) -print("Tópico:", m.get_topic(r[0][0])) +print("Tópicos e probabilidades:", result) +print("Tópico:", topicModeling.get_topic(r[0][0])) ``` Saídas para esse exemplo: @@ -34,8 +34,8 @@ Tópico: obras ## TopicModeling: Imprimir tópicos ```python -m = TopicModeling() -print(m.print_topics()) +topicModeling = TopicModeling() +print(topicModeling.print_topics()) ``` Saída para esse exemplo: @@ -47,9 +47,9 @@ Saída para esse exemplo: ## TopicModeling: Imprimir palavras chaves e seus pesos em cada tópico ```python -m = TopicModeling() +topicModeling = TopicModeling() -print(m.print_keywords(quant_max_palavras=2)) +print(topicModeling.print_keywords(quant_max_palavras=2)) ``` Saída para esse exemplo: @@ -61,10 +61,10 @@ Saída para esse exemplo: ## TopicModeling: Mudar representatividade do nomes dos tópicos ```python -m = TopicModeling() +topicModeling = TopicModeling() -m.represent_topics([0, 1, 2, 3], ['Saneamento', 'Trânsito','Obras', 'Diversos']) -print(m.print_topics()) +topicModeling.represent_topics([0, 1, 2, 3], ['Saneamento', 'Trânsito','Obras', 'Diversos']) +print(topicModeling.print_topics()) ``` Saída para esse exemplo: @@ -76,9 +76,9 @@ Saída para esse exemplo: ## TopicModeling: Imprimir um tópico por meio do id dele ```python -m = TopicModeling() +topicModeling = TopicModeling() -print(m.get_topic(id_topic=1)) +print(topicModeling.get_topic(id_topic=1)) ``` Saída para esse exemplo: From 080393246a44ddca62b10ed48501498afcf53288 Mon Sep 17 00:00:00 2001 From: rickecr Date: Fri, 19 Jun 2020 19:46:01 -0300 Subject: [PATCH 2/6] Final documentation update --- docs/geoparsing/introdution.md | 4 +--- docs/index.md | 20 ++++++++++---------- docs/topic_modeling/introdution.md | 10 +++++----- 3 files changed, 16 insertions(+), 18 deletions(-) diff --git a/docs/geoparsing/introdution.md b/docs/geoparsing/introdution.md index eea5971..3f916bd 100644 --- a/docs/geoparsing/introdution.md +++ b/docs/geoparsing/introdution.md @@ -1,13 +1,11 @@ # Introdução -PyElit é uma biblioteca que permite realizar o geoparsing de um certo texto. Por enquanto não é possível treinar com um gazetteer passado, mas isso está com futuras funcionalidades da biblioteca. +PyElit é uma biblioteca que permite realizar o geoparsing de um certo texto. Por enquanto não é possível treinar com um gazetteer passado, mas isso está como ideias futuras para a biblioteca. ## Objetivo A biblioteca tem como um dos objetivos realizar o Geoparsing de textos, permitindo que seja utilizados gazetteer para melhorar as buscas, atualmente só tem o gazetteer de algumas regiões do estado da Paraíba, em grande parte nas cidades de: Campina Grande e João Pessoa. -E também tem como objetivo realizar a classificação de textos que envolvam certos tipos de problemas urbanos. Futuramente poderiamos permitir que o usuário da biblioteca forneça os textos para que então realizassemos o tratamento e a geração de tópicos. - # Como usar ? A classe `Geoparsing` é bastante simples de usar, basta importar e iniciar um objeto como instância da classe. diff --git a/docs/index.md b/docs/index.md index ee6da00..c58c59f 100644 --- a/docs/index.md +++ b/docs/index.md @@ -7,24 +7,24 @@ ## O que é PyElit ? -PyElit, Extraction of Locations and Issues of a Text, é uma biblioteca open-source para realização de Geoparsing e Modelagem de Tópicos desenvolvida em Python. É uma biblioteca desenvolvida para ser utilizada em um projeto de pesquisa no [Laboratório de Sistemas da Informação - UFCG](https://sites.google.com/view/lsi-ufcg). Entretanto foi decidido que seria melhor disponibilizar para a comunidade, assim permitindo que outros desenvolvedores possam contribuir para melhorar a biblioteca, seja com novas funcionalidades, melhorias, mostrando BUGs e etc. +PyElit, Extraction of Locations and Issues of a Text, é uma biblioteca open-source para realização de Geoparsing e Modelagem de Tópicos desenvolvida em Python. É uma biblioteca desenvolvida para ser utilizada em um projeto de pesquisa no [Laboratório de Sistemas da Informação - UFCG](https://sites.google.com/view/lsi-ufcg). Entretanto foi decidido que seria melhor disponibilizar para a comunidade, assim permitindo que outros desenvolvedores possam contribuir para melhorar a biblioteca, seja com novas funcionalidades, melhorias, reportando BUGs e etc. -Você trabalha com muitos textos ? Quer extrair localizações ? Quer saber qual problema urbano é tratado no seu texto ? +Você trabalha com muitos textos ? Quer extrair localizações ? Quer saber qual problema urbano é tratado em um texto ? -PyElit tem como um dos objetivos realizar o Geoparsing de textos, permitindo que seja utilizados gazetteer para melhorar as buscas, atualmente só tem o gazetteer de algumas regiões do estado da Paraíba, em grande parte nas cidades de: Campina Grande e João Pessoa. +PyElit tem como um dos objetivos realizar o Geoparsing de textos, permitindo que seja utilizado gazetteer para melhorar as buscas, atualmente só tem o gazetteer de algumas regiões do estado da Paraíba, em grande parte nas cidades de: Campina Grande e João Pessoa. E também tem como objetivo realizar a classificação de textos que envolvam certos tipos de problemas urbanos. Futuramente poderiamos permitir que os usuários da biblioteca forneça os textos para que então realizassemos o tratamento e a geração de tópicos. Sabemos que a biblioteca não é capaz de resolver todos os problemas, mas foi útil para o projeto que deu inicio a sua criação. Portanto permitimos que os usuários da biblioteca possam fazer alterações no código fonte, adaptando ao seu problema para então obter melhores resultados em suas pesquisas, assim a biblioteca poderá ser útil para um maior número de pessoas. -E assim os usuários que conseguirem fazer melhorias poderia enviar PRs para o aprimoramento da biblioteca. +E assim os usuários que conseguirem fazer melhorias poderá enviar PRs para o aprimoramento da biblioteca. ## Funcionalidades: -| Funcionalidade | Descrição | -| -------------- | --------------------------------------------------------------------------------- | -| Geoparsing | Permite extrair localizações de um texto qualquer. | -| TopicModeling | Permite classificar um dado texto para um determinado tópico de problemas urbanos | +| Funcionalidade | Descrição | +| -------------- | ------------------------------------------------------------ | +| Geoparsing | Permite extrair localizações de um texto qualquer. | +| Topic Modeling | Permite classificar um dado texto para um determinado tópico | ## Geoparsing @@ -37,9 +37,9 @@ Detalhes de como funciona o Geoparsing da biblioteca. - [Geoparsing em texto com case incorreto](geoparsing/introdution.md#geoparsing-com-case-incorreto-sem-utilização-do-gazetteer) - [Geoparsing com o gazetteer(disponibilizado pela própria biblioteca)](geoparsing/introdution.md#geoparsing-com-gazetteer) -## TopicModeling +## Topic Modeling -Detalhes de como funciona o TopicModeling da biblioteca +Detalhes de como funciona o Topic Modeling da biblioteca - [Introdução](topic_modeling/introdution.md#introdução) - [Objetivo](topic_modeling/introdution.md#objetivo) diff --git a/docs/topic_modeling/introdution.md b/docs/topic_modeling/introdution.md index aed898b..1a9ad8e 100644 --- a/docs/topic_modeling/introdution.md +++ b/docs/topic_modeling/introdution.md @@ -14,7 +14,7 @@ A classe `TopicModeling` é bastante simple de ser utilizada. Basta importar e i Vamos ver alguns exemplos de como usar: -## TopicModeling: Classificar um texto +## Topic Modeling: Classificar um texto ```python topicModeling = TopicModeling() @@ -31,7 +31,7 @@ Tópicos e probabilidades: [(2, 0.80940521), (0, 0.064506963), (1, 0.063506372), Tópico: obras ``` -## TopicModeling: Imprimir tópicos +## Topic Modeling: Imprimir tópicos ```python topicModeling = TopicModeling() @@ -44,7 +44,7 @@ Saída para esse exemplo: {0: 'saneamento', 1: 'trânsito', 2: 'obras', 3: 'diversos'} ``` -## TopicModeling: Imprimir palavras chaves e seus pesos em cada tópico +## Topic Modeling: Imprimir palavras chaves e seus pesos em cada tópico ```python topicModeling = TopicModeling() @@ -58,7 +58,7 @@ Saída para esse exemplo: [(0, '0.016*"água" + 0.015*"esgoto"'), (1, '0.025*"velocidad" + 0.024*"faixa"'), (2, '0.012*"escola" + 0.011*"obra"'), (3, '0.034*"estrada" + 0.015*"féria"')] ``` -## TopicModeling: Mudar representatividade do nomes dos tópicos +## Topic Modeling: Mudar representatividade do nomes dos tópicos ```python topicModeling = TopicModeling() @@ -73,7 +73,7 @@ Saída para esse exemplo: {0: 'Saneamento', 1: 'Trânsito', 2: 'Obras', 3: 'Diversos'} ``` -## TopicModeling: Imprimir um tópico por meio do id dele +## Topic Modeling: Imprimir um tópico por meio do id dele ```python topicModeling = TopicModeling() From 1539d7446882bde69f812c35c37133d218bb8542 Mon Sep 17 00:00:00 2001 From: rickecr Date: Fri, 19 Jun 2020 20:48:12 -0300 Subject: [PATCH 3/6] add CONTRIBUTING.md #17 --- CONTRIBUTING.md | 142 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..9bd6e3b --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,142 @@ +# Contributing + +> Pode contribuir a vontade, você será sempre bem-vindo(a). Mas temos algumas regras para serem seguidas para que todos sejam bem recebidos por todos e que todos possam contribuir de maneira feliz :smiley:. + +## Adicionar/Atualizar funcionalidades + +Você olhou a aplicação e pensou em alguma funcionalidade que deveria ser adicionada no projeto ? :open_mouth: + +**_Então, você tem dois passos para seguir:_** + +- [Abrir uma issue detalhando sua ideia](#criando-uma-issue) +- [Você mesmo implementar a funcionalidade](#contribuir-com-implementação) + +## Criando uma issue + +Na página do [projeto](https://github.com/Rickecr/PyElit), você pode clicar no botão `Issues` e na página irá aparecer um botão `new issue`, então é só selecionar e seguir os seguintes passos: + +- Selecione o tipo da sua issue: `Bug ou Feature`. +- Dê um bom nome a sua issue. +- Detalhe bem sobre qual objetivo da issue. +- Imagens caso possível. +- Selecione labels para sua issue. +- Por fim, clique em `Submit new issue`. + +## Clonar o repositório + +Na página inicial do [repositório](https://github.com/Rickecr/PyElit) tem um botão `Fork`. Ao clicar é só esperar concluir o fork. E então ele irá criar o repositório na sua conta. E agora é só clonar em sua máquina, assim: + +```sh +git clone https://github.com//PyElit +``` + +Ao concluir, você terá o repositório em seu computador e então é só abrir em seu editor preferido e fazer suas modificações. + +Antes você deve criar sua branch para seu desenvolvimento: + +```sh +git checkout -b +``` + +Para o nome da branch use o número da issue para facilitar, ex: `issue_17`. + +E agora pode começar o desenvolvimento :smiley: . + +Ao terminar suas modificações, você deve commitar suas alterações, mas primeiro: + +```sh +git add . +``` + +O comando acima irá preparar todos os arquivos modificados para serem commitados, passando por todas as alterações que foram feitas por você onde decedirá se a alteração será adicionada (você deve estar dentro da pasta do projeto para usar o comando). Agora é só commitar as alterações: + +```sh +git commit -m "" +``` + +Lembre-se de usar mensagens claras. Se o que você está resolvendo já possui uma issue aberta, faça referência a issue no commit. Ex: `git commit -m "#17 - Add contributing.md"` + +E por fim, você irá enviar as alterações para o repositório remoto: + +```sh +git push --set-upstream origin +``` + +Isso é apenas na primeira vez que vai enviar uma nova branch para o repositório remoto, nas próximas vezes, basta apenas: + +```sh +git push +``` + +Mas isso só irá alterar no seu fork, o repositório oficial não vai ter suas alterações e agora ? :confused: + +Calma, agora que entra a `Pull Request` ou `PR` + +## Contribuir com implementação: + +Depois de ter realizado o fork e o clone do projeto, escolhido seu editor de texto favorito. Então é hora de codar. + +Mas calma ai, antes de qualquer coisa, você deve **escolher uma issue** que pretender trabalhar. Se a issue que trata sobre a funcionalidade não existir, você deve criar e dizer que esta trabalhando nela, caso ela exista você deve dizer lá(caso não já tenha alguém) que pretende trabalhar na issue. E após feito isso, agora sim você está pronto para **codar**. + +### Entendendo as pastas: + +O projeto se encontra na pasta `pyelit`, estamos aceitando dicas de nomes para biblioteca também :blush: . + +- Na pasta `dados`: Possue os textos usados para treinar o topic modeling. + +- Na pasta `docs`: Encontra-se os arquivos de documentação da biblioteca. + +- Na pasta `Geoparsing`: Encontra-se todos os arquivos sobre as funcionalidades relacionadas com o geoparsing. + + - Na pasta `./gazetteer`: Encontra-se os arquivos do gazetteer usados pela biblioteca. + - Na pasta `./utils`: Encontra-se os arquivos onde tem as funções que foram/são utilizadas pela biblioteca. Ex: Para processar os dados do gazetteer. + +- Na pasta `Pre_processamento`: Encontra-se os arquivos usados para processamentos dos dados, funções que podem ser uteis para o geoparsing e topic modeling. + +- Na pasta `TopicModeling`: Encontra-se todos os arquivos sobre as funcionalidades relacionadas com o topic modeling. + + - Na pasta `modelo`: Encontra-se o modelo treinado do Topic Modeling. + +### Como executar a aplicação: + +Primeiro você precisa instalar as dependências usadas no projeto. + +- Instalar as dependências: + +```bash +$ pip install -r requirements.txt +``` + +E pronto, você está pronto para iniciar o desenvolvimento. + +**OBS:** Executar o comando acima dentro da pasta do projeto. + +- Agora você esta pronto para implementar sua funcionalidade/correção. + +### Entrando nos padrões: + +Nós optamos por seguir o padrão da [PEP 8](https://www.python.org/dev/peps/pep-0008/). Para isso instale a extensão do [Python para o VSCode](https://marketplace.visualstudio.com/items?itemName=ms-python.python). Outra solução é usar o pycodestyle. + +#### Pycodestyle: + +- Primeiro você precisa instalar o pycodestyle: + + ```bash + $ pip install pycodestyle + ``` + +- Para executar o pycodestyle: + + ```bash + pycodestyle . + ``` + +## Realizando uma Pull Request - PR + +Na página do seu fork irá aparecer uma mensagem em amarelo solicitando que você faça uma Pull Request para o repositório original. Ao clicar irá abrir uma página para você preencher as informações sobre sua PR. + +- Referencie a issue em que você está trabalhando usando `#` + +- Descreva suas modificações + +- Espere pela avaliação da sua PR, e pode ocorrer de pedimos algumas alterações a seres feitas From 2d607d8d538c0c8ccd251264d079a2b44142ee5c Mon Sep 17 00:00:00 2001 From: rickecr Date: Fri, 19 Jun 2020 20:54:27 -0300 Subject: [PATCH 4/6] add templates github --- .github/ISSUE_TEMPLATE/discuss-o.md | 19 +++++++++++++++++++ .github/ISSUE_TEMPLATE/feature.md | 19 +++++++++++++++++++ .github/ISSUE_TEMPLATE/reporte-o-bug.md | 22 ++++++++++++++++++++++ .github/PULL_REQUEST_TEMPLATE.md | 24 ++++++++++++++++++++++++ 4 files changed, 84 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/discuss-o.md create mode 100644 .github/ISSUE_TEMPLATE/feature.md create mode 100644 .github/ISSUE_TEMPLATE/reporte-o-bug.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/ISSUE_TEMPLATE/discuss-o.md b/.github/ISSUE_TEMPLATE/discuss-o.md new file mode 100644 index 0000000..8b6de62 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/discuss-o.md @@ -0,0 +1,19 @@ +--- +name: DISCUSSÃO +about: Inicia uma discussão sobre um determinado assunto. +title: Discussão +labels: question +assignees: "" +--- + +**Descrição da discussão:** + + + +**Necessidade:** + + + +**Seu ponto de vista:** + + diff --git a/.github/ISSUE_TEMPLATE/feature.md b/.github/ISSUE_TEMPLATE/feature.md new file mode 100644 index 0000000..b0960cc --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature.md @@ -0,0 +1,19 @@ +--- +name: FEATURE +about: Sugira uma ideia para esse projeto +title: Feature +labels: enhancement +assignees: "" +--- + +**Descrição da feature:** + + + +**Necessidade:** + + + +**Implementação:** + + diff --git a/.github/ISSUE_TEMPLATE/reporte-o-bug.md b/.github/ISSUE_TEMPLATE/reporte-o-bug.md new file mode 100644 index 0000000..59cc856 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/reporte-o-bug.md @@ -0,0 +1,22 @@ +--- +name: BUG +about: Crie um relatório para nos ajudar +title: Bug +labels: bug +assignees: "" +--- + +**Descrição do bug** + + + +**Reproduzir o bug** +Etapas para reproduzir o bug: + +1. +2. +3. + +**Comportamento esperado** + + diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..25cc774 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,24 @@ +--- +name: PR +about: Abrir uma Pull Request +title: PR +labels: enhancement +assignees: "" +--- + +#Numero_da_issue + +**Descrição do bug/feature:** + + + +**Solução** + + + +**Coisas a serem feitas** + + + + From e50cc74771ace3f24a51d392c5d2951a7773c508 Mon Sep 17 00:00:00 2001 From: Rich Date: Sat, 20 Jun 2020 16:12:24 -0300 Subject: [PATCH 5/6] Add pipenv, pycodestyle and update CONTRIBUTING.md --- .gitignore | 1 + CONTRIBUTING.md | 25 +- Main.py | 8 +- Pipfile | 3 +- Pipfile.lock | 452 +++++++++--------- pyelit/Geoparsing/Geoparsing.py | 102 ++-- pyelit/Geoparsing/preprocessing_gazetteer.py | 296 ++++++------ pyelit/Geoparsing/utils/utils.py | 195 ++++---- pyelit/Pre_processamento/pre_processamento.py | 13 +- pyelit/TopicModeling/TopicModeling.py | 40 +- pyelit/TopicModeling/Train.py | 23 +- setup.py | 4 +- 12 files changed, 639 insertions(+), 523 deletions(-) diff --git a/.gitignore b/.gitignore index 396d477..cdaa0a2 100644 --- a/.gitignore +++ b/.gitignore @@ -88,6 +88,7 @@ celerybeat-schedule *.sage.py # Environments +.env/ .env .venv env/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9bd6e3b..4fa274c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -99,12 +99,25 @@ O projeto se encontra na pasta `pyelit`, estamos aceitando dicas de nomes para b ### Como executar a aplicação: -Primeiro você precisa instalar as dependências usadas no projeto. +Usamos o pipenv para melhor facilidade de gerenciamento das dependências. +Então é preciso instalar antes de tudo: -- Instalar as dependências: +- Instalar o pipenv: ```bash -$ pip install -r requirements.txt +$ pip install pipenv +``` + +Agora você deve ativar o virtualenv(aqui já será instalada todas as libs utilizadas): + +```bash +$ pipenv shell +``` + +Agora você precisar instalar o modelo em pt-br do spacy: + +```bash +$ python -m spacy download pt_core_news_sm ``` E pronto, você está pronto para iniciar o desenvolvimento. @@ -119,11 +132,9 @@ Nós optamos por seguir o padrão da [PEP 8](https://www.python.org/dev/peps/pep #### Pycodestyle: -- Primeiro você precisa instalar o pycodestyle: +Ele já é uma dev-package no projeto. - ```bash - $ pip install pycodestyle - ``` +Com o virtualenv ativado, você pode executar o pycodestyle: - Para executar o pycodestyle: diff --git a/Main.py b/Main.py index 8879d2a..a4dcc28 100644 --- a/Main.py +++ b/Main.py @@ -4,15 +4,15 @@ # Geoparsing g = Geoparsing() r = g.geoparsing( - "Eu moro na Rua Treze de Maio no centro de campina grande", gazetteer_cg=True) + "Eu moro na Rua Treze de Maio no centro de campina grande", + gazetteer_cg=True) print(r[:3]) -print(len(r)) - # Topic Modeling # t = TopicModeling() -# r = t.rate_text("Minha rua esta cheia de lixo, as pessoas não respeitam nada") +# text = "Minha rua esta cheia de lixo, as pessoas não respeitam nada" +# r = t.rate_text(text) # print(t.print_keywords(quant_max_palavras=5)) diff --git a/Pipfile b/Pipfile index f6195ea..b9147de 100644 --- a/Pipfile +++ b/Pipfile @@ -4,6 +4,7 @@ url = "https://pypi.org/simple" verify_ssl = true [dev-packages] +pycodestyle = "*" [packages] gensim = "==3.8.0" @@ -17,4 +18,4 @@ plpygis = "*" pyLDAvis = "*" [requires] -python_version = "3.6" +python_version = "3.8" diff --git a/Pipfile.lock b/Pipfile.lock index 9f25b1b..1679c7f 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,11 +1,11 @@ { "_meta": { "hash": { - "sha256": "afc2354b7c3915b88a91999bfbf1855cac5b3bfe730d8c1039a7d9ef4605e257" + "sha256": "c0b3fe03c94a250614b5a2539ee9072a587c5668940558d86c40de4997215b18" }, "pipfile-spec": 6, "requires": { - "python_version": "3.6" + "python_version": "3.8" }, "sources": [ { @@ -16,18 +16,12 @@ ] }, "default": { - "atomicwrites": { - "hashes": [ - "sha256:03472c30eb2c5d1ba9227e4c2ca66ab8287fbfbbda3888aa93dc2e28fc6811b4", - "sha256:75a9445bac02d8d058d5e1fe689654ba5a6556a1dfd8ce6ec55a0ed79866cfa6" - ], - "version": "==1.3.0" - }, "attrs": { "hashes": [ "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c", "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72" ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==19.3.0" }, "blis": { @@ -57,24 +51,24 @@ }, "boto3": { "hashes": [ - "sha256:228cea7e2b3be79e5393719641854d4000826d7a7baebede903a616b505b8e17", - "sha256:ad6d50dd5726a12c6442c23aabec0c7e09ef610834d9fbda010bade6888d7677" + "sha256:4856c8cb4150b900cc7dccbdf16f542fb8c12e97b17639979e58760847f7cf35", + "sha256:fe6f7f58fa53c4dd86432315717c989a65a5a8748e6219a53725be1041c4a113" ], - "version": "==1.10.13" + "version": "==1.14.7" }, "botocore": { "hashes": [ - "sha256:33ee13a42ee1cc2391a3cd3ce12c84026db20cc76a5700d94fbe07a136d0c354", - "sha256:d1c6f01486566521b59fd5d4f6ba0adf526ed0d1807a0c0ba6604e982d014f3d" + "sha256:cce790e65368d28dfd715558daea6890922716efa69d3a4c76d80348a71ad460", + "sha256:e582e3ba61d812e8dd0939c0455c6f68cf41587506a3a30deafc54825087de01" ], - "version": "==1.13.13" + "version": "==1.17.7" }, "certifi": { "hashes": [ - "sha256:e4f3620cfea4f83eedc95b24abd9cd56f3c4b146dd0177e83a21b4eb49e21e50", - "sha256:fd7c7c74727ddcf00e9acd26bba8da604ffec95bf1c2144e67aff7a8b50e6cef" + "sha256:5930595817496dd21bb8dc35dad090f1c2cd0adfaf21204bf6732ca5d8ee34d3", + "sha256:8fc0819f1f30ba15bdb34cceffb9ef04d99f420f68eb75d901e9560b8749fc41" ], - "version": "==2019.9.11" + "version": "==2020.6.20" }, "chardet": { "hashes": [ @@ -85,45 +79,35 @@ }, "click": { "hashes": [ - "sha256:2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13", - "sha256:5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7" + "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a", + "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc" ], - "version": "==7.0" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==7.1.2" }, "cymem": { "hashes": [ - "sha256:081c652ae1aff4759813e93a2fc4df4ba410ce214a0e542988e24c62110d4cd0", - "sha256:0e447fa4cb6dccd0b96257a798370a17bef3ec254a527230058e41816a777c04", - "sha256:2c8267dcb15cc6ab318f01ceaf16b8440c0386ae44014d5b22fefe5b0398d05c", - "sha256:46141111eedbb5b0d8c9386b00226a15f5727a1202b9095f4363d425f259267e", - "sha256:4994c1f3e948bd58a6e38c905221680563b851983a15f1f01e5ff415d560d153", - "sha256:584872fd3df176e50c90e37aaca6cb731ac0abcdea4f5b8ad77c30674cfaaa99", - "sha256:6e3194135b21bb268030f3473beb8b674b356c330a9fa185dced2f5006cbd5ba", - "sha256:71710ee0e946a6bd33c86dd9e71f95ad584c65e8bb02615f00ceb0d8348fb303", - "sha256:741957f541fb8322de5a8c711d5d58f80d684225d2aec32fec92484cac931a52", - "sha256:7f01ba6153427811cd7d35630081c69b32c188a1d330599a826ef3bf17edbd7c", - "sha256:8d96e95902e781950d7c255b19364a1ed50a204843d63dd386b0abc5e6df5e44", - "sha256:8dd169ece1629ec4db1a592321e3ae0a9bb62fda2052a351fc36871f314c3569", - "sha256:8e6ad29636edd559b0dfe0a19c5cb5e6257461a5df90839e8c7710ddb005f4b4", - "sha256:9935b233882732f03fd0fadbeb9e9aa672edcdd126e6d52c36d60adf1def8ea5", - "sha256:a38b3229782411e4b23240f5f90000c4e7a834af88ed8763c66f8e4603db6b51", - "sha256:a5966b3171bad9c84a2b19dccda5ab37ae8437c0709a6b72cb42b64ea76a4bd3", - "sha256:ab88b1534f06df07262d9bc5efb3ba07948cdbe9a363eb9eaa4ad42fae6c7b5e", - "sha256:b08b0dd7adafbff9f0fd7dc8dcad5f3ce6f23c126c81ad8d1666880cc94e6974", - "sha256:ba47b571d480c0b76d282ff1634372070031d4998a46ae5d8305d49563b74ca6", - "sha256:bf049dc9cf0d3aa4a48ba514b7f1699fb6f35b18ad8c6f018bd13e0bccd9d30c", - "sha256:c46a122c524a3270ac5249f590ac2f75f1a83692a3d3a03479cea49de72a0a89", - "sha256:c63337aa7e1ad4ec182cc7847c6d85390589fbbf1f9f67d1fde8133a9acb7fa8", - "sha256:ec51273ea08a2c6389bc4dd6b5183354826d916b149a041f2f274431166191bc" - ], - "version": "==2.0.2" + "sha256:5083b2ab5fe13ced094a82e0df465e2dbbd9b1c013288888035e24fd6eb4ed01", + "sha256:622c20a57701d02f01a47e856dea248e112638f28c8249dbe3ed95a9702e3d74", + "sha256:6f4cb689a9552e9e13dccc89203c8ab09f210a7ffb92ce27c384a4a0be27b527", + "sha256:719f04a11ca709fc2b47868070d79fccff77e5d502ff32de2f4baa73cb16166f", + "sha256:7236252bed70f37b898933dcf8aa875d0829664a245a272516f27b30439df71c", + "sha256:7f5ddceb12b73f7fd2e4398266401b6f887003740ccd18c989a2af04500b5f2b", + "sha256:85b9364e099426bd7f445a7705aad87bf6dbb71d79e3802dd8ca14e181d38a33", + "sha256:c288a1bbdf58c360457443e5297e74844e1961e5e7001dbcb3a5297a41911a11", + "sha256:cd21ec48ee70878d46c486e2f7ae94b32bfc6b37c4d27876c5a5a00c4eb75c3c", + "sha256:d7505c500d994f11662e5595f5002251f572acc189f18944619352e2636f5181", + "sha256:dd24848fbd75b17bab06408da6c029ba7cc615bd9e4a1f755fb3a090025fb922", + "sha256:f4f19af4bca81f11922508a9dcf30ce1d2aee4972af9f81ce8e5331a6f46f5e1" + ], + "version": "==2.0.3" }, "decorator": { "hashes": [ - "sha256:54c38050039232e1db4ad7375cfce6748d7b41c29e95a081c8a6d2c30364a2ce", - "sha256:5d19b92a3c8f7f101c8dd86afd86b0f061a8ce4540ab8cd401fa2542756bce6d" + "sha256:41fa54c2a0cc4ba648be4fd43cff00aedf5b9465c9bf18d64325bc225f08f760", + "sha256:e3a62f0520172440ca0dcc823749319382e377f37f140a0b99ef45fecb84bfe7" ], - "version": "==4.4.1" + "version": "==4.4.2" }, "docutils": { "hashes": [ @@ -131,19 +115,20 @@ "sha256:9e4d7ecfc600058e07ba661411a2b7de2fd0fafa17d1a7f7361cd47b1175c827", "sha256:a2aeea129088da402665e92e0b25b04b073c04b2dce4ab65caaa38b7ce2e1a99" ], + "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2'", "version": "==0.15.2" }, "funcy": { "hashes": [ - "sha256:141950038e72bdc2d56fa82468586a1d1291b9cc9346daaaa322dffed1d1da6e", - "sha256:918f333f675d9841ec7d77b9f0d5a272ed290393a33c8ef20e605847de89b1c3" + "sha256:75ee84c3b446f92e68a857c2267b15a1b49c631c9d5a87a5f063cd2d6761a5c4" ], - "version": "==1.13" + "version": "==1.14" }, "future": { "hashes": [ "sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d" ], + "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2'", "version": "==0.18.2" }, "gensim": { @@ -184,39 +169,35 @@ }, "idna": { "hashes": [ - "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407", - "sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c" + "sha256:7588d1c14ae4c77d74036e8c22ff447b26d0fde8f007354fd48a7814db15b7cb", + "sha256:a068a21ceac8a4d63dbfd964670474107f541babbd2250d61922f029858365fa" ], - "version": "==2.8" - }, - "importlib-metadata": { - "hashes": [ - "sha256:aa18d7378b00b40847790e7c27e11673d7fed219354109d0e7b9e5b25dc3ad26", - "sha256:d5f18a79777f3aa179c145737780282e27b508fc8fd688cb17c7a813e8bd39af" - ], - "markers": "python_version < '3.8'", - "version": "==0.23" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==2.9" }, "jinja2": { "hashes": [ - "sha256:74320bb91f31270f9551d46522e33af46a80c3d619f4a4bf42b3164d30b5911f", - "sha256:9fe95f19286cfefaa917656583d020be14e7859c6b0252588391e47db34527de" + "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0", + "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035" ], - "version": "==2.10.3" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==2.11.2" }, "jmespath": { "hashes": [ - "sha256:3720a4b1bd659dd2eecad0666459b9788813e032b83e7ba58578e48254e0a0e6", - "sha256:bde2aef6f44302dfb30320115b17d030798de8c4110e28d5cf6cf91a7a31074c" + "sha256:b85d0567b8666149a93172712e68920734333c0ce7e89b78b3e987f71e5ed4f9", + "sha256:cdf6525904cc597730141d61b36f2e4b8ecc257c420fa2f4549bac2c2d0cb72f" ], - "version": "==0.9.4" + "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2'", + "version": "==0.10.0" }, "joblib": { "hashes": [ - "sha256:006108c7576b3eb6c5b27761ddbf188eb6e6347696325ab2027ea1ee9a4b922d", - "sha256:6fcc57aacb4e89451fd449e9412687c51817c3f48662c3d8f38ba3f8a0a193ff" + "sha256:61e49189c84b3c5d99a969d314853f4d1d263316cc694bec17548ebaa9c47b6e", + "sha256:6825784ffda353cc8a1be573118085789e5b5d29401856b35b756645ab5aecb5" ], - "version": "==0.14.0" + "markers": "python_version >= '3.6'", + "version": "==0.15.1" }, "markupsafe": { "hashes": [ @@ -224,13 +205,16 @@ "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161", "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235", "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5", + "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42", "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff", "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b", "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1", "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e", "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183", "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66", + "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b", "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1", + "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15", "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1", "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e", "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b", @@ -247,16 +231,20 @@ "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6", "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f", "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f", - "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7" + "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2", + "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7", + "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be" ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.1.1" }, "more-itertools": { "hashes": [ - "sha256:409cd48d4db7052af495b09dec721011634af3753ae1ef92d2b32f73a745f832", - "sha256:92b8c4b06dac4f0611c0729b2f2ede52b2e1bac1ab48f089c7ddc12e26bb60c4" + "sha256:68c70cc7167bdf5c7c9d8f6954a7837089c6a36bf565383919bb595efb8a17e5", + "sha256:b78134b2063dd214000685165d81c154522c3ee0a1c0d4d113c80361c234c5a2" ], - "version": "==7.2.0" + "markers": "python_version >= '3.5'", + "version": "==8.4.0" }, "murmurhash": { "hashes": [ @@ -266,18 +254,22 @@ "sha256:3af36a0dc9f13f6892d9b8b39a6a3ccf216cae5bce38adc7c2d145677987772f", "sha256:717196a04cdc80cc3103a3da17b2415a8a5e1d0d578b7079259386bf153b3258", "sha256:8a4ed95cd3456b43ea301679c7c39ade43fc18b844b37d0ba0ac0d6acbff8e0c", + "sha256:8b045a79e8b621b4b35b29f29e33e9e0964f3a276f7da4d5736142f322ad4842", "sha256:a6c071b4b498bcea16a8dc8590cad81fa8d43821f34c74bc00f96499e2527073", "sha256:b0afe329701b59d02e56bc6cee7325af83e3fee9c299c615fc1df3202b4f886f", "sha256:ba766343bdbcb928039b8fff609e80ae7a5fd5ed7a4fc5af822224b63e0cbaff", "sha256:bf33490514d308bcc27ed240cb3eb114f1ec31af031535cd8f27659a7049bd52", "sha256:c7a646f6b07b033642b4f52ae2e45efd8b80780b3b90e8092a0cec935fbf81e2", + "sha256:cc97ea766ac545074bab0e5af3dbc48e0d05ba230ae5a404e284d39abe4b3baf", "sha256:d696c394ebd164ca80b5871e2e9ad2f9fdbb81bd3c552c1d5f1e8ee694e6204a", + "sha256:f468e4868f78c3ac202a66abfe2866414bca4ae7666a21ef0938c423de0f7d50", "sha256:fe344face8d30a5a6aa26e5acf288aa2a8f0f32e05efdda3d314b4bf289ec2af" ], "version": "==1.0.2" }, "nltk": { "hashes": [ + "sha256:a08bdb4b8a1c13de16743068d9eb61c8c71c2e5d642e8e08205c528035843f82", "sha256:bed45551259aa2101381bbdd5df37d44ca2669c5c3dad72439fa459b29137d94" ], "index": "pypi", @@ -285,69 +277,70 @@ }, "numexpr": { "hashes": [ - "sha256:08bdae334855b19c55137b5a3c0d1bb1b05f23f7e6df24e47dfc8d5b3de4e10a", - "sha256:0a7c9bdac56ced9d8d8e8f7b2114d5c7bb0b78373f81e6be3a1d147455b5fb5c", - "sha256:0fbae343da0b8246feb2347696669ab2110d6ef36806f2a94eecf98ce9b717d0", - "sha256:16a92b61e6fc3fc351c36def2bce34d5fc1a519deb9320d1112fec443c0e0b04", - "sha256:16bf19e001000860acf81ada3b9392b39d9986abf30c507537fa417c9ee7b7b8", - "sha256:201056cdf4b769148097f90929b7b31f8e638212cfebc8524e6ad3220cdcaf1a", - "sha256:37324b5981b8962102bdc8640c4f05f5589da5d1df2702418783085cb78ca217", - "sha256:39e9a2feb85778f2085dd771f92853949120b135bca4ae195e4767bcf54ad379", - "sha256:49f97366ed8e0e970ae7f96d569d4aee6372dfe61951cd08b142edada2c459d7", - "sha256:4ed81428c9dd1cfb4e491ea61a2789d6e1c65262ca904a42577fc0bbee91520d", - "sha256:5e1b771425e172b3d021c7304605e49a578bb7553ee00adda2f3ca12a7f0831c", - "sha256:70344db42a1e0f185b636729f6e4ad16510abc8d23a42557e9480254ba9b1d1a", - "sha256:78b38ae1cc7a521e1565d85e4c659a586040267615a9333b8b6922b206c67831", - "sha256:8026b7e9b506f2257ddd9b8f2532a9a90682be6c63f20807c493290160e28b4e", - "sha256:81e4bf39c466392b30d11ef80f88a656a6021ce6db3ca0c18d07c1bf75b0ab09", - "sha256:85a743544be9eff5734060451da9da7eb5b49ec75e596020aad385b6af98f064", - "sha256:8798b65e5d96fce2c595bdec43377b6154fe67e89ba04718402d66f03124f8cc", - "sha256:9d2b645319a826f1901728761b3474f426d5b2ea208ff29bd4c44669b2802199", - "sha256:aac593ee3b7fde6cd7aca956cd084a4ad5783326e563f05340427d934c7aca6f", - "sha256:aff55bcfa9590f039c0ed454b3b757a65f43fb9a8af6d2bcac3dca6a6b8491b1", - "sha256:b2ed14711790b8506d914c3e1e31a855d89316bc332ac3208632772edf73580d", - "sha256:b6805fc38c743c81bdc8d9de7887f055f96205a79db97f613c061b375e64d299", - "sha256:bacc2229201af53ea9c27e439b3507394c0bc6ab18cc776868be2c5150442644", - "sha256:bae34759be74476cc7b8746b86eb19e7a5a8e3964df73f4096b539fcadd51f52", - "sha256:cae704f0bcb6bbb22a0bdfd0e44c92b02f79e3396a7846f2f94b39cde1c1865c", - "sha256:d1f91b98c4e525467b5c26759135bf30413c671a58dd729babc89d4b37619a72", - "sha256:ec1329069312deed2161525be2492d13aee48df94cf406fd1d613e6250d9579e", - "sha256:f9c5ca97e4cd84fe55579c3d764ddff08cefbb9318888d3be6d0455c5c2297bc" - ], - "version": "==2.7.0" + "sha256:0eb8d1a949dcc3eea633438af939f406aaaf240ae69b4ab85ed0c11b8d5e77ee", + "sha256:208597cacb191fe983b4ae05dc9ae8177b17d82a0d9f34719d71ac614744f53b", + "sha256:280c316d56903d20a474c5e03c073371b8879842b8070606cef0c1ea7371933a", + "sha256:2cb778a74f315aafc8eded19781e444269bd45f4ce3095697595e5000dc20f8a", + "sha256:33a610bb775a84ab8ded0af4041df2e931ce7edf5b465ccd9851511429c86d0f", + "sha256:3d83f6f3d6d449eb82a4a5bd56b9d61c9e1ade65b1188052700171051329888b", + "sha256:4655276892b5274015377a4487e1c57cc257c666e5578e12679029cc1124fb08", + "sha256:49f835568c864b444fa6fccf64cc01ff51a6171311742451ac4a176df471f9d8", + "sha256:57b7fcf2d0a1370bc9a380f3a96f6d10e4dfab5081b61a198a8d23b80c33e634", + "sha256:57d9ccd0820b7f5b1bed5100dd54a5ae52c39eb5b7e54317ae29e31ed9bd9edf", + "sha256:583fcf614521edf6eb1326e982d6fe3951dbd451d63e51f7438f0142b491d43f", + "sha256:59984617a50369670a88a0f0b6decdf59a93828dc42e29c8851bcffcedf0695b", + "sha256:659cee220ebe4bf88cb527ca9723d7cb390e93cbae8729ff5e927d06713bad26", + "sha256:687fa9521dbafb130f42d61462f968f211f7eb364f2789c5fbe65d82809ad6b2", + "sha256:78c7040baf20036f0d85308fd5f8322e30d553b8daff1de264394014feb62cc0", + "sha256:7cd5369c2f8cb4bac57571e52bca1a9ccc0260567cefa39ac40680dad0e9df4c", + "sha256:81ff83abc969288673ad37055fef3e5e80cdc87f90245b76c0af9bdef6d5c509", + "sha256:841c23811b00f35b4ce2c330b57c4398ff4a61af4488ce0e013e5039bba68188", + "sha256:84d10e27833a5be6c9a61350cba2acb2f36af1e71c4d47c390b4cc80704ccb55", + "sha256:9e7dbf2a849c34f5e61f9b8119688108f7b5dec97ee8ea2946440bc69a4b28d0", + "sha256:9f91ea6385f743d5ef5ef0a074270a057115d8a4c57625800dd25b5912f563b2", + "sha256:a478e224a23609e1bef45b44a65aad2f158a3072947fc0085c231953b1fafdcd", + "sha256:b0d239d9827e1bcee08344fd05835823bc60aff97232e35a928214d03ff802b1", + "sha256:c169e1424d495b7efefe69c046cbf89ae0dc7a071a89b6b844ae328ac48fccbc", + "sha256:e518918a077478523d89060a8eb59178fd80f7f1273fe1a74088c46163fa49b5", + "sha256:e6a7d0c269a3d9e117072551e78ec5332ece7297f80acf6447d701de0328e7df", + "sha256:eb2bd8656ee2a92b2e928904d6b7ad434f559b1f74a381ff5f36ad987badd1a6" + ], + "version": "==2.7.1" }, "numpy": { "hashes": [ - "sha256:0b0dd8f47fb177d00fa6ef2d58783c4f41ad3126b139c91dd2f7c4b3fdf5e9a5", - "sha256:25ffe71f96878e1da7e014467e19e7db90ae7d4e12affbc73101bcf61785214e", - "sha256:26efd7f7d755e6ca966a5c0ac5a930a87dbbaab1c51716ac26a38f42ecc9bc4b", - "sha256:28b1180c758abf34a5c3fea76fcee66a87def1656724c42bb14a6f9717a5bdf7", - "sha256:2e418f0a59473dac424f888dd57e85f77502a593b207809211c76e5396ae4f5c", - "sha256:30c84e3a62cfcb9e3066f25226e131451312a044f1fe2040e69ce792cb7de418", - "sha256:4650d94bb9c947151737ee022b934b7d9a845a7c76e476f3e460f09a0c8c6f39", - "sha256:4dd830a11e8724c9c9379feed1d1be43113f8bcce55f47ea7186d3946769ce26", - "sha256:4f2a2b279efde194877aff1f76cf61c68e840db242a5c7169f1ff0fd59a2b1e2", - "sha256:62d22566b3e3428dfc9ec972014c38ed9a4db4f8969c78f5414012ccd80a149e", - "sha256:669795516d62f38845c7033679c648903200980d68935baaa17ac5c7ae03ae0c", - "sha256:75fcd60d682db3e1f8fbe2b8b0c6761937ad56d01c1dc73edf4ef2748d5b6bc4", - "sha256:9395b0a41e8b7e9a284e3be7060db9d14ad80273841c952c83a5afc241d2bd98", - "sha256:9e37c35fc4e9410093b04a77d11a34c64bf658565e30df7cbe882056088a91c1", - "sha256:a0678793096205a4d784bd99f32803ba8100f639cf3b932dc63b21621390ea7e", - "sha256:b46554ad4dafb2927f88de5a1d207398c5385edbb5c84d30b3ef187c4a3894d8", - "sha256:c867eeccd934920a800f65c6068acdd6b87e80d45cd8c8beefff783b23cdc462", - "sha256:dd0667f5be56fb1b570154c2c0516a528e02d50da121bbbb2cbb0b6f87f59bc2", - "sha256:de2b1c20494bdf47f0160bd88ed05f5e48ae5dc336b8de7cfade71abcc95c0b9", - "sha256:f1df7b2b7740dd777571c732f98adb5aad5450aee32772f1b39249c8a50386f6", - "sha256:ffca69e29079f7880c5392bf675eb8b4146479d976ae1924d01cd92b04cccbcc" - ], - "version": "==1.17.3" + "sha256:0172304e7d8d40e9e49553901903dc5f5a49a703363ed756796f5808a06fc233", + "sha256:34e96e9dae65c4839bd80012023aadd6ee2ccb73ce7fdf3074c62f301e63120b", + "sha256:3676abe3d621fc467c4c1469ee11e395c82b2d6b5463a9454e37fe9da07cd0d7", + "sha256:3dd6823d3e04b5f223e3e265b4a1eae15f104f4366edd409e5a5e413a98f911f", + "sha256:4064f53d4cce69e9ac613256dc2162e56f20a4e2d2086b1956dd2fcf77b7fac5", + "sha256:4674f7d27a6c1c52a4d1aa5f0881f1eff840d2206989bae6acb1c7668c02ebfb", + "sha256:7d42ab8cedd175b5ebcb39b5208b25ba104842489ed59fbb29356f671ac93583", + "sha256:965df25449305092b23d5145b9bdaeb0149b6e41a77a7d728b1644b3c99277c1", + "sha256:9c9d6531bc1886454f44aa8f809268bc481295cf9740827254f53c30104f074a", + "sha256:a78e438db8ec26d5d9d0e584b27ef25c7afa5a182d1bf4d05e313d2d6d515271", + "sha256:a7acefddf994af1aeba05bbbafe4ba983a187079f125146dc5859e6d817df824", + "sha256:a87f59508c2b7ceb8631c20630118cc546f1f815e034193dc72390db038a5cb3", + "sha256:ac792b385d81151bae2a5a8adb2b88261ceb4976dbfaaad9ce3a200e036753dc", + "sha256:b03b2c0badeb606d1232e5f78852c102c0a7989d3a534b3129e7856a52f3d161", + "sha256:b39321f1a74d1f9183bf1638a745b4fd6fe80efbb1f6b32b932a588b4bc7695f", + "sha256:cae14a01a159b1ed91a324722d746523ec757357260c6804d11d6147a9e53e3f", + "sha256:cd49930af1d1e49a812d987c2620ee63965b619257bd76eaaa95870ca08837cf", + "sha256:e15b382603c58f24265c9c931c9a45eebf44fe2e6b4eaedbb0d025ab3255228b", + "sha256:e91d31b34fc7c2c8f756b4e902f901f856ae53a93399368d9a0dc7be17ed2ca0", + "sha256:ef627986941b5edd1ed74ba89ca43196ed197f1a206a3f18cc9faf2fb84fd675", + "sha256:f718a7949d1c4f622ff548c572e0c03440b49b9531ff00e4ed5738b459f011e8" + ], + "markers": "python_version >= '3.5'", + "version": "==1.18.5" }, "packaging": { "hashes": [ - "sha256:28b924174df7a2fa32c1953825ff29c61e2f5e082343165438812f00d3a7fc47", - "sha256:d9551545c6d761f3def1677baf08ab2a3ca17c56879e70fecba2fc4dde4ed108" + "sha256:4357f74f47b9c12db93624a82154e9b120fa8293699949152b22065d556079f8", + "sha256:998416ba6962ae7fbd6596850b80e17859a5753ba17c32284f67bfff33784181" ], - "version": "==19.2" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==20.4" }, "pandas": { "hashes": [ @@ -379,17 +372,18 @@ }, "plpygis": { "hashes": [ - "sha256:76a598bc21fcf5eb6a750f5ff1aaa2eefd38adf7c3c23d9c222e3961bbe58df8" + "sha256:f9d1bb3913970b6c40c67188be3716f9fa490c1441e6c0d915221c8291826079" ], "index": "pypi", - "version": "==0.1.0" + "version": "==0.2.0" }, "pluggy": { "hashes": [ - "sha256:0db4b7601aae1d35b4a033282da476845aa19185c1e6964b25cf324b5e4ec3e6", - "sha256:fa5fa1622fa6dd5c030e9cad086fa19ef6a0cf6d7a2d12318e10cb49d6d68f34" + "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0", + "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d" ], - "version": "==0.13.0" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==0.13.1" }, "preshed": { "hashes": [ @@ -421,10 +415,11 @@ }, "py": { "hashes": [ - "sha256:64f65755aee5b381cea27766a3a147c3f15b9b6b9ac88676de66ba2ae36793fa", - "sha256:dc639b046a6e2cff5bbe40194ad65936d6ba360b52b3c3fe1d08a82dd50b5e53" + "sha256:a673fa23d7000440cc885c17dbd34fafcb7d7a6e230b29f6766400de36a33c44", + "sha256:f3b3a4c36512a4c4f024041ab51866f11761cc169670204b235f6b20523d4e6b" ], - "version": "==1.8.0" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.8.2" }, "pyldavis": { "hashes": [ @@ -435,32 +430,34 @@ }, "pyparsing": { "hashes": [ - "sha256:4acadc9a2b96c19fe00932a38ca63e601180c39a189a696abce1eaab641447e1", - "sha256:61b5ed888beab19ddccab3478910e2076a6b5a0295dffc43021890e136edf764" + "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1", + "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b" ], - "version": "==2.4.4" + "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2'", + "version": "==2.4.7" }, "pytest": { "hashes": [ - "sha256:27abc3fef618a01bebb1f0d6d303d2816a99aa87a5968ebc32fe971be91eb1e6", - "sha256:58cee9e09242937e136dbb3dab466116ba20d6b7828c7620f23947f37eb4dae4" + "sha256:5c0db86b698e8f170ba4582a492248919255fcd4c79b1ee64ace34301fb589a1", + "sha256:7979331bfcba207414f5e1263b5a0f8f521d0f457318836a7355531ed1a4c7d8" ], - "version": "==5.2.2" + "markers": "python_version >= '3.5'", + "version": "==5.4.3" }, "python-dateutil": { "hashes": [ - "sha256:7e6584c74aeed623791615e26efd690f29817a27c73085b78e4bad02493df2fb", - "sha256:c89805f6f4d64db21ed966fda138f8a5ed7a4fdbc1a8ee329ce1b74e3c74da9e" + "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c", + "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a" ], - "markers": "python_version >= '2.7'", - "version": "==2.8.0" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "version": "==2.8.1" }, "pytz": { "hashes": [ - "sha256:1c557d7d0e871de1f5ccd5833f60fb2550652da6be2693c1e02300743d21500d", - "sha256:b02c06db6cf09c12dd25137e563b31700d3b80fcc4ad23abb7a315f2789819be" + "sha256:a494d53b6d39c3c6e44c3bec237336e14305e4f29bbf800b599253057fbb79ed", + "sha256:c35965d010ce31b23eeb663ed3cc8c906275d6be1a34393a1d73a41febf4a048" ], - "version": "==2019.3" + "version": "==2020.1" }, "ratelim": { "hashes": [ @@ -471,51 +468,60 @@ }, "requests": { "hashes": [ - "sha256:11e007a8a2aa0323f5a921e9e6a2d7e4e67d9877e85773fba9ba6419025cbeb4", - "sha256:9cf5292fcd0f598c671cfc1e0d7d1a7f13bb8085e9a590f48c010551dc6c4b31" + "sha256:b3559a131db72c33ee969480840fff4bb6dd111de7dd27c8ee1f820f4f00231b", + "sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898" ], - "version": "==2.22.0" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==2.24.0" }, "s3transfer": { "hashes": [ - "sha256:6efc926738a3cd576c2a79725fed9afde92378aa5c6a957e3af010cb019fac9d", - "sha256:b780f2411b824cb541dbcd2c713d0cb61c7d1bcadae204cdddda2b35cef493ba" + "sha256:2482b4259524933a022d59da830f51bd746db62f047d6eb213f2f8855dcb8a13", + "sha256:921a37e2aefc64145e7b73d50c71bb4f26f46e4c9f414dc648c6245ff92cf7db" ], - "version": "==0.2.1" + "version": "==0.3.3" }, "scipy": { "hashes": [ - "sha256:0baa64bf42592032f6f6445a07144e355ca876b177f47ad8d0612901c9375bef", - "sha256:243b04730d7223d2b844bda9500310eecc9eda0cba9ceaf0cde1839f8287dfa8", - "sha256:2643cfb46d97b7797d1dbdb6f3c23fe3402904e3c90e6facfe6a9b98d808c1b5", - "sha256:396eb4cdad421f846a1498299474f0a3752921229388f91f60dc3eda55a00488", - "sha256:3ae3692616975d3c10aca6d574d6b4ff95568768d4525f76222fb60f142075b9", - "sha256:435d19f80b4dcf67dc090cc04fde2c5c8a70b3372e64f6a9c58c5b806abfa5a8", - "sha256:46a5e55850cfe02332998b3aef481d33f1efee1960fe6cfee0202c7dd6fc21ab", - "sha256:75b513c462e58eeca82b22fc00f0d1875a37b12913eee9d979233349fce5c8b2", - "sha256:7ccfa44a08226825126c4ef0027aa46a38c928a10f0a8a8483c80dd9f9a0ad44", - "sha256:89dd6a6d329e3f693d1204d5562dd63af0fd7a17854ced17f9cbc37d5b853c8d", - "sha256:a81da2fe32f4eab8b60d56ad43e44d93d392da228a77e229e59b51508a00299c", - "sha256:a9d606d11eb2eec7ef893eb825017fbb6eef1e1d0b98a5b7fc11446ebeb2b9b1", - "sha256:ac37eb652248e2d7cbbfd89619dce5ecfd27d657e714ed049d82f19b162e8d45", - "sha256:cbc0611699e420774e945f6a4e2830f7ca2b3ee3483fca1aa659100049487dd5", - "sha256:d02d813ec9958ed63b390ded463163685af6025cb2e9a226ec2c477df90c6957", - "sha256:dd3b52e00f93fd1c86f2d78243dfb0d02743c94dd1d34ffea10055438e63b99d" - ], - "version": "==1.3.1" + "sha256:00af72998a46c25bdb5824d2b729e7dabec0c765f9deb0b504f928591f5ff9d4", + "sha256:0902a620a381f101e184a958459b36d3ee50f5effd186db76e131cbefcbb96f7", + "sha256:1e3190466d669d658233e8a583b854f6386dd62d655539b77b3fa25bfb2abb70", + "sha256:2cce3f9847a1a51019e8c5b47620da93950e58ebc611f13e0d11f4980ca5fecb", + "sha256:3092857f36b690a321a662fe5496cb816a7f4eecd875e1d36793d92d3f884073", + "sha256:386086e2972ed2db17cebf88610aab7d7f6e2c0ca30042dc9a89cf18dcc363fa", + "sha256:71eb180f22c49066f25d6df16f8709f215723317cc951d99e54dc88020ea57be", + "sha256:770254a280d741dd3436919d47e35712fb081a6ff8bafc0f319382b954b77802", + "sha256:787cc50cab3020a865640aba3485e9fbd161d4d3b0d03a967df1a2881320512d", + "sha256:8a07760d5c7f3a92e440ad3aedcc98891e915ce857664282ae3c0220f3301eb6", + "sha256:8d3bc3993b8e4be7eade6dcc6fd59a412d96d3a33fa42b0fa45dc9e24495ede9", + "sha256:9508a7c628a165c2c835f2497837bf6ac80eb25291055f56c129df3c943cbaf8", + "sha256:a144811318853a23d32a07bc7fd5561ff0cac5da643d96ed94a4ffe967d89672", + "sha256:a1aae70d52d0b074d8121333bc807a485f9f1e6a69742010b33780df2e60cfe0", + "sha256:a2d6df9eb074af7f08866598e4ef068a2b310d98f87dc23bd1b90ec7bdcec802", + "sha256:bb517872058a1f087c4528e7429b4a44533a902644987e7b2fe35ecc223bc408", + "sha256:c5cac0c0387272ee0e789e94a570ac51deb01c796b37fb2aad1fb13f85e2f97d", + "sha256:cc971a82ea1170e677443108703a2ec9ff0f70752258d0e9f5433d00dda01f59", + "sha256:dba8306f6da99e37ea08c08fef6e274b5bf8567bb094d1dbe86a20e532aca088", + "sha256:dc60bb302f48acf6da8ca4444cfa17d52c63c5415302a9ee77b3b21618090521", + "sha256:dee1bbf3a6c8f73b6b218cb28eed8dd13347ea2f87d572ce19b289d6fd3fbc59" + ], + "markers": "python_version >= '3.5'", + "version": "==1.4.1" }, "six": { "hashes": [ - "sha256:1f1b7d42e254082a9db6279deae68afb421ceba6158efa6131de7b3003ee93fd", - "sha256:30f610279e8b2578cab6db20741130331735c781b56053c59c4076da27f06b66" + "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259", + "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced" ], - "version": "==1.13.0" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "version": "==1.15.0" }, "smart-open": { "hashes": [ - "sha256:e64c2b5e62a452fa7fc4d21aecbada826ca21097bbe117841f8f4fc53dbab676" + "sha256:555962abf982faff8a8aeb65e0695474e3091f604826055782beffa8400e4e4e" ], - "version": "==1.9.0" + "markers": "python_version >= '3.5'", + "version": "==2.0.0" }, "spacy": { "hashes": [ @@ -535,20 +541,20 @@ }, "srsly": { "hashes": [ - "sha256:41f2fe803fe6985eb79982ce5d571b81413adfe2d01dcd470e55c6a0f16e07d8", - "sha256:6ec70d50d2a63452faf5b7606120310c4a95f2c24d931bd8f5babae9d1d99412", - "sha256:798010e744469f65b3c492eac77d9b46a47a7bc229428f63e9c1c7445efc1809", - "sha256:8730016fc5ca49dbaf676a8d02b12b184e909a26e596d51f46a6c71a963de462", - "sha256:8ffa7deafac1fb961385eff6feed324b5890b42175e1dde2c3e3fab2034756bb", - "sha256:97e5101d6ff08e5a2ebd83fc31b48c90aad24ba35eb4468f5b7ec56ecd8bdb6b", - "sha256:9e9a395ea53dbac0b705556246d1a9f8e5fea9ba49bc63ec3d3de05bfbe48735", - "sha256:aa02e2a62093ef09d7904343ee7381b9c9bab5b4f06960dfbeaa12035d0f0a3e", - "sha256:c62acffd96b4699820e39fcc47fc5a45ff14432c4665d4112ee08e42aeda047e", - "sha256:d30074fdb05a739358fef33701315f8247161fbdb52f29fca368d10c2ef23fae", - "sha256:f2f6a950b801352f596667459839235cf059b39307e4034d7ed68e7dfb497bd6", - "sha256:f48623820170eff0e2fc79419688a16f5977916548dd0d3a8d0d3fc93a7978ad" + "sha256:18bad26c34cf5a8853fbf018fd168a7bf2ea7ce661e66476c25dac711cb79c9b", + "sha256:2179cf1e88c250e89e40227bd5848341011c170079b3d424987d067de6a73f42", + "sha256:21cfb0e5dea2c4515b5c2daa78402d5782c6425b4f58af40d2e2cb45e4778d8c", + "sha256:29434753a77481ec6129991f4116f983085cc8005c1ad963261124842e8c05fc", + "sha256:3f3975e8cb67194d26dd03508469b1303f8b994f30e7782f7eae25fef6dc4aad", + "sha256:46213d8f094b348a9433c825ac1eba36a21aa25a8bae6f29c2f9f053e15be961", + "sha256:59258b81d567df207f8a0a33c4b5fa232afccf1d927c8ce3ba5395bfd64c0ed8", + "sha256:7c553a709fd56a37a07f969e849f55a0aeabaeb7677bebc588a640ab8ec134aa", + "sha256:95849d84e8929be248a180e672c8ce1ed98b1341263bc983efdf8427465584f1", + "sha256:b94d8a13c60e3298a9ba12b1b211026e8378c7d087efd7ce46a3f2d8d4678d94", + "sha256:c8beff52c104a7ffe4a15513a05dc0497998cf83aa1ca39454489994d18c1c07", + "sha256:d409beb7257208633c974c01f9dc3265562fb6802caee7de21880761ba87c3ed" ], - "version": "==0.2.0" + "version": "==1.0.2" }, "thinc": { "hashes": [ @@ -569,55 +575,59 @@ }, "tqdm": { "hashes": [ - "sha256:94d2a64582150f503a294b3b8889413e7e56d6043473d6a5672d46185b043902", - "sha256:fca09992116d6dc3ad9789cf601a254081eb40d5c14c1863ab6cd10e15c2cb26" + "sha256:07c06493f1403c1380b630ae3dcbe5ae62abcf369a93bbc052502279f189ab8c", + "sha256:cd140979c2bebd2311dfb14781d8f19bd5a9debb92dcab9f6ef899c987fcf71f" ], - "version": "==4.37.0" + "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1'", + "version": "==4.46.1" }, "truecase": { "hashes": [ - "sha256:8d627504f4acd4e99cd397146d23009d9e34723542f5d64f1dd3a463116e9814", - "sha256:f18c35743109a982201caf482bf87c0cbd1e5231b1384bb7bbe3c1e90d012225" + "sha256:0aeb12269c1178716e539085ea43e6693a701c5cb5d5a0b1d72899f0dd9e0f4a", + "sha256:8e3ff22592b6e390b6f01397b6c62ebc0184d6ca569946a863be9e65bab7d3fc" ], "index": "pypi", - "version": "==0.0.5" + "version": "==0.0.9" }, "urllib3": { "hashes": [ - "sha256:3de946ffbed6e6746608990594d08faac602528ac7015ac28d33cee6a45b7398", - "sha256:9a107b99a5393caf59c7aa3c1249c16e6879447533d0887f4336dde834c7be86" + "sha256:3018294ebefce6572a474f0604c2021e33b3fd8006ecd11d62107a5d2a963527", + "sha256:88206b0eb87e6d677d424843ac5209e3fb9d0190d0ee169599165ec25e9d9115" ], - "markers": "python_version >= '3.4'", - "version": "==1.25.6" + "markers": "python_version != '3.4'", + "version": "==1.25.9" }, "wasabi": { "hashes": [ - "sha256:7a369627eba52f59ff3452270ba4a64a940200b617cda1bbafffd145e38a9add", - "sha256:dcd60890dd4a4c171ad5e3ee11ccbd072dc6978b966c903adaa874e0f29b5270" + "sha256:b8dd3e963cd693fde1eb6bfbecf51790171aa3534fa299faf35cf269f2fd6063", + "sha256:da1f100e0025fe1e50fd67fa5b0b05df902187d5c65c86dc110974ab856d1f05" ], - "version": "==0.4.0" + "version": "==0.6.0" }, "wcwidth": { "hashes": [ - "sha256:3df37372226d6e63e1b1e1eda15c594bca98a22d33a23832a90998faa96bc65e", - "sha256:f4ebe71925af7b40a864553f761ed559b43544f8f71746c2d756c7fe788ade7c" + "sha256:79375666b9954d4a1a10739315816324c3e73110af9d0e102d906fdb0aec009f", + "sha256:8c6b5b6ee1360b842645f336d9e5d68c55817c26d3050f46b235ef2bc650e48f" ], - "version": "==0.1.7" + "version": "==0.2.4" }, "wheel": { "hashes": [ - "sha256:10c9da68765315ed98850f8e048347c3eb06dd81822dc2ab1d4fde9dc9702646", - "sha256:f4da1763d3becf2e2cd92a14a7c920f0f00eca30fdde9ea992c836685b9faf28" + "sha256:8788e9155fe14f54164c1b9eb0a319d98ef02c160725587ad60f14ddc57b6f96", + "sha256:df277cb51e61359aba502208d680f90c0493adec6f0e848af94948778aed386e" ], - "version": "==0.33.6" - }, - "zipp": { + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==0.34.2" + } + }, + "develop": { + "pycodestyle": { "hashes": [ - "sha256:3718b1cbcd963c7d4c5511a8240812904164b7f381b647143a89d3b98f9bcd8e", - "sha256:f06903e9f1f43b12d371004b4ac7b06ab39a44adc747266928ae6debfa7b3335" + "sha256:2295e7b2f6b5bd100585ebcb1f616591b652db8a741695b3d8f5d28bdc934367", + "sha256:c58a7d2815e0e8d7972bf1803331fb0152f867bd89adf8a01dfd55085434192e" ], - "version": "==0.6.0" + "index": "pypi", + "version": "==2.6.0" } - }, - "develop": {} + } } diff --git a/pyelit/Geoparsing/Geoparsing.py b/pyelit/Geoparsing/Geoparsing.py index f8694ee..c52383b 100644 --- a/pyelit/Geoparsing/Geoparsing.py +++ b/pyelit/Geoparsing/Geoparsing.py @@ -21,13 +21,20 @@ class Geoparsing: def __init__(self): """ - Construtor da classe. Onde todos os atributos são iniciandos e sofrem pré-processamento. + Construtor da classe. Onde todos os atributos são iniciandos + e sofrem pré-processamento. """ self.translator = Translator() self.stemmer = PorterStemmer() self.nlp = spacy.load("pt_core_news_sm") - self.nlp.Defaults.stop_words |= {"vamos", "olha", "pois", "tudo", "coisa", "toda", "tava", "pessoal", "dessa", "resolvido", "aqui", "gente", "tá", "né", "calendário", - "jpb", "agora", "voltar", "lá", "hoje", "aí", "ainda", "então", "vai", "porque", "moradores", "fazer", "prefeitura", "todo", "vamos", "problema", "fica", "ver", "tô"} + self.nlp.Defaults.stop_words |= { + "vamos", "olha", "pois", "tudo", + "coisa", "toda", "tava", "pessoal", "dessa", "resolvido", "aqui", + "gente", "tá", "né", "calendário", "jpb", "agora", "voltar", "lá", + "hoje", "aí", "ainda", "então", "vai", "porque", "moradores", + "fazer", "prefeitura", "todo", "vamos", "problema", "fica", "ver", + "tô" + } self.stop_words_spacy = self.nlp.Defaults.stop_words self.residential = {} self.gazetteer = {} @@ -49,7 +56,11 @@ def pre_process(self, gazetteer): """ for row in gazetteer: self.gazetteer[self.remove_accents(row['osm_id'])] = ( - row['coordenates'], row['fclass'], row['name'].lower(), row['type']) + row['coordenates'], + row['fclass'], + row['name'].lower(), + row['type'] + ) def remove_accents(self, input_str): """ @@ -81,7 +92,8 @@ def remove_stop_words(self, text): out = "" text = text.lower() for palavra in text.split(): - if (palavra not in self.stop_words_spacy and (len(palavra) > 3 or palavra == "rua")): + if (palavra not in self.stop_words_spacy and + (len(palavra) > 3 or palavra == "rua")): out += palavra + " " out = out.strip() return out @@ -117,7 +129,7 @@ def concantena_address(self, cities, places, street): def __verifica_endereco(self, end): """ - Método que verifica se um endereço é da Paraíba + Método que verifica se um endereço é da Paraíba e se sua confiabilidade é maior ou igual a 5. Parâmetros: @@ -139,8 +151,8 @@ def __verifica_endereco(self, end): def verfica(self, ents_loc, limit): """ - Método que verifica se os endereços estão corretos. - - Encontra as localizações das entidades de localizações(Geocoder com arcgis). + Método que verifica se os endereços estão corretos. + - Encontra as localizações das entidades de localizações. - Verifica se é da PB e sua confiabilidade(`verifica_endereco`). - Concatena os endereços. - Ordena endereços pela confiabilidade. @@ -161,11 +173,10 @@ def verfica(self, ents_loc, limit): """ ends = [] for loc in ents_loc: - l = str(loc) - g = geocoder.arcgis(l) + loc = str(loc) + g = geocoder.arcgis(loc) end = g.json - print(end) - if (end != None): + if (end is not None): ends.append(end) ends_corretos = [] @@ -185,7 +196,8 @@ def verfica(self, ents_loc, limit): def search_next_index(self, list_best_address): """ - Método que busca uma nova posição a ser adicionado na lista de melhores endereços. + Método que busca uma nova posição a ser adicionado na + lista de melhores endereços. Parâmetros: ---------- @@ -205,7 +217,8 @@ def search_next_index(self, list_best_address): def insert_ordened_to_priority(self, result, address, type_): """ - Método que insere na lista de melhores endereços ordenando por prioridades. + Método que insere na lista de melhores endereços ordenando + por prioridades. Parâmetros: ---------- @@ -233,7 +246,7 @@ def choose_best_addresses(self, adresses, text, addresses_, cities): Algoritmos implementados: - Ordenar por níveis de prioridades - - Filtrar por endereços que estejam em um determinado bairro + - Filtrar por endereços que estejam em um determinado bairro que também esteja nestes endereços filtrados. - Endereços que mais se repetem no texto. - Endereços que são StreatName @@ -266,33 +279,35 @@ def choose_best_addresses(self, adresses, text, addresses_, cities): g = geocoder.reverse(location=loc_, provider="arcgis") g = g.json g['occurrences_in_text'] = text.count(loc) - if g != None: + if g is not None: result.append(g) self.insert_ordened_to_priority(result, g, type_) # Ordenando por quantidade de ocorrências no texto. result = sorted(result, key=lambda e: e['occurrences_in_text']) - # Ordenando por endereços que também foram encontrados seus bairros na filtragem, - # assim possuindo uma chance maior de ser o endereço correto. + # Ordenando por endereços que também foram encontrados + # seus bairros na filtragem, assim possuindo uma + # chance maior de ser o endereço correto. new_result = [] for i in range(len(result) - 1, -1, -1): - l = result[i] - if l['raw'].__contains__('address'): - if l['raw']['address']['District'].lower() in adresses.keys(): - new_result.insert(0, l) + loc = result[i] + if loc['raw'].__contains__('address'): + loc_district = loc['raw']['address']['District'].lower() + if loc_district in adresses.keys(): + new_result.insert(0, loc) else: - new_result.append(l) + new_result.append(loc) else: - if l['raw']['name'].lower() in adresses.keys(): - new_result.insert(0, l) + if loc['raw']['name'].lower() in adresses.keys(): + new_result.insert(0, loc) else: - new_result.append(l) + new_result.append(loc) result = new_result for loc in addresses_: - l = str(loc) - g = geocoder.arcgis(l) + loc_ = str(loc) + g = geocoder.arcgis(loc_) end = g.json result.insert(0, end) @@ -309,7 +324,8 @@ def choose_best_addresses(self, adresses, text, addresses_, cities): result = new_result - # ordenar por endereços que pertencem a cidade que foi encontrada no texto. + # ordenar por endereços que pertencem a cidade que foi + # encontrada no texto. new_result = [] for i in range(len(result) - 1, -1, -1): for city in cities: @@ -317,7 +333,8 @@ def choose_best_addresses(self, adresses, text, addresses_, cities): if city in result[i]['address'].lower(): new_result.insert(0, result[i]) else: - if str(result[i]['raw']['address']['City']).lower() == city: + loc_city = str(result[i]['raw']['address']['City']).lower() + if loc_city == city: new_result.insert(0, result[i]) result = new_result @@ -349,10 +366,14 @@ def filterAddressCGText(self, text): if len(address_aux) > 1 or self.gazetteer[osm_id][1] == "suburb": address = address.replace("(", "") address = address.replace(")", "") - if re.search("\\b" + address + "\\b", text): - if not self.repeated_address(addresses_geral.keys(), address): + txt_contains_addr = re.search("\\b" + address + "\\b", text) + if txt_contains_addr: + addr_repeated = self.repeated_address( + addresses_geral.keys(), address) + if not addr_repeated: addresses_geral[address] = ( - self.gazetteer[osm_id][0], self.gazetteer[osm_id][1]) + self.gazetteer[osm_id][0], + self.gazetteer[osm_id][1]) cities = [str(a) for a in addresses_geral.keys() if addresses_geral[a][1] == "city"] @@ -369,23 +390,25 @@ def repeated_address(self, addresses, address): return True return False - def geoparsing(self, text, case_correct=False, limit=5, gazetteer_cg=False): + def geoparsing(self, text, case_correct=False, limit=5, + gazetteer_cg=False): """ Realiza o geoparsing do texto. OBS: Utilizar o geoparsing sem o case correct e sem o gazetteer - fará com que você tenha resultados ruins. + fará com que você tenha resultados ruins. Parâmetros: ---------- text : String - Texto que para realizar o geoparsing. case_correct: Bool - - Caso o texto já esteja com o case correto, True, caso contrário False. + - Se o texto estiver com case correto. limit: Int - Limite máximo de endereços retornados. gazetteer_cg: Bool - - Caso deseje utilizar o gazetteer com localidades do estado da Paraíba. + - Caso deseje utilizar o gazetteer com localidades + do estado da Paraíba. Retorno: ---------- @@ -403,8 +426,9 @@ def geoparsing(self, text, case_correct=False, limit=5, gazetteer_cg=False): if case_correct: doc = self.nlp(text) print(text) - ents_loc = list(filter(lambda entity: entity.label_ == - "LOC" or entity.label_ == "GPE", doc.ents)) + ents_loc = list(filter( + lambda entity: entity.label_ == "LOC" or + entity.label_ == "GPE", doc.ents)) address_found = self.__concatena_end(ents_loc) result = self.verfica(address_found, limit) if result[0]: diff --git a/pyelit/Geoparsing/preprocessing_gazetteer.py b/pyelit/Geoparsing/preprocessing_gazetteer.py index 0748137..1017634 100644 --- a/pyelit/Geoparsing/preprocessing_gazetteer.py +++ b/pyelit/Geoparsing/preprocessing_gazetteer.py @@ -8,168 +8,176 @@ def convertGeometryPoint(geometry): - """ - Função de pré-processamento que transformar um código em geometria para uma lista de floats. - - Parâmetros: - ---------- - geometry : String - - String que representa um coordenada geometrica de um ponto. - - Retorno: - ---------- - coord : List - - Lista de coordenadas. - """ - g = Geometry(geometry) - coord = g.geojson['coordinates'] - coord.reverse() - return coord + """ + Função de pré-processamento que transformar um código em geometria para + uma lista de floats. + + Parâmetros: + ---------- + geometry : String + - String que representa um coordenada geometrica de um ponto. + + Retorno: + ---------- + coord : List + - Lista de coordenadas. + """ + g = Geometry(geometry) + coord = g.geojson['coordinates'] + coord.reverse() + return coord def convertGeometryPolygon(geometry): - """ - Função de pré-processamento que transformar um código em geometria para uma lista de floats. - - Parâmetros: - ---------- - geometry : String - - String que representa um coordenada geometrica de um polígono. - - Retorno: - ---------- - coord : List - - Lista de coordenadas. - """ - g = Geometry(geometry) - coord = g.geojson['coordinates'] - saida = [] - for c in coord[0]: - c.reverse() - saida.append(c) - return saida + """ + Função de pré-processamento que transformar um código em geometria + para uma lista de floats. + + Parâmetros: + ---------- + geometry : String + - String que representa um coordenada geometrica de um polígono. + + Retorno: + ---------- + coord : List + - Lista de coordenadas. + """ + g = Geometry(geometry) + coord = g.geojson['coordinates'] + saida = [] + for c in coord[0]: + c.reverse() + saida.append(c) + return saida def convertFeature(geometry): - """ - Função de pré-processamento que transformar um código em geometria para uma lista de floats. - - Parâmetros: - ---------- - geometry : String - - String que representa um coordenada geometrica de uma feature. - - Retorno: - ---------- - coord : List - - Lista de coordenadas. - """ - g = Geometry(geometry) - coord = g.geojson['coordinates'][0][0] - saida = [] - for c in coord: - c.reverse() - saida.append(c) - return saida + """ + Função de pré-processamento que transformar um código em geometria + para uma lista de floats. + + Parâmetros: + ---------- + geometry : String + - String que representa um coordenada geometrica de uma feature. + + Retorno: + ---------- + coord : List + - Lista de coordenadas. + """ + g = Geometry(geometry) + coord = g.geojson['coordinates'][0][0] + saida = [] + for c in coord: + c.reverse() + saida.append(c) + return saida def polygons(localidade="cg"): - """ - Função de pré-processamento escreve dados dos endereços de poligonos em outro arquivo - com as coordenadas normalizadas. - - Parâmetros: - ---------- - localidade : String - - String que representa a cidade/estado("cg", "jp" ou "pb"). - """ - if (localidade == "cg"): - arq = csv.DictReader( - open("./gazetteer/features_campina_ln.csv", "r", encoding='utf-8')) - elif (localidade == "jp"): - arq = csv.DictReader( - open("./gazetteer/features_jp_ln.csv", "r", encoding='utf-8')) - elif (localidade == "pb"): - arq = csv.DictReader( - open("./gazetteer/features_paraiba_ln.csv", "r", encoding='utf-8')) - - fields = ["osm_id", "fclass", "name", "type", "coordenates"] - f = csv.writer(open('./gazetteer/processados/' + - localidade + '_ln.csv', 'w', encoding='utf-8')) - f.writerow(fields) - - for p in arq: - coord = convertGeometryPolygon(p['geometry']) - t = [p['osm_id'].__str__(), p["fclass"].__str__(), p["name"].__str__(), - p["type"].__str__(), coord] - f.writerow(t) + """ + Função de pré-processamento escreve dados dos endereços de poligonos + em outro arquivo + com as coordenadas normalizadas. + + Parâmetros: + ---------- + localidade : String + - String que representa a cidade/estado("cg", "jp" ou "pb"). + """ + if (localidade == "cg"): + arq = csv.DictReader( + open("./gazetteer/features_campina_ln.csv", "r", encoding='utf-8')) + elif (localidade == "jp"): + arq = csv.DictReader( + open("./gazetteer/features_jp_ln.csv", "r", encoding='utf-8')) + elif (localidade == "pb"): + arq = csv.DictReader( + open("./gazetteer/features_paraiba_ln.csv", "r", encoding='utf-8')) + + fields = ["osm_id", "fclass", "name", "type", "coordenates"] + f = csv.writer(open('./gazetteer/processados/' + + localidade + '_ln.csv', 'w', encoding='utf-8')) + f.writerow(fields) + + for p in arq: + coord = convertGeometryPolygon(p['geometry']) + t = [p['osm_id'].__str__(), p["fclass"].__str__(), p["name"].__str__(), + p["type"].__str__(), coord] + f.writerow(t) def points(localidade="cg"): - """ - Função de pré-processamento escreve dados dos endereços de pontos em outro arquivo - com as coordenadas normalizadas. - - Parâmetros: - ---------- - localidade : String - - String que representa a cidade/estado("cg", "jp" ou "pb"). - """ - if (localidade == "cg"): - arq = csv.DictReader( - open("./gazetteer/features_campina_pt.csv", "r", encoding='utf-8')) - elif (localidade == "jp"): - arq = csv.DictReader( - open("./gazetteer/features_jp_pt.csv", "r", encoding='utf-8')) - elif (localidade == "pb"): - arq = csv.DictReader( - open("./gazetteer/features_paraiba_pt.csv", "r", encoding='utf-8')) - - fields = ["osm_id", "fclass", "name", "type", "coordenates"] - f = csv.writer(open('./gazetteer/processados/' + - localidade + '_pt.csv', 'w', encoding='utf-8')) - f.writerow(fields) - - for p in arq: - coord = convertGeometryPoint(p['geometry']) - t = [p['osm_id'].__str__(), p["fclass"].__str__(), p["name"].__str__(), - p["type"].__str__(), coord] - f.writerow(t) + """ + Função de pré-processamento escreve dados dos endereços de pontos + em outro arquivo + com as coordenadas normalizadas. + + Parâmetros: + ---------- + localidade : String + - String que representa a cidade/estado("cg", "jp" ou "pb"). + """ + if (localidade == "cg"): + arq = csv.DictReader( + open("./gazetteer/features_campina_pt.csv", "r", encoding='utf-8')) + elif (localidade == "jp"): + arq = csv.DictReader( + open("./gazetteer/features_jp_pt.csv", "r", encoding='utf-8')) + elif (localidade == "pb"): + arq = csv.DictReader( + open("./gazetteer/features_paraiba_pt.csv", "r", encoding='utf-8')) + + fields = ["osm_id", "fclass", "name", "type", "coordenates"] + f = csv.writer(open('./gazetteer/processados/' + + localidade + '_pt.csv', 'w', encoding='utf-8')) + f.writerow(fields) + + for p in arq: + coord = convertGeometryPoint(p['geometry']) + t = [p['osm_id'].__str__(), p["fclass"].__str__(), p["name"].__str__(), + p["type"].__str__(), coord] + f.writerow(t) def features(localidade="cg"): - """ - Função de pré-processamento escreve dados dos endereços de features em outro arquivo - com as coordenadas normalizadas. - - Parâmetros: - ---------- - localidade : String - - String que representa a cidade/estado("cg", "jp" ou "pb"). - """ - if (localidade == "cg"): - arq = csv.DictReader(open("./gazetteer/features_campina.csv", mode="r")) - elif (localidade == "jp"): - arq = csv.DictReader(open("./gazetteer/features_jp.csv", mode="r")) - elif (localidade == "pb"): - arq = csv.DictReader(open("./gazetteer/features_paraiba.csv", mode="r")) - - fields = ["osm_id", "fclass", "name", "type", "coordenates"] - f = csv.writer(open('./gazetteer/processados/' + - localidade + '.csv', 'w', encoding='utf-8')) - f.writerow(fields) - - for p in arq: - coord = convertFeature(p['geometry']) - t = [p['osm_id'].__str__(), p["fclass"].__str__(), p["name"].__str__(), - p["type"].__str__(), coord] - f.writerow(t) + """ + Função de pré-processamento escreve dados dos endereços de features + em outro arquivo + com as coordenadas normalizadas. + + Parâmetros: + ---------- + localidade : String + - String que representa a cidade/estado("cg", "jp" ou "pb"). + """ + if (localidade == "cg"): + arq = csv.DictReader( + open("./gazetteer/features_campina.csv", mode="r")) + elif (localidade == "jp"): + arq = csv.DictReader(open("./gazetteer/features_jp.csv", mode="r")) + elif (localidade == "pb"): + arq = csv.DictReader( + open("./gazetteer/features_paraiba.csv", mode="r")) + + fields = ["osm_id", "fclass", "name", "type", "coordenates"] + f = csv.writer(open('./gazetteer/processados/' + + localidade + '.csv', 'w', encoding='utf-8')) + f.writerow(fields) + + for p in arq: + coord = convertFeature(p['geometry']) + t = [p['osm_id'].__str__(), p["fclass"].__str__(), p["name"].__str__(), + p["type"].__str__(), coord] + f.writerow(t) def main(): - """ - Função principal, onde tudo será executado. - """ + """ + Função principal, onde tudo será executado. + """ locs = ['cg', 'jp', 'pb'] for loc in locs: diff --git a/pyelit/Geoparsing/utils/utils.py b/pyelit/Geoparsing/utils/utils.py index a1e4823..e29c018 100644 --- a/pyelit/Geoparsing/utils/utils.py +++ b/pyelit/Geoparsing/utils/utils.py @@ -8,80 +8,99 @@ maxInt = sys.maxsize csv.field_size_limit(maxInt) + def to_convert_geometry_point(geometry): - g = Geometry(geometry) - coord = g.geojson['coordinates'] - coord.reverse() - return coord + g = Geometry(geometry) + coord = g.geojson['coordinates'] + coord.reverse() + return coord + def to_convert_geometry_polygon(geometry): - g = Geometry(geometry) - coord = g.geojson['coordinates'] - saida = [] - for c in coord[0]: - c.reverse() - saida.append(c) - return saida + g = Geometry(geometry) + coord = g.geojson['coordinates'] + saida = [] + for c in coord[0]: + c.reverse() + saida.append(c) + return saida + def to_convert_feature(geometry): - g = Geometry(geometry) - coord = g.geojson['coordinates'][0][0] - saida = [] - for c in coord: - c.reverse() - saida.append(c) - return saida + g = Geometry(geometry) + coord = g.geojson['coordinates'][0][0] + saida = [] + for c in coord: + c.reverse() + saida.append(c) + return saida + def polygons(localidade="cg"): - if (localidade == "cg"): - arq = csv.DictReader(open("./dados/features_campina_ln.csv", "r", encoding='utf-8')) - elif (localidade == "jp"): - arq = csv.DictReader(open("./dados/features_jp_ln.csv", "r", encoding='utf-8')) - elif (localidade == "pb"): - arq = csv.DictReader(open("./dados/features_paraiba_ln.csv", "r", encoding='utf-8')) - - fields = ["osm_id", "fclass", "name", "type", "coordenates"] - f = csv.writer(open('./processamento/gazetteer/'+ localidade + '_ln.csv', 'w', encoding='utf-8')) - f.writerow(fields) - - for p in arq: - coord = converterGeometryPolygon(p['geometry']) - t = [ p['osm_id'].__str__(), p["fclass"].__str__(), p["name"].__str__(), p["type"].__str__(), coord ] - f.writerow(t) + if (localidade == "cg"): + arq = csv.DictReader( + open("./dados/features_campina_ln.csv", "r", encoding='utf-8')) + elif (localidade == "jp"): + arq = csv.DictReader( + open("./dados/features_jp_ln.csv", "r", encoding='utf-8')) + elif (localidade == "pb"): + arq = csv.DictReader( + open("./dados/features_paraiba_ln.csv", "r", encoding='utf-8')) + + fields = ["osm_id", "fclass", "name", "type", "coordenates"] + f = csv.writer(open('./processamento/gazetteer/' + + localidade + '_ln.csv', 'w', encoding='utf-8')) + f.writerow(fields) + + for p in arq: + coord = converterGeometryPolygon(p['geometry']) + t = [p['osm_id'].__str__(), p["fclass"].__str__( + ), p["name"].__str__(), p["type"].__str__(), coord] + f.writerow(t) + def points(localidade="cg"): - if (localidade == "cg"): - arq = csv.DictReader(open("./dados/features_campina_pt.csv", "r", encoding='utf-8')) - elif (localidade == "jp"): - arq = csv.DictReader(open("./dados/features_jp_pt.csv", "r", encoding='utf-8')) - elif (localidade == "pb"): - arq = csv.DictReader(open("./dados/features_paraiba_pt.csv", "r", encoding='utf-8')) - - fields = ["osm_id", "fclass", "name", "type", "coordenates"] - f = csv.writer(open('./processamento/gazetteer/' + localidade + '_pt.csv', 'w', encoding='utf-8')) - f.writerow(fields) - - for p in arq: - coord = converterGeometryPoint(p['geometry']) - t = [ p['osm_id'].__str__(), p["fclass"].__str__(), p["name"].__str__(), p["type"].__str__(), coord ] - f.writerow(t) + if (localidade == "cg"): + arq = csv.DictReader( + open("./dados/features_campina_pt.csv", "r", encoding='utf-8')) + elif (localidade == "jp"): + arq = csv.DictReader( + open("./dados/features_jp_pt.csv", "r", encoding='utf-8')) + elif (localidade == "pb"): + arq = csv.DictReader( + open("./dados/features_paraiba_pt.csv", "r", encoding='utf-8')) + + fields = ["osm_id", "fclass", "name", "type", "coordenates"] + f = csv.writer(open('./processamento/gazetteer/' + + localidade + '_pt.csv', 'w', encoding='utf-8')) + f.writerow(fields) + + for p in arq: + coord = converterGeometryPoint(p['geometry']) + t = [p['osm_id'].__str__(), p["fclass"].__str__( + ), p["name"].__str__(), p["type"].__str__(), coord] + f.writerow(t) + def features(localidade="cg"): - if (localidade == "cg"): - arq = csv.DictReader(open("./dados/features_campina.csv", mode="r")) - elif (localidade == "jp"): - arq = csv.DictReader(open("./dados/features_jp.csv", mode="r")) - elif (localidade == "pb"): - arq = csv.DictReader(open("./dados/features_paraiba.csv", mode="r")) - - fields = ["osm_id", "fclass", "name", "type", "coordenates"] - f = csv.writer(open('./processamento/gazetteer/' + localidade + '.csv', 'w', encoding='utf-8')) - f.writerow(fields) - - for p in arq: - coord = converterFeature(p['geometry']) - t = [ p['osm_id'].__str__(), p["fclass"].__str__(), p["name"].__str__(), p["type"].__str__(), coord ] - f.writerow(t) + if (localidade == "cg"): + arq = csv.DictReader(open("./dados/features_campina.csv", mode="r")) + elif (localidade == "jp"): + arq = csv.DictReader(open("./dados/features_jp.csv", mode="r")) + elif (localidade == "pb"): + arq = csv.DictReader(open("./dados/features_paraiba.csv", mode="r")) + + fields = ["osm_id", "fclass", "name", "type", "coordenates"] + f = csv.writer(open('./processamento/gazetteer/' + + localidade + '.csv', 'w', encoding='utf-8')) + f.writerow(fields) + + for p in arq: + coord = converterFeature(p['geometry']) + t = [p['osm_id'].__str__(), p["fclass"].__str__( + ), p["name"].__str__(), p["type"].__str__(), coord] + f.writerow(t) + def string_to_list(coor_str): b = coor_str.replace("[", "") @@ -104,24 +123,34 @@ def string_to_list(coor_str): lon = sum(lon) / len(lon) return (lat, lon) + def clear_gazetteer(): - """ - Realizando limpeza dos dados do gazetteer, deixando apenas endereços do estado da Paraíba. - """ - arq = csv.DictReader(open("./gazetteer/processados/gazetteer.csv", "r", encoding='utf-8')) - arq1 = csv.writer(open("./gazetteer/processados/gazetteer1.csv", "w", encoding='utf-8')) - arq1.writerow(["osm_id", "fclass", "name", "type", "coordenates"]) - for row in arq: - lat, lon = string_to_list(row['coordenates']) - loc_= str(lat) + ", " + str(lon) - g = geocoder.reverse(location=loc_, provider="arcgis") - g = g.json - - try: - if (g['state'] == "Paraíba"): - t = [ row['osm_id'].__str__(), row["fclass"].__str__(), row["name"].__str__(), row["type"].__str__(), row['coordenates'] ] - arq1.writerow(t) - except Exception as e: - continue - -# clear_gazetteer() \ No newline at end of file + """ + Realizando limpeza dos dados do gazetteer, deixando apenas endereços + do estado da Paraíba. + """ + arq = csv.DictReader( + open("./gazetteer/processados/gazetteer.csv", "r", encoding='utf-8')) + arq1 = csv.writer( + open("./gazetteer/processados/gazetteer1.csv", "w", encoding='utf-8')) + arq1.writerow(["osm_id", "fclass", "name", "type", "coordenates"]) + for row in arq: + lat, lon = string_to_list(row['coordenates']) + loc_ = str(lat) + ", " + str(lon) + g = geocoder.reverse(location=loc_, provider="arcgis") + g = g.json + + try: + if (g['state'] == "Paraíba"): + t = [ + row['osm_id'].__str__(), + row["fclass"].__str__(), + row["name"].__str__(), + row["type"].__str__(), + row['coordenates'] + ] + arq1.writerow(t) + except Exception as e: + continue + +# clear_gazetteer() diff --git a/pyelit/Pre_processamento/pre_processamento.py b/pyelit/Pre_processamento/pre_processamento.py index b9269bc..3b10465 100644 --- a/pyelit/Pre_processamento/pre_processamento.py +++ b/pyelit/Pre_processamento/pre_processamento.py @@ -66,8 +66,12 @@ def lista_para_texto(lista): stemmer = PorterStemmer() nlp = spacy.load("pt_core_news_sm") -nlp.Defaults.stop_words |= {"tudo", "coisa", "toda", "tava", "pessoal", "dessa", "resolvido", "aqui", "gente", "tá", "né", "calendário", "jpb", "agora", "voltar", - "lá", "hoje", "aí", "ainda", "então", "vai", "porque", "moradores", "fazer", "rua", "bairro", "prefeitura", "todo", "vamos", "problema", "fica", "ver", "tô"} +nlp.Defaults.stop_words |= { + "tudo", "coisa", "toda", "tava", "pessoal", "dessa", "resolvido", "aqui", + "gente", "tá", "né", "calendário", "jpb", "agora", "voltar", "lá", "hoje", + "aí", "ainda", "então", "vai", "porque", "moradores", "fazer", "rua", + "bairro", "prefeitura", "todo", "vamos", "problema", "fica", "ver", "tô" +} stop_words_spacy = nlp.Defaults.stop_words @@ -117,7 +121,10 @@ def pre_processamento(texto, titulo): entidades_loc = [ entidade for entidade in doc.ents if entidade.label_ == "LOC"] for token in doc: - if (token.text not in stop_words_spacy and len(token.text) > 3 and token.pos_ in allowed_postags and not verificar_palavra_entidade_loc(token.text, entidades_loc)): + if (token.text not in stop_words_spacy and + len(token.text) > 3 and + token.pos_ in allowed_postags and not + verificar_palavra_entidade_loc(token.text, entidades_loc)): doc_out.append(lematizacao(token.text)) texto = lista_para_texto(doc_out) diff --git a/pyelit/TopicModeling/TopicModeling.py b/pyelit/TopicModeling/TopicModeling.py index 168f463..07495b1 100644 --- a/pyelit/TopicModeling/TopicModeling.py +++ b/pyelit/TopicModeling/TopicModeling.py @@ -18,21 +18,28 @@ class TopicModeling: """ Classe de Modelagem de tópicos com um score de coherence de 0.52. Como é usado uma abordagem de aprendizado não-supervisionado não foi - feito testes de acurácia, mas os que foram realizados manualmente + feito testes de acurácia, mas os que foram realizados manualmente obteram bons resultados. Descreve textos que tratam sobre problemas urbanos. - Permite que a partir de um texto seja possível descrever qual tópico aquele texto pertence, com uma boa probabilidade. + Permite que a partir de um texto seja possível descrever qual tópico + aquele texto pertence, com uma boa probabilidade. """ def __init__(self): """ - Construtor da classe. Inicia os principais objetos/atributos para o funcionamento do mesmo. + Construtor da classe. Inicia os principais objetos/atributos para o + funcionamento do mesmo. """ self.stemmer = PorterStemmer() self.nlp = spacy.load("pt_core_news_sm") - self.nlp.Defaults.stop_words |= {"tudo", "coisa", "toda", "tava", "pessoal", "dessa", "resolvido", "aqui", "gente", "tá", "né", "calendário", "jpb", "agora", "voltar", - "lá", "hoje", "aí", "ainda", "então", "vai", "porque", "moradores", "fazer", "rua", "bairro", "prefeitura", "todo", "vamos", "problema", "fica", "ver", "tô"} + self.nlp.Defaults.stop_words |= { + "tudo", "coisa", "toda", "tava", "pessoal", "dessa", "resolvido", + "aqui", "gente", "tá", "né", "calendário", "jpb", "agora", + "voltar", "lá", "hoje", "aí", "ainda", "então", "vai", "porque", + "moradores", "fazer", "rua", "bairro", "prefeitura", "todo", + "vamos", "problema", "fica", "ver", "tô" + } self.stop_words_spacy = self.nlp.Defaults.stop_words np.random.seed(2018) nltk.download('wordnet') @@ -52,7 +59,8 @@ def pre_processing(self, text): - Remove palavras que são entidades de localizações. - Coloca todo o texto para caixa baixa. - Realiza a lematização das palavras. - - Deixa apenas palavras que são: substantivos, adjetivos e pronomes. + - Deixa apenas palavras que são: substantivos, + adjetivos e pronomes. Parâmetro: ---------- @@ -69,7 +77,10 @@ def pre_processing(self, text): entidades_loc = [ entidade for entidade in doc.ents if entidade.label_ == "LOC"] for token in doc: - if (token.text not in self.stop_words_spacy and len(token.text) > 3 and token.pos_ in self.allowed_postags and not self.is_entities_loc(token.text, entidades_loc)): + if (token.text not in self.stop_words_spacy and + len(token.text) > 3 and + token.pos_ in self.allowed_postags and not + self.is_entities_loc(token.text, entidades_loc)): doc_out.append(self.lemmatization(token.text)) return doc_out @@ -119,14 +130,15 @@ def print_keywords(self, quant_max_palavras=None): Parâmetros: ---------- quant_max_palavras: Int - - Quantidade máxima de palavras que representam um tópico a serem retornadas. + - Quantidade máxima de palavras que representam um tópico + a serem retornadas. Retorno: ---------- topics : List - Lista de palavras chaves por tópicos do modelo. """ - if quant_max_palavras == None: + if quant_max_palavras is None: quant_max_palavras = 5 topics = [] for topic in self.model.print_topics(-1, quant_max_palavras): @@ -146,7 +158,9 @@ def represent_topics(self, ids_topics, names_topics): - Lista de ids dos tópicos. names_topics: List - Lista de nomes dos tópicos. - Os dois devem vim na mesma ordem, nome na posição 0 é do id na posição 0. + + Os dois devem vim na mesma ordem, nome na posição 0 é do id na + posição 0. """ for id_topic, name in zip(ids_topics, names_topics): self.topics[id_topic] = name @@ -164,7 +178,8 @@ def get_topic(self, id_topic): def rate_text(self, text): """ - Método que irá retorna de qual tópico o texto, passado como parametro, tem mais probabilidade de pertencer. + Método que irá retorna de qual tópico o texto, passado como + parametro, tem mais probabilidade de pertencer. Parâmetro: ---------- @@ -174,7 +189,8 @@ def rate_text(self, text): Retorno: ---------- result : List - - Uma lista de tuplass com o id do tópico que esse texto pertence e também a probabilidade. + - Uma lista de tuplass com o id do tópico que esse + texto pertence e também a probabilidade. """ bow_vector = self.model.id2word.doc2bow(self.pre_processing(text)) result = self.model.get_document_topics(bow_vector) diff --git a/pyelit/TopicModeling/Train.py b/pyelit/TopicModeling/Train.py index aac5a19..6ab0efa 100644 --- a/pyelit/TopicModeling/Train.py +++ b/pyelit/TopicModeling/Train.py @@ -56,7 +56,8 @@ def main_cross_val(): # Criando e treinando o modelo. lda_model_tfidf = gensim.models.LdaMulticore( - corpus_tfidf, num_topics=4, id2word=dictionary, passes=10, workers=4, alpha=0.01, eta=0.9) + corpus_tfidf, num_topics=4, id2word=dictionary, passes=10, + workers=4, alpha=0.01, eta=0.9) coherence_model(lda_model_tfidf, processed_test, corpus_tfidf, dictionary) @@ -64,7 +65,8 @@ def main_cross_val(): def coherence_model(lda_model_, tests, corpus, dictionary): coherence_model_lda = CoherenceModel( - model=lda_model_, texts=tests, corpus=corpus, dictionary=dictionary, coherence='c_v') + model=lda_model_, texts=tests, corpus=corpus, dictionary=dictionary, + coherence='c_v') coherence_lda = coherence_model_lda.get_coherence() print('\nCoherence Score LDAModelTfIdf: ', coherence_lda) @@ -121,8 +123,10 @@ def main(): corpus_tfidf = tfidf[bow_corpus] # Criando e treinando o modelo. - # lda_model_tfidf = gensim.models.LdaMulticore(corpus_tfidf, num_topics=4, id2word=dictionary, passes=10, workers=4, alpha=0.01, eta=0.9) - # lda_model_tfidf.save("./modelo/meu_lda_model") + # lda_model = gensim.models.LdaMulticore(corpus_tfidf, num_topics=4, + # id2word=dictionary, passes=10, + # workers=4, alpha=0.01, eta=0.9) + # slda_model.save("./modelo/meu_lda_model") ROOT = os.path.abspath(os.path.dirname(__file__)) fname = datapath(ROOT + "/modelo/meu_lda_model") @@ -130,7 +134,8 @@ def main(): def coherence_model(lda_model_, processed_docs, corpus_tfidf, dictionary): coherence_model_lda = CoherenceModel( - model=lda_model_, texts=processed_docs, corpus=corpus_tfidf, dictionary=dictionary, coherence='c_v') + model=lda_model_, texts=processed_docs, corpus=corpus_tfidf, + dictionary=dictionary, coherence='c_v') coherence_lda = coherence_model_lda.get_coherence() print('\nCoherence Score LDAModelTfIdf load: ', coherence_lda) @@ -141,10 +146,12 @@ def compute_num_steps(dct, corpus_tfidf, texts, limit, start, step): model_list = [] for passes in range(start, limit, 1): model = gensim.models.LdaMulticore( - corpus_tfidf, num_topics=4, id2word=dictionary, passes=passes, workers=4, alpha=0.01, eta=0.9) + corpus_tfidf, num_topics=4, id2word=dictionary, passes=passes, + workers=4, alpha=0.01, eta=0.9) model_list.append(model) coherencemodel = CoherenceModel( - model=model, texts=texts, corpus=corpus_tfidf, dictionary=dct, coherence='c_v') + model=model, texts=texts, corpus=corpus_tfidf, dictionary=dct, + coherence='c_v') coherence_values.append(coherencemodel.get_coherence()) return model_list, coherence_values @@ -165,5 +172,5 @@ def compute_num_steps(dct, corpus_tfidf, texts, limit, start, step): for m, cv in zip(x, coherence_values): print("Step =", m, " has Coherence Value of", round(cv, 4)) - # coherence_model(lda_model_tfidf, processed_docs, corpus_tfidf, dictionary) + main() diff --git a/setup.py b/setup.py index ed28fa1..9329f43 100644 --- a/setup.py +++ b/setup.py @@ -27,6 +27,8 @@ def run(self): install.run(self) +keywords = 'geoparsing topic modeling locations text issues problems urbans' + setup( name='PyElit', version='0.1.2', @@ -42,7 +44,7 @@ def run(self): project_urls={ 'Código fonte': 'https://github.com/Rickecr/PyElit', }, - keywords='geoparsing topic modeling geo locations text issues problems urbans', + keywords=keywords, license='MIT', cmdclass={ 'develop': PostDevelopCommand, From 5e35ee0c85fc220fad67f8cb105cfc71e23476e9 Mon Sep 17 00:00:00 2001 From: Rich Date: Sat, 20 Jun 2020 17:10:30 -0300 Subject: [PATCH 6/6] remove __init__.py --- __init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 __init__.py diff --git a/__init__.py b/__init__.py deleted file mode 100644 index e69de29..0000000