Open LuccaTrindade opened 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
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?
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.
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
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).
O build.sh abre em um outro terminal e quando finaliza fecha instantaneamente. Não to conseguindo criar um log.txt
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?
O que aparece:
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
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/
Como seria pra baixar essa imagem pronta? Qual imagem em específico você está falando?
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.
Olá Sid. Utilizando o Linux/Ubuntu dessa vez, o problema com o "./build.sh" foi esse:
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?
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.
Entendi Sid, obrigado. Na espera
@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.
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
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/
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.
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.
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
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.
docker exec -ti nilcmetrix bash
cp run_min.py runlucca.py
apt install vim
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}
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.
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.
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.
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'))
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;"