sidleal / nilcmetrix

NILC-Metrix gathers the metrics developed over more than a decade in NILC Lab.
GNU Affero General Public License v3.0
2 stars 9 forks source link

Dúvidas com o banco de dados #3

Open LuccaTrindade opened 1 year ago

LuccaTrindade commented 1 year ago

Cara, to na tentativa de conseguir rodar o 'test.py', para assim utilizar da ferramenta para meu projeto. O erro quando tento rodar o 'teste.py': "conn = _connect(dsn, connection_factory=connection_factory, **kwasync) sqlalchemy.exc.OperationalError: (OperationalError) None None"

Eu tentei usar o comando do pg_restore como indicado no GitHub, entretanto o comando reclama de que o banco de dados "cohmetrix_pt_br" não existe. Criei pelo PgAdmin4 um banco de dados com esse nome, mas aparece esses erros no comando pg_restore:

COMANDO: "pg_restore -d cohmetrix_pt_br /Users/lucca/OneDrive/Documentos/GitHub/Nilcmetrix/tools/postgres/cohmetrix_pt_br"

ERRO:

"pg_restore: error: could not execute query: ERRO: esquema "public" já existe Command was: CREATE SCHEMA public;

pg_restore: error: could not execute query: ERRO: must be able to SET ROLE "postgres" Command was: ALTER SCHEMA public OWNER TO postgres;

pg_restore: error: could not execute query: ERRO: deve ser o dono da extensão plpgsql Command was: COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';

pg_restore: error: could not execute query: ERRO: role "cohmetrix" não existe Command was: ALTER SEQUENCE public.connectives_id_seq OWNER TO cohmetrix;

pg_restore: error: could not execute query: ERRO: role "cohmetrix" não existe Command was: ALTER TABLE public.connectives OWNER TO cohmetrix;

pg_restore: error: could not execute query: ERRO: role "cohmetrix" não existe Command was: ALTER TABLE public.delaf_nouns OWNER TO cohmetrix;

pg_restore: error: could not execute query: ERRO: role "cohmetrix" não existe Command was: ALTER TABLE public.delaf_verbs OWNER TO cohmetrix;

pg_restore: error: could not execute query: ERRO: role "cohmetrix" não existe Command was: ALTER TABLE public.delaf_words OWNER TO cohmetrix;

pg_restore: error: could not execute query: ERRO: role "cohmetrix" não existe Command was: ALTER SEQUENCE public.frequencies_id_seq OWNER TO cohmetrix;

pg_restore: error: could not execute query: ERRO: role "cohmetrix" não existe Command was: ALTER TABLE public.frequencies OWNER TO cohmetrix;

pg_restore: error: could not execute query: ERRO: role "cohmetrix" não existe Command was: ALTER TABLE public.hypernyms_verbs OWNER TO cohmetrix;

pg_restore: error: could not execute query: ERRO: role "cohmetrix" não existe Command was: ALTER SEQUENCE public.tep_words_grupo_seq OWNER TO cohmetrix;

pg_restore: error: could not execute query: ERRO: role "cohmetrix" não existe Command was: ALTER TABLE public.tep_words OWNER TO cohmetrix;"

LuccaTrindade commented 1 year ago

