crawlers-noticias

Código-fonte de crawlers de notícias

Stars
5
Committers
2

Crawlers de Notcias

Este projeto possui dois scripts Python principais. Um para indexar notcias, e outro para buscar e gerar um banco de dados com notcias que possuem termos iguais.

A entrada de dados so arquivos JSON, gerados por crawlers. Nos arquivos h um array com hashes contendo data, url, ttulo, e o cdigo do jornal (sbt para jornal do sbt, jn para jornal nacional, etc.).

Requisitos

python -m venv venv
source venv/bin/activate
(venv) export JCC_JDK=/usr/lib/jvm/java-8-oracle
(venv) svn co https://svn.apache.org/repos/asf/lucene/pylucene/trunk/jcc jcc
(venv) cd jcc
(venv) python setup.py build
(venv) python setup.py install
(venv) cd ../
(venv) pip install -U pip
(venv) pip install -r requirements.txt

Indexao

index.sh

Durante a indexao dos documentos, o script index.sh cria um StandarAnalyzer do Lucene. Este tipo de Analyzer indexa tudo em minsculas, quebrando em tokens usando o StandardTokenizer, e quando uma lista de stop-words informada, ele tambm filtra por estas.

O script de indexao busca um arquivo chamado stopwords.txt no mesmo diretrio de execuo para carregar em um Set todas as stop-words.

Comparao

relationships.sh

No script de comparao, relationships.sh busca noticias em jornais diferentes para a mesma data, gerando uma nova lista que e depois persistida em banco de dados.

Visualizao

possvel realizar queries no Neo4J para visualizar resultados no formato de grafos. H tambm uma ferramenta web, que sumariza e pagina os dados. Primeiro voce precisar carregar os dados gerados pelo script relationships.sh no banco Neo4J, como indicado na prxima seo.

Por fim, inicializando a aplicao web, ela se conectar por padro no servidor Neo4J rodando localmente, e poder ser visualizada em http://localhost:3000.

Reproduzindo os resultados

Caso voc j tenha carregado dados na base, ser necessrio limpar o contedo do banco de dados primeiro.

MATCH (n)
OPTIONAL MATCH (n)-[r]-()
DELETE n,r

O script index.sh produz um arquivo CSV all.csv, que possui o grafo com ns e atributos. necessrio tambm criar um ndice na URL, caso contrrio as queries demoraro vrios minutos.

(Primeiro, remova a configurao do Neo4j que impede o carregamento de CSVs de qualquer diretrio)

LOAD CSV FROM 'file:///$PATH_TO_PROJECT/all.csv' AS line 
CREATE(:News { journal: line[0], date: line[1], url: line[2], title: line[3]})

CREATE INDEX ON :News(url)

Uma vez carregados, podemos criar os vrtices do grafo. Os vrtices estaro no arquivo relationships.csv, que criado quando executamos o script relationships.sh.

LOAD CSV FROM 'file:///$PATH_TO_PROJECT/relationships.csv' AS line 
MATCH (n1:News) 
WHERE n1.url = line[0] // left 
MATCH (n2:News) 
WHERE n2.url = line[2] // right
MERGE (n1)-[r1:HAS_SAME_TOKEN {token: line[1]}]-(n2) 

Uma vez carregados os vrtices, as seguintes queries servem para verificar o contedo no grafo.

# todas as noticias com tokens em comum
MATCH (n1:News)-[r1:HAS_SAME_TOKEN]->(n2:News) RETURN r1 
# Todas as noticias com tokens em comum, onde um dos jornais e o SBT
MATCH (n1:News)-[r1:HAS_SAME_TOKEN]-(n2:News) WHERE n1.journal = 'sbt' RETURN n1.url, n1.title, r1.token, n2.url, n2.title
# Todas as noticias com tokens em comum, onde um dos jornais e o JN
MATCH (n1:News)-[r1:HAS_SAME_TOKEN]-(n2:News) WHERE n1.journal = 'jn' RETURN n1.url, n1.title, r1.token, n2.url, n2.title