Creación de una base de pseudo-autoridades a partir de una base bibliográfica existente

Estos son los archivos que generamos en Tandil en 2005.

auto.bat

:: =============================================================================== :: Creación de una base de pseudo-autoridades a partir de una base bibliográfica :: existente. :: :: Genera, además, un listado de headings posiblemente duplicados. :: :: La base bibliográfica debe estar en "formato Catalis", en particular, debe :: usar '#' en lugar de 'blank' para los indicadores. Véase :: http://catalis.uns.edu.ar/wiki/index.php/Estructura_de_las_bases_bibliogr%C3%A1ficas :: :: Problema pendiente: estos headings deberían unificarse (^x -> ^v) :: 150 «#0^aAdventure stories, American^xHistory and criticism^vJuvenile literature.» :: 150 «#0^aAdventure stories, American^xHistory and criticism^xJuvenile literature.» :: Véase http://www.slc.bc.ca/cheats/formv.htm :: :: Permitir que el usuario seleccione el tipo de headings que *no* desea enviar :: a la base de autoridades (name, subject, title). :: :: ¿Y qué hacemos con el 240? :: :: Generar un listado de posibles duplicados, en base a la distancia de Levenshtein :: entre registros adyacentes (p.ej. usando levenshtein() de PHP :: :: @param %1 base bibliográfica de origen, p.ej. bases\demo\biblio :: :: (c) Gómez Mansilla Piriz 2005 :: =============================================================================== @echo off :: Lista de tags de los cuales vamos a extraer los encabezamientos set MAIN_ENTRY=v100~v110~v111~v130 :: 100, 110 y 111 pueden estar asoc. a un 240 set ADDED_ENTRY=v700~v710~v711~v730 :: 700, 710 y 711 pueden tener $t set SERIES=v440~v800~v810~v811~v830 :: 800, 810 y 811 siempre tienen $t set SUBJECT1=v600~v610~v611~v630 :: 600, 610 y 611 pueden tener $t set SUBJECT2=v650~v651~v655~v656 set CONTROLLED_TAGS=%MAIN_ENTRY%~%ADDED_ENTRY%~%SERIES%~%SUBJECT1% :: si está presente el campo 240, creamos un campo auxiliar 1xx + $t (nombre/título) ::mx %1 proc=@v240.pft create=biblio-240 now -all :: cada campo de la base bibliográfica pasa a ser un registro de la base biblio-campos i2id %1 >biblio.id mx seq=biblio.id lw=8000 create=biblio-campos now -all :: eliminamos espacios en blanco en los extremos (¿a qué se deben esos espacios?) echo Eliminando espacios en blanco... mxcp biblio-campos create=biblio-campos-clean clean >nul :: extraemos los campos controlados, y creamos una base con ellos :: ATENCION: para filtrar subcampos $e, $4, $5, podemos usar algo como name.pft del OPAC. echo Extrayendo campos controlados... mx biblio-campos-clean lw=1000 pft=@extract-headings.pft now >auto-dup.seq mx seq=auto-dup.seq create=auto-dup now -all :: ordenamos la lista de headings (comparando en mayúsculas) :: ATENCION: hay que usar la tabla de mayúsculas ANSI-UC.tab echo Ordenando lista de headings... msrt auto-dup 1000 mhu,v1*4 :: Eliminamos headings duplicados (ignoramos indicadores al comparar) echo Eliminando headings duplicados... mx auto-dup lw=1000 "pft=if v1*2 <> ref(mfn-1,v1*2) then v1,'|',v2,'|',v3/ fi" now >auto-uniq.seq mx seq=auto-uniq.seq lw=1000 create=auto-uniq now -all :: asignamos tag correcto a cada registro de auto-uniq echo Reasignando tags a los registros de autoridades... mx auto-uniq "proc='d1d2d3', 'a1|',v2,'|', 'a1',if v3='440' then '30' else v3*1, fi,'|', v1, '|'" create=auto now -all :: colocamos un blanco en el segundo indicador (no definido) en los headings 100, 110, 111 echo Corrigiendo segundo indicador en campos 100, 110, 111... mx auto "proc=if p(v100) then 'd100', 'a100|',v100.1,'#',v100*2,'|', fi" copy=auto now -all mx auto "proc=if p(v110) then 'd110', 'a110|',v110.1,'#',v110*2,'|', fi" copy=auto now -all mx auto "proc=if p(v111) then 'd111', 'a111|',v111.1,'#',v111*2,'|', fi" copy=auto now -all :: agregamos campos a la base de autoridades: leader, 005, 008 :: LDR: 05='n', 06='z', 09='#', 17='o' echo Agregando datos del leader... mx auto "proc='a905~n~a906~z~a909~#~a917~o~'" copy=auto now -all echo Agregando campo 005... mx auto "proc='a005~',s(date).8,s(date)*9.6,'.0','~'" copy=auto now -all :: 008/10: Descriptive cataloging rules echo Agregando campo 008... mx auto "proc='a008~',s(date)*2.6,'|||ac|||aaan','##########','|n#|||####||','~'" copy=auto now -all :: agregamos un campo 999 donde se almacenará el ID del eventual registro target mx auto "proc='d999a999~0~'" copy=auto now -all :: PRUEBA: generar registros inactivos en la base auto a partir del 2do registro :: Todos los registros de la base auto son alias del primero. ::mx auto from=2 "proc='d999a999@001766@'" copy=auto now -all :: diccionario base de autoridades echo Generando diccionario para la base de autoridades... mx auto fst=@auto.fst fullinv=auto :: Generamos una lista de posibles duplicados (requiere PHP en el PATH) echo Generando lista de posibles duplicados... mx auto lw=1000 "pft=v100/v110/v111/v130/v150/v151/v155/" now >auto-lista.txt php compara-lev.php auto-lista.txt 2 >auto-posibles-duplicados.txt echo. echo ----------------------- echo LINKS entre BIB y AUTO echo ----------------------- :: Construimos tabla de mapeo de punteros a la base bibliográfica echo Construyendo tabla para mapear punteros... mx auto-dup "pft=if v1*2 <> ref(mfn-1,v1*2) then putenv('PTR=',v2) fi, v2,'|',getenv('PTR')/" now -all >map.seq mx seq=map.seq create=map now -all :: diccionario para map mx map "fst=1 0 v1/" fullinv=map :: creamos un subcampo $9 en cada punto de acceso echo Creando subcampos $9... mx biblio-campos-clean proc=@create-subfield-9.pft create=biblio-campos-ref1 now -all :: consultamos la base map para re-asignar punteros en la base bibliográfica echo Reasignando subcampos $9... mx biblio-campos-ref1 proc=@recode.pft create=biblio-campos-ref2 now -all :: regeneramos la base bibliográfica echo Regenerando la base bibliográfica... mx biblio-campos-ref2 lw=8000 "pft=v1/" now -all >biblio-campos-ref2.id id2i biblio-campos-ref2.id create=biblio