Acabei conseguindo criar o banco de dados e restaurar. No entanto, ao rodar o test.py, da o seguinte problema: " 2023-10-16 00:36:43.854172 Traceback (most recent call last): File "test.py", line 40, in ret = text_metrics.nilc_metrics.values_for_text(t).as_flat_dict() File "C:\Users\lucca\OneDrive\Documentos\GitHub\Nilcmetrix\text_metrics\base.py", line 487, in values_for_text values.append((cat, cat.values_for_text(text, rp))) File "C:\Users\lucca\OneDrive\Documentos\GitHub\Nilcmetrix\text_metrics\base.py", line 350, in values_for_text values.append((m, round(m.value_for_text(text), 5))) File "C:\Users\lucca\OneDrive\Documentos\GitHub\Nilcmetrix\text_metrics\metrics\syntax.py", line 80, in value_for_text syntax_trees = rp.parse_trees(t) File "C:\Users\lucca\OneDrive\Documentos\GitHub\Nilcmetrix\text_metrics\resource_pool.py", line 98, in setattr(self, suffix, lambda args: self.get(suffix, args)) File "C:\Users\lucca\OneDrive\Documentos\GitHub\Nilcmetrix\text_metrics\resource_pool.py", line 133, in get self._unpinned_cache.append((suffix, args, self._hookssuffix)) File "C:\Users\lucca\OneDrive\Documentos\GitHub\Nilcmetrix\text_metrics\resource_pool.py", line 644, in _parse_trees return parser.parse_sents(sentences) File "C:\Users\lucca\OneDrive\Documentos\GitHub\Nilcmetrix\text_metrics\tools\parse\lxparser.py", line 88, in parse_sents return_value = self.run(input_file_path) File "C:\Users\lucca\OneDrive\Documentos\GitHub\Nilcmetrix\text_metrics\tools\parse\lxparser.py", line 101, in run p = subprocess.Popen(self._cmd(filename), File "C:\Users\lucca\AppData\Local\Programs\Python\Python38\lib\subprocess.py", line 858, in init self._execute_child(args, executable, preexec_fn, close_fds, File "C:\Users\lucca\AppData\Local\Programs\Python\Python38\lib\subprocess.py", line 1311, in _execute_child hp, ht, pid, tid = _winapi.CreateProcess(executable, args, FileNotFoundError: [WinError 2] O sistema não pode encontrar o arquivo especificado " O sistema não encontra o tal do "filename". Não sei se é por que estou usando um ambiente virtual fora da pasta da Nilcmetrix. Enfim

sidleal commented 1 year ago

Olá Lucca,

Esse código é um pouco antigo, e tem muitas dependências. O jeito mais simples de rodar ele é usando container (docker), pois aí podemos criar todo o ambiente usado na época que foi desenvolvido... e funciona bem, depois é só chamar via linha de comando na sua aplicação.

Você conseguiu rodar com o docker seguindo o tutorial dos videos?

Rodar o código diretamente, utilizando as versões mais atuais das libs vai exigir mais esforço e pesquisa da sua parte. Isso também é bem vindo, nesse caso eu sugiro fazer um fork do projeto, adaptar para as versões atuais e fazer um Pull Request de volta, isso vai ajudar mais gente no futuro.

O erro que você postou é do lxparser, tem algumas dependências dentro da pasta tools (o zip de 2g que precisa ser baixado do google drive). Conseguiu baixar e unzipar ela na raiz do projeto?

LuccaTrindade commented 1 year ago

Obrigado pela resposta Sid. Sobre a pasta tools, eu coloquei ela dentro do repositorio clonado Nilcmetrix. Sobre o docker, eu consegui criar o container pgs_cohmetrix, mas quando eu logo em seguida rodo o comando ./build.sh, não funciona. Não se cria a imagem cohmetrix. Acredito que seja problema no Dockerfile, pois a minha pasta textmetrix não está no /opt/textmetrix. Eu teria que mudar o WORKDIR. Agora eu não sei se devo mudar a linha 5 do Dockerfile: "RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone" O que você acha? Eu vejo também que o próximo comando (run_minimal.sh) tem caminhos da sua máquina, devo mudar também.

LuccaTrindade commented 1 year ago

Apenas mudei o WORKDIR, o build.sh roda, mas no final, quando dou um "docker images", não aparece o cohmetrix.

WORKDIR /Users/lucca/OneDrive/Documentos/GitHub/Nilcmetrix/textmetrics

sidleal commented 1 year ago

O /opt/textmetrics é o caminho interno do container, não tem a ver com o caminho externo da sua máquina. Minha pasta fica no /Downloads... você precisa alterar só o caminho do run_minimal.sh.

Possivelmente o erro que está dando no build.sh é por outro motivo. Você está rodando ele dentro da pasta raiz? Que mensagem que dá? (sem alterar o workdir).

LuccaTrindade commented 1 year ago

O build.sh abre em um outro terminal e quando finaliza fecha instantaneamente. Não to conseguindo criar um log.txt

