Science Score: 44.0%

This score indicates how likely this project is to be science-related based on various indicators:

  • CITATION.cff file
    Found CITATION.cff file
  • codemeta.json file
    Found codemeta.json file
  • .zenodo.json file
    Found .zenodo.json file
  • DOI references
  • Academic publication links
  • Academic email domains
  • Institutional organization owner
  • JOSS paper metadata
  • Scientific vocabulary similarity
    Low similarity (3.6%) to scientific vocabulary
Last synced: 10 months ago · JSON representation ·

Repository

Basic Info
  • Host: GitHub
  • Owner: BSBContreras
  • Language: Python
  • Default Branch: master
  • Size: 32.2 KB
Statistics
  • Stars: 0
  • Watchers: 1
  • Forks: 1
  • Open Issues: 0
  • Releases: 0
Created almost 2 years ago · Last pushed about 1 year ago
Metadata Files
Readme Citation

README.md

OpenAlex CSV Data Collector - Author & Citation Based

Este projeto contém dois métodos de coleta de dados: um baseado em autores e outro baseado em citações. Ele permite coletar registros de dados da api do openalex (https://api.openalex.org), salvando os resultados em checkpoints para facilitar a retomada da coleta em caso de interrupções.

Como funciona

O projeto possui dois scripts principais:

  • AuthorBasedCollector.py: Coleta de dados baseada em autores.
  • CitationBasedCollector.py: Coleta de dados baseada em citações.

Durante a execução, o sistema coleta e armazena sete principais tipos de informações, que são salvas em arquivos CSV dentro de uma pasta especificada (citations_based_database ou author_based_database):

  1. Trabalhos: Salvos no arquivo openalex_works.csv.
  2. Autores: Salvos no arquivo openalex_authors.csv.
  3. Citações: Salvas no arquivo openalex_citations.csv.
  4. Trabalhos relacionados: Salvos no arquivo openalex_related_works.csv.
  5. Conceitos: Salvos no arquivo openalex_concepts.csv.
  6. Tópicos: Salvos no arquivo openalex_topics.csv.
  7. Palavras-chave: Salvas no arquivo openalex_keywords.csv.

Você pode escolher qual script executar passando o método desejado pela linha de comando, juntamente com os parâmetros de configuração, como limite de registros, tamanho de checkpoint e um ID OpenAlex de trabalho inicial.

Parâmetros

Os seguintes parâmetros podem ser passados para ajustar a coleta:

  • method: Escolhe o método de coleta (author para coleta baseada em autor, citation para coleta baseada em citação).
  • --record_limit: Limite de registros a serem coletados (padrão: 100000).
  • --checkpoint_size: Tamanho do checkpoint para salvar progresso (padrão: 500).
  • --initial_work_id: ID do trabalho inicial para começar a coleta (padrão: W4398186459).

Instalação

  1. Certifique-se de ter o Python 3.8 ou superior instalado em sua máquina.
  2. Clone este repositório ou baixe os arquivos.
  3. (Opcional) Crie um ambiente virtual para isolar as dependências:

    bash python -m venv venv source venv/bin/activate # Linux/Mac venv\Scripts\activate # Windows

  4. Instale as dependências listadas no arquivo requirements.txt:

    bash pip install -r requirements.txt

Executando o código

Você pode executar o código a partir da linha de comando, especificando o método de coleta e os parâmetros desejados.

Exemplo de uso - Coleta baseada em autores:

bash python main.py author --record_limit 50000 --checkpoint_size 1000 --initial_work_id "W4398186459"

Exemplo de uso - Coleta baseada em citações:

bash python main.py citation --record_limit 75000 --checkpoint_size 250 nitial_work_id "W4398186459"

Parâmetros opcionais:

  • record_limit: Define o limite de registros a serem coletados. Se omitido, o padrão é 100000.
  • checkpoint_size: Define o tamanho do checkpoint, que determina quantos registros são processados antes de salvar o progresso. Se omitido, o padrão é 500.
  • initial_work_id: Define o ID do trabalho inicial para iniciar a coleta. Se omitido, o padrão é "W4398186459".

Contribuindo

Se você encontrar problemas ou tiver sugestões de melhorias, sinta-se à vontade para abrir uma issue ou enviar um pull request.

Owner

  • Name: Bruno Contreras
  • Login: BSBContreras
  • Kind: user

Citation (CitationBasedCollector.py)

import os

import requests
import time
from collections import deque
from tqdm import tqdm
import datetime

from OpenalexCheckpoints import load_checkpoint, save_checkpoint_citations_based
from OpenalexUtils import get_data_from_openalex, batch_size, sleep_time
from OpenalexWriter import write_works_to_csv, write_citations_to_csv, \
    write_related_works_to_csv, write_authors_to_csv, write_concepts_to_csv, \
    write_topics_to_csv, write_keywords_to_csv, generate_progress_report


def main(record_limit, checkpoint_size, initial_work_id):
    print(f"Record limit: {record_limit}")
    print(f"Checkpoint size: {checkpoint_size}")
    print(f"Initial work ID: {initial_work_id}")
    
    csv_base_folder = f'{initial_work_id}_citations_based_database'

    if not os.path.exists(csv_base_folder):
        os.makedirs(csv_base_folder)

    csv_works_filename = f'{csv_base_folder}/openalex_works.csv'
    csv_authors_filename = f'{csv_base_folder}/openalex_authors.csv'
    csv_citations_filename = f'{csv_base_folder}/openalex_citations.csv'
    csv_related_works_filename = f'{csv_base_folder}/openalex_related_works.csv'
    csv_concepts_filename = f'{csv_base_folder}/openalex_concepts.csv'
    csv_topics_filename = f'{csv_base_folder}/openalex_topics.csv'
    csv_keywords_filename = f'{csv_base_folder}/openalex_keywords.csv'

    progress_report_file = f'{csv_base_folder}/openalex_progress_report.csv'
    checkpoint_file = f'{csv_base_folder}/openalex_checkpoint.pkl'

    # Carrega o estado salvo, se existir
    checkpoint = load_checkpoint(checkpoint_file)
    if checkpoint:
        queue = deque(checkpoint['queue'])
        work_visited = set(checkpoint['visited'])
        works_count = checkpoint['count']
        authors_count = checkpoint['authors_count']
        citations_count = checkpoint['citations_count']
        related_works_count = checkpoint['related_works_count']
        concepts_count = checkpoint['concepts_count']
        topics_count = checkpoint['topics_count']
        keywords_count = checkpoint['keywords_count']
    else:
        queue = deque([initial_work_id])
        work_visited = set()
        works_count = 0
        authors_count = 0
        citations_count = 0
        related_works_count = 0
        concepts_count = 0
        topics_count = 0
        keywords_count = 0

    # Início da coleta
    start_time = datetime.datetime.now()

    # Coleta os dados
    with tqdm(total=record_limit, desc="Collecting data") as pbar:
        pbar.update(works_count)
        while queue and works_count < record_limit:
            batch_ids = []
            while queue and len(batch_ids) < batch_size:
                current_work_id = queue.popleft()
                if current_work_id not in work_visited:
                    batch_ids.append(current_work_id)

            if not batch_ids:
                continue

            try:
                data = get_data_from_openalex(batch_ids)
            except requests.exceptions.RequestException as e:
                print(f"Failed to retrieve data for batch {batch_ids}: {e}")
                continue

            works = data['results']
            write_works_to_csv(csv_works_filename, works, mode='a')
            write_authors_to_csv(csv_authors_filename, works, mode='a')
            write_citations_to_csv(csv_citations_filename, works, mode='a')
            write_related_works_to_csv(csv_related_works_filename, works, mode='a')
            write_concepts_to_csv(csv_concepts_filename, works, mode='a')
            write_topics_to_csv(csv_topics_filename, works, mode='a')
            write_keywords_to_csv(csv_keywords_filename, works, mode='a')

            for work in works:
                work_visited.add(work['id'])
                works_count += 1
                authors_count += len(work.get('authorships', []))
                citations_count += len(work.get('referenced_works', []))
                related_works_count += len(work.get('related_works', []))
                concepts_count += len(work.get('concepts', []))
                topics_count += len(work.get('topics', []))
                keywords_count += len(work.get('keywords', []))

                for cited_work_id in work.get('referenced_works', []):
                    if cited_work_id not in work_visited:
                        queue.append(cited_work_id)

            # Atualiza o progresso
            pbar.update(len(works))

            # Salva o checkpoint
            if works_count // checkpoint_size > (works_count - len(works)) // checkpoint_size:
                save_checkpoint_citations_based(
                    list(queue),
                    list(work_visited),
                    works_count,
                    authors_count,
                    citations_count,
                    related_works_count,
                    concepts_count,
                    topics_count,
                    keywords_count,
                    checkpoint_file
                )
                generate_progress_report(
                    start_time,
                    works_count,
                    authors_count,
                    citations_count,
                    related_works_count,
                    concepts_count,
                    topics_count,
                    keywords_count,
                    progress_report_file
                )

            # Espera entre as requisições para não sobrecarregar a API
            time.sleep(sleep_time)

    # Salva o checkpoint final
    save_checkpoint_citations_based(
        list(queue),
        list(work_visited),
        works_count,
        authors_count,
        citations_count,
        related_works_count,
        concepts_count,
        topics_count,
        keywords_count,
        checkpoint_file
    )
    print(f"Data collection complete: {works_count} records collected.")
    generate_progress_report(
        start_time,
        works_count,
        authors_count,
        citations_count,
        related_works_count,
        concepts_count,
        topics_count,
        keywords_count,
        progress_report_file
    )
    print("Progress report generated.")

GitHub Events

Total
  • Push event: 3
  • Fork event: 1
Last Year
  • Push event: 3
  • Fork event: 1