radar-parlamentar / radar

Estamos de mudança para o GitLab: https://gitlab.com/radar-parlamentar/radar.
http://radarparlamentar.polignu.org
84 stars 44 forks source link

Melhorar a qualidade da busca por palavras-chaves #449

Open leonardofl opened 6 years ago

leonardofl commented 6 years ago

A busca por palavras-chaves utiliza o Elastic Search e um processo de "stemmer", que compara as raízes das palavras pra melhorar a qualidade das buscas. Mas há várias opções de configuração de stemmer no ES. E me parece que a nossa não está tão boa assim. Segue alguns exemplos que funcionam e outros que não:

ok
cmsp: trabalhador -> trabalho
cmsp: escola -> escolas, escolar
conv: guilhotina -> guilhotinar

not ok
conv: nobreza -> nobres
conv: escolar -> escolas
conv: contratação -> contratar

Seria legal melhorar a configuração de stemmer do ES pra fazer os exemplos "not ok" funcionarem.

Usar outra ferramenta para a busca, como o próprio postgres, por exemplo, também é opção.

Referência: https://www.elastic.co/guide/en/elasticsearch/guide/current/stemming.html

Atentar para os problemas de Understemming e Overstemming.

Estamos usando o stemmer por dicionário: https://www.elastic.co/guide/en/elasticsearch/guide/current/hunspell.html

diraol commented 6 years ago

Acho que o PR #321 por ajudar também!

hpe95 commented 6 years ago

Entao, estamos estudando elasticsearch pra fecharmos a issue. Mas estamos com alguns problemas.

1 - Seguindo a documentacao de instalacao desse link https://github.com/eduardohideo/radar/blob/821465daf91c58980b826c4e849ce62af8098ec0/doc/INSTALL.md, após verificar que o ElasticSearch esta rodando na porta http://localhost:9200, nao estamos conseguindo configurar a engine de busca, mais precisamente a etapa 8.

2 - No estado atual do projeto, o ElasticSearch é executado toda vez que chamamos algum importador, correto? Nesse caso, como podemos ver o resultado do processo do stemmer?

eduardohideo commented 6 years ago

ola Harrison,

em 1, qual seria o problema?

2: quando se faz a busca, ele percebe que tem um analisador no índice e faz o "stemmer" da palavra. Por exemplo ,qndo se coloca escolas na busca, ele encontra ocorrências de escola, escolas e escolar.

2018-04-12 12:05 GMT-03:00 Harrison Pedro notifications@github.com:

Entao, estamos estudando elasticsearch pra fecharmos a issue. Mas estamos com alguns problemas.

1 - Seguindo a documentacao de instalacao desse link https://github.com/ eduardohideo/radar/blob/821465daf91c58980b826c4e849ce6 2af8098ec0/doc/INSTALL.md, após verificar que o ElasticSearch esta rodando na porta http://localhost:9200, nao estamos conseguindo configurar a engine de busca, mais precisamente a etapa 8.

2 - No estado atual do projeto, o ElasticSearch é executado toda vez que chamamos algum importador, correto? Nesse caso, como podemos ver o resultado do processo do stemmer?

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/radar-parlamentar/radar/issues/449#issuecomment-380838401, or mute the thread https://github.com/notifications/unsubscribe-auth/AAZo5v0Cs51Tg0CK-er_GwR6r_d6WSU4ks5tn21TgaJpZM4S6Sxm .

diraol commented 6 years ago

@peddrro repare que esse link que você postou está super desatualizado. Hoje estamos usando docker para lidar com toda nossa stack, incluindo o elasticsearch... não tem mais instalação "manual" nem nada assim. Aquele "INSTALL.md" já não server mais de referência, ele foi substituído por este: https://github.com/radar-parlamentar/radar/blob/master/doc/SETUP.md

hpe95 commented 6 years ago

@diraol sim, reparei isso. Conseguimos rodar aqui com o docker, muito obrigado.

@eduardohideo Entao estamos com problema de que o "stemmer" nao consegue encontrar ocorrencias de escola, escolas e escolar a partir de "escolas". O que estamos usando para realizar os testes, é com esse comando aqui:

sudo docker-compose exec django curl -XGET 'http://elasticsearch:9200/radar_parlamentar/_analyze?analyzer=my_analyzer&text=escolas' | python3 -m json.tool

e estamos recebendo isso:

{
    "tokens": [
        {
            "token": "escol",
            "start_offset": 0,
            "end_offset": 7,
            "type": "<ALPHANUM>",
            "position": 0
        }
    ]
}

