Para la extracción de textos Médicos de Wikipedia se utilizaron los pasos del siguiente repositorio: https://github.com/umcu/dutch-medical-wikipedia.
Se ejecutaron los scripts en la carpeta limpieza para los diferentes corpus.
Para la deduplicación se ha utilizado Dolma. Dolma está preparado principalmente para dos tipos de deduplicación: URLs y texto plano. En este caso se va a utilizar para texto plano. Link: https://github.com/allenai/dolma/blob/main/docs/deduplication.md
La deduplicación consta de dos partes, una en la que se identifican los elementos duplicados dolma dedupe y otra en la que, teniendo en cuenta cuales son (recogidos en los atributos) procede a borrar lo que se le pide, es decir los textos duplicados. A este se le llama dolma mix.
Esto lo hace mediante un Bloom filter y hash-eando los documentos, de forma que el espacio que ocupa en memoria se minimiza considerablemente (a diferencia de con PySpark).
Para utilizar esta librería hay que hacer lo siguiente, siguiendo el repositorio que aparece en el link de más arriba.
Se necesita un entorno virtual con Python que tenga dolma incluido (utiliza rust por detrás).
Los datos de inicio deben estar en formato jsonl.gz. Dentro de ese jsonl, por cada línea debe haber un json con al menos el parámetro 'text' o 'url' (en nuestro caso 'text'). También puede tener otros parámetros aunque no se tengan en cuenta en el deduplicado. Por ejemplo:
{"text":"In addition to routine clinical laboratory tests (including natriuretic peptides and cardiac troponins), other biomarkers are gaining attention for their...", "dataset": "PUBMED", "language": "en"}
{"text":"An Improved Flow Cytometric...", "dataset": "PUBMED", "language": "en"}
{"text":"Image Analysis for the Quantitative...", "dataset": "PUBMED", "language": "en"}Además, se necesitan dos ficheros de configuración para cada proceso: dedup.yaml y mix.yaml respectivamente.
DEDUP.YAML:
documents:
- /paths/a/cada/uno/de/los/1.jsonl.gz
- /paths/a/cada/uno/de/los/2.jsonl.gz
- /paths/a/cada/uno/de/los/3.jsonl.gz
work_dir:
input: /path/a/la/carpeta/tmp/input
output: /path/a/la/carpeta/tmp/output
dedupe:
name: bff_duplicate_text
documents:
attribute_name: bff_duplicate_text
key: $.text # La clave del JSON que se va a tener en cuenta para deduplicar
bloom_filter:
file: /path/al/fichero/del/filtro/bff_duplicate_text.bin
read_only: false
estimated_doc_count: 3877787 # Número de documentos que se esperan mantener
desired_false_positive_rate: 0.0001
processes: 1 # Procesos en paralelo, se mantiene así para darle prioridad a los documentos de arribaEn la primera parte del proceso se crea una carpeta 'attributes' con los documentos paralelos a los que se han especificado anteriormente. Una vez con esos documentos y mediante el mix.yaml se dice qué se quiere hacer con aquellos documetos identificados por el filtro. En este caso borrarlos:
MIX.YAML:
streams:
- name: dedup_text_iter_0
documents:
- /paths/a/cada/uno/de/los/que/se/quieran/mantener/de/los/jsonl.gz # Pueden ser los mismos que en el anterior o dejar solo los que se quieren mantener (una vez deduplicados)
output:
path: /path/a/la/carpeta/result
max_size_in_bytes: 1_000_000_000
attributes:
- bff_duplicate_text
filter:
exclude:
- "$@.attributes[?(@.bff_duplicate_text)]" # Eliminar documentos duplicados
processes: 16 # Procesos en paralelo