User Tools

Site Tools


auto.bat

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

Estos son los archivos generados en Tandil en 2005. Para una versión actual, ver http://code.google.com/p/opacmarc

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
auto.bat.txt · Last modified: 04/05/2009 00:00 (external edit)