esse "token" deveria vim com os valores escola, escolas e escolar? Ou esse teste deveria ser realizado de outra forma?

eduardohideo commented 6 years ago

Esse exemplo é mesmo antigo como o diego disse, testei aqui e teve que fazer algumas mudancas no mapping e trocar a chamada do analyze para POST para fazer funcionar na versao mais nova do ES.

ele recebeu o texto escolas e disse que a raiz é escol, aplicando a regra que está nos arquivos do Hunspell,

no arquivo pt-BR.dic, nao tem escola mas tem escol que aplica a regra CAO escol/CAO

no pt-BR.aff que tem as regras uma regra A diz que se a palavra for sufixo terminado em l ou m ou r entao adiciona a (escola) SFX A 0 a [lmr] nessa aqui ele diz para adicionar as no final (escolas) SFX A 0 as [lmr]

essa regra diz que se termina com ão adiciona es, como nao termina entao nao é aplicada(nao adiciona) SFX A o es ão

escolinha SFX O 0 inha [lz]

escolinhas SFX O 0 inhas l

qqr dessas contracoes leva para escol

nota que escolar não esta na regra de escol mas no .dic tem escolar/BRXjÁúÍÔ , ai ele é uma palavra raiz que tem alguns sufixos e prefixos https://www.elastic.co/guide/en/elasticsearch/guide/current/hunspell.html

eu fiz aqui alguns testes: primeiro criei varios textos que tem escol

http://localhost:9200/radar_parlamentar/_search { "took": 2, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": 6, "max_score": 1, "hits": [ { "_index": "radar_parlamentar", "_type": "_doc", "_id": "5", "_score": 1, "_source": { "text": "escolo teste" } }, { "_index": "radar_parlamentar", "_type": "_doc", "_id": "2", "_score": 1, "_source": { "text": "escolar teste" } }, { "_index": "radar_parlamentar", "_type": "_doc", "_id": "4", "_score": 1, "_source": { "text": "escol teste" } }, { "_index": "radar_parlamentar", "_type": "_doc", "_id": "6", "_score": 1, "_source": { "text": "escoles teste" } }, { "_index": "radar_parlamentar", "_type": "_doc", "_id": "1", "_score": 1, "_source": { "text": "escola teste" } }, { "_index": "radar_parlamentar", "_type": "_doc", "_id": "3", "_score": 1, "_source": { "text": "escolas teste" } } ] } }

depois fiz a busca com escolinha que é contracao de escola:

{ "took": 3, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": 3, "max_score": 0.9808292, "hits": [ { "_index": "radar_parlamentar", "_type": "_doc", "_id": "4", "_score": 0.9808292, "_source": { "text": "escol teste" } }, { "_index": "radar_parlamentar", "_type": "_doc", "_id": "1", "_score": 0.2876821, "_source": { "text": "escola teste" } }, { "_index": "radar_parlamentar", "_type": "_doc", "_id": "3", "_score": 0.2876821, "_source": { "text": "escolas teste" } } ] } }

Então é +- essa ideia

[]'s Eduardo

2018-04-12 17:37 GMT-03:00 Harrison Pedro notifications@github.com:

@diraol https://github.com/diraol sim, reparei isso. Conseguimos rodar aqui com o docker, muito obrigado.

@eduardohideo https://github.com/eduardohideo Entao estamos com problema de que o "stemmer" nao consegue encontrar ocorrencias de escola, escolas e escolar a partir de "escolas". O que estamos usando para realizar os testes, é com esse comando aqui:

sudo docker-compose exec django curl -XGET 'http://elasticsearch:9200/radar_parlamentar/_analyze?analyzer=my_analyzer&text=escolas' | python3 -m json.tool

e estamos recebendo isso:

{ "tokens": [ { "token": "escol", "start_offset": 0, "end_offset": 7, "type": "", "position": 0 } ] }

esse "token" deveria vim com os valores escola, escolas e escolar? Ou esse teste deveria ser realizado de outra forma?

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/radar-parlamentar/radar/issues/449#issuecomment-380936861, or mute the thread https://github.com/notifications/unsubscribe-auth/AAZo5qupgmFY0heIYopbK6Nfe9NQKOQ5ks5tn7sggaJpZM4S6Sxm .

leonardofl commented 6 years ago

Observem no docker compose a versão q estamos usando do ES. Estamos usando uma versão velha, pq versões mais novas exigem um comando bem intrusivo* no SO do hospedeiro do container!