sidleal commented 1 year ago

Confere as permissões do arquivo... na dúvida tente um: chmod +x build.sh e em seguida ./build.sh

Isso deve mostrar a saída no próprio terminal que estiver rodando. Você está usando linux mesmo?

LuccaTrindade commented 1 year ago

O que aparece:

0 building with "default" instance using docker driver

1 [internal] load .dockerignore

1 transferring context: 2B done

1 DONE 1.5s

2 [internal] load build definition from Dockerfile

2 transferring dockerfile: 1.04kB 0.0s done

2 DONE 1.5s

3 [internal] load metadata for docker.io/library/ubuntu:focal

3 DONE 4.2s

4 [ 1/15] FROM docker.io/library/ubuntu:focal@sha256:ed4a42283d9943135ed87d4ee34e542f7f5ad9ecf2f244870e23122f703f91c2

4 DONE 0.0s

5 [ 2/15] RUN ln -snf /usr/share/zoneinfo/America/Sao_Paulo /etc/localtime && echo America/Sao_Paulo > /etc/timezone

5 CACHED

6 [ 3/15] RUN apt update

6 CACHED

7 [ 4/15] RUN apt install -y python3 python3-pip python3-numpy

7 CACHED

8 [ 5/15] RUN apt install -y default-jre

8 CACHED

9 [ 6/15] RUN pip3 install --upgrade pip

9 CACHED

10 [ 7/15] RUN pip3 install --upgrade setuptools

10 CACHED

11 [ 8/15] WORKDIR /opt/text_metrics

11 DONE 1.0s

Depois aparece um monte de "transfering context" que vai até uns 3.5Gb 13 DONE 508.0s ERROR: failed to solve: Canceled: context canceled

Não sei o que deve ser. So pra constar, eu tenho a BASE_DIR alterada do confi.py e o DEFAUL_OPTIONS da database.py alterado também. Estou rodando dentro da pasta do repositorio clonado Nilcmetrix. Estou usando Windows

sidleal commented 1 year ago

Humm... windows e docker não se dão muito bem ainda, googlei pelo erro e parece ser algo de permissão do windows, mas bem genérico. https://stackoverflow.com/questions/65245078/docker-image-build-context-canceled-error-on-windows-10

Posso sugerir você criar uma vm ubuntu usando virtualbox? dá pra baixar a imagem pronta e só rodar. baixe daqui: https://www.osboxes.org/ubuntu/ instruções para rodar: https://www.osboxes.org/guide/

LuccaTrindade commented 1 year ago

Como seria pra baixar essa imagem pronta? Qual imagem em específico você está falando?

sidleal commented 1 year ago

A ideia do virtualbox é rodar uma máquina virtual dentro da outra... então com ele você consegue rodar um linux dentro do windows... e aí no linux seguir o passo a passo do video e fazer o nilcmetrix funcionar certinho. Com ele funcionando ficaria mais fácil você comparar a estrutura de pastas, arquivos e versões de biblioteca pra fazer funcionar no windows (se for esse o objetivo final). Ou simplesmente deixar a aplicação rodando sempre dentro da VM e acessar ela de fora por meio de uma API (tem um arquivo golang na raiz que faz isso). Atualizei o post anterior com um link mais confiável pras imagens do ubuntu, e um guia de como importar e rodar a imagem.

LuccaTrindade commented 1 year ago

Olá Sid. Utilizando o Linux/Ubuntu dessa vez, o problema com o "./build.sh" foi esse:

Failed to build kenlm 75.75 ERROR: Could not build wheels for kenlm, which is required to install pyproject.toml-based projects

Dockerfile:24

22 | RUN pip3 install psycopg2-binary 23 |
24 | >>> RUN pip3 install --no-cache-dir -r requirements.txt 25 |
26 | RUN python3 -m nltk.downloader all

ERROR: failed to solve: process "/bin/sh -c pip3 install --no-cache-dir -r requirements.txt" did not complete successfully: exit code: 1

Alguma sugestão?

sidleal commented 1 year ago

Opa... Parece erro na instalação de uma das libs de dependência, vou tentar simular novamente a instalação por aqui pra ver se mudou alguma lib. Retorno em breve.

LuccaTrindade commented 1 year ago

Entendi Sid, obrigado. Na espera

sidleal commented 1 year ago

@LuccaTrindade, era erro na instalação da lib do kenlm, tive que congelar ela numa versão mais antiga pra passar.

Dê outro pull para pegar as correções do último commit e tente buildar novamente que agora deve funcionar.

Aproveitei e subi a imagem pronta pro docker hub, então se der algum outro erro, agora você tem a opção de baixar ela pronta pra rodar. Aliás, depois tente rodar essa imagem pronta diretamente no Windows pra ver se vai.

A vantagem dessa imagem que fiz é que ela sobe uma api básica pra você chamar via POST de qualquer lugar, isso deve facilitar a integração no seu sistema. Em vez de rodar um shell, basta fazer uma chamada http passando o texto e tratar o retorno em JSON. Atualizei o readme com o exemplo de chamada via CURL.

LuccaTrindade commented 1 year ago

Opa Sid. Na maquina virtual deu certo. Entretanto, no windows deu esse erro:

Invoke-WebRequest : Não é possível associar o parâmetro 'Headers'. Não é possível converter o valor "Content-Type: text" do tipo "System.String" no tipo "System.Collections.IDictionary". No linha:1 caractere:76 ... 0/api/v1/metrix/_min/yyy?format=json" -H 'Content-Type: text' -d 'Apr ...


    CategoryInfo          : InvalidArgument: (:) [Invoke-WebRequest], ParameterBindingException
    FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

No caso, utilizando essa imagem pronta do docker hub que você acabou de colocar.
Isso foi o erro no Powershell do vscode.

No CMD deu isso aqui:

curl: (7) Failed to connect to localhost port 8080 after 2233 ms: Couldn't connect to server
curl: (3) URL using bad/illegal format or missing URL
curl: (6) Could not resolve host: a
curl: (6) Could not resolve host: ler
curl: (6) Could not resolve host: xn--9ca
curl: (6) Could not resolve host: aprender
curl: (6) Could not resolve host: a
curl: (6) Could not resolve host: ser
curl: (3) URL using bad/illegal format or missing URL
sidleal commented 1 year ago

Acho que precisa ajustar o comando curl pra rodar no windows, pelo erro ele está se perdendo com as aspas. Tenta fazer o post direto pelo seu código... ou use o postman: https://toolsqa.com/postman/post-request-in-postman/

LuccaTrindade commented 1 year ago

Certo, sid. Outra coisa, em relação ao comando do curl. Como seria para ter na saída apenas algumas métricas especificas, não todas? E também apenas o valor dessas métricas, sem o nome.

sidleal commented 1 year ago

Na a saída "padrão" tem todas as métricas EXCETO as que dependem do parser PALAVRAS, que é proprietário: https://github.com/sidleal/nilcmetrix#another-way-to-run-with-docker-hub-pre-built-image

Note que na URL de chamada tem um "_min" (http://localhost:8080/api/v1/metrix/_min/yyy?format=json), que é o nome do arquivo python que é executado (run_min.py): https://github.com/sidleal/nilcmetrix/blob/main/run_min.py

Se quiser pegar apenas algumas métricas específicas, entre no container, e crie o seu proprio .py a partir desse exemplo: https://github.com/sidleal/nilcmetrix/blob/36ad9c200c67ee6f3c8329b9547ec10253aa313f/run50.py#L5

Sobre trazer apenas o valor e não os nomes é mais complicado, você teria que alterar o nilcmetrix.go e rebuildar. Sugiro receber o JSON mesmo e tratar no seu código. Se não gostar do formato JSON, troque o ?format=json para ?format=plain, isso vai trazer uma lista separada por vírgulas, mas ainda com os nomes das métricas.

LuccaTrindade commented 1 year ago

Sid, desculpa, mas não entendi como seria essa questão de entrar no container e criar um .py ... Pode me dizer mais detalhes sobre, por favor

sidleal commented 1 year ago

Talvez seja mais simples você pegar a lista de todas as métricas no formato JSON e desconsiderar as que não precisa.

Mas se quiser mesmo fazer seu próprio .py com a saída com menos métricas, vou tentar colocar um passo a passo:

Pré requisito ter o container nilcmetrix rodando na máquina.

  1. Entrar no container: docker exec -ti nilcmetrix bash
  2. Copiar o run_min.py: cp run_min.py runlucca.py
  3. Instalar um editor de texto, eu uso o vim: apt install vim
  4. Editar o novo arquivo e incluir a lista métricas que deseja: vi runlucca.py.
    
    # -*- coding: utf-8 -*-
    import text_metrics
    import sys

text = sys.argv[1] raw = text.replace('{{quotes}}', '"') raw = raw.replace('{{exclamation}}', '!') raw = raw.replace('{{enter}}', '\n') raw = raw.replace('{{sharp}}', '#') raw = raw.replace('{{ampersand}}', '&') raw = raw.replace('{{percent}}', '%') raw = raw.replace('{{dollar}}', '$')

raw = raw.encode("utf-8", "surrogateescape").decode("utf-8") t = text_metrics.Text(raw) ret = text_metrics.no_palavras_metrics.values_for_text(t).as_flat_dict()

feat_list = ["flesch", "brunet", "words"]

result = '' for f in feat_list:
m = "%s:%s," % (f, ret[f]) result += m print("++", result, "++")

5. Salvar o arquivo e depois sair do container com `exit`.
6. Aí é só chamar colocando o sufixo do seu arquivo na url: 

$ curl -X POST "http://localhost:8080/api/v1/metrix/lucca/yyy?format=json" -H 'Content-Type: text' -d 'Aprender a ler é aprender a ser livre.' {"flesch":103.24,"brunet":4.69839,"words":8}

LuccaTrindade commented 1 year ago

Opa Sid, boa noite! Desde já agradeço pela ajuda. Ta dando tudo certo por aqui, mas só uma coisinha, quando uso o runlucca.py agora ta dando o seguinte erro:

Error cmd.Run() failed with exit status 1

Não consegui encontrar a causa.

sidleal commented 1 year ago

Só com essa mensagem não dá pra ter muita ideia do que tá errado. Não mostra nenhuma outra informação? talvez conferir novamente o nome do arquivo e se tá na pasta certa.

LuccaTrindade commented 1 year ago

Oi sid, desculpa o incomodo mais uma vez. Estou utilizando aquele método com o curl da seguinte forma na minha aplicação: " comando = f'curl -X POST "http://localhost:8080/api/v1/metrix/_min/yyy?format=json" -H "Content-Type: text" -d "{texto}" ' saida = subprocess.check_output(comando, shell=True, universal_newlines=True) objeto = json.loads(saida) brunet = objeto['brunet'] indice = indice + complexidade.media_total(texto) + brunet

" No caso aqui, estou utilizando o 'subprocess' pra automatizar o comando do curl, tem a variavel 'texto' e to puxando o valor do indice brunet, apenas como exemplo. A 'complexidade.media_total(texto)' é outra coisa, releva...

Com esse código, da uns erros que eu acredito que sejam referentes as aspas, pois alguns textos tem suas aspas dentro. Dai fica uma confusão de aspas...

Pergunto, você sabe outra forma de utilizar o api ou sabe como resolver essa questão das aspas?

Agradeceria muito mais essa ajuda.

sidleal commented 1 year ago

Olá Lucca, o curl é só pra teste ou pra usar direto dentro do terminal... no python (ou outro codigo) você deve fazer um post direto pela linguagem, usando os recursos dela (https://www.datacamp.com/tutorial/making-http-requests-in-python).

Exemplo:

import urllib.request
url = 'http://localhost:8080/api/v1/metrix/_min/yyy?format=json'
text = bytearray('Isso é um texto de teste.', encoding='utf-8')
req = urllib.request.Request(url, data=text, headers={'content-type': 'text/plain'})
response = urllib.request.urlopen(req)
print(response.read().decode('utf8'))