Archivos auxiliares

v240.pft

if p(v240) then
proc(
'd1000a1000#',
"100"d100,
"110"d110,
"111"d111,
'#',
)
'a',v1000,'|',
v100,v110,v111,
'^t',v240*2,
'|'
fi

extract-headings.pft

/* en el caso de nombres seguidos de $t, tenemos que extraer también el nombre aislado,
pero... ¿a qué registro queda vinculado?
Se puede hacer sobre la base de autoridades, una vez que se han eliminado los
duplicados, pero antes del retag
mx auto "pft=if p(v1^t) then left(v1,instr(v1,'^t')-1)/ fi" now >names-without-titles.seq
Algunos de los nombres obtenidos por este método pueden ya estar presentes en la base
de autoridades,
en cuyo caso no necesitamos agregarlos. Para los restantes, conservamos el nombre,
junto con el tag original; tales registros quedarán como semi-huérfanos, en el sentido
de que no hay registros bibliográficos apuntando hacia ellos (sólo están vinculados,
aunque no explícitamente por el momento, a registros de autoridad de nombre/título).
*/
/*
TO-DO: excluir $v en series, $x, $v, $y, $z en subject headings
TO-DO: limpiar puntuación final, especialmente si hay una coma final
debida a la presencia de un subcampo $e. Los headings se almacenan
*sin* puntuación final, ¿cómo la quitamos?
*/
if getenv('CONTROLLED_TAGS') : v1*1.4 then
v1*6.2, /* ind1, ind2 */
proc('d1000a1000|', replace(v1*9,'^','|a1000|'), '|'), /* split en subcampos */
(
if not 'e4568' : v1000.1 then '^',v1000, fi /* excluimos subcampos e,4,5,6,8 */
)
'|',mfn, /* mfn en la base biblio-campos; actúa como ID del heading */
'|',v1*2.3, /* tag del heading */
/, /* newline */
fi

auto.fst

001 0 '-CN=',v1
100 4 v100^a
110 4 v110^a
111 4 v111^a
999 0 if v999<>'0' then 'TARGET='v999, fi

create-subfield-9.pft

/* Creación de un subcampo $9 en los campos controlados */
if getenv('CONTROLLED_TAGS') : v1*1.4 then
'd1a1|',
v1.8, /* hasta los indicadores */
proc('d1000a1000|', replace(v1*9,'^','|a1000|'), '|'), /* split en subcampos */
(
if 'e4568' : v1000.1 then '^',v1000, fi /* preservamos subcampos e,4,5,6,8 */
)
proc('d1000'),
'^9',mfn,
'|',
fi

recode.pft

if getenv('CONTROLLED_TAGS') : v1*1.4 then
'd1a1~',
replace(
v1,
s('^9',v1^9),
s('^9',ref(['map']l(['map']mfn),v2))
),
'~',
fi