This shows you the differences between two versions of the page.
Both sides previous revision Previous revision | |||
auto.bat [30/04/2009 16:21] fernando |
auto.bat [04/05/2009 00:00] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Creación de una base de pseudo-autoridades a partir de una base bibliográfica ====== | ||
- | <note> | ||
- | Estos son los archivos generados en Tandil en 2005. Para una versión actual, ver http://code.google.com/p/opacmarc | ||
- | </note> | ||
- | |||
- | ==== auto.bat ==== | ||
- | |||
- | <code dos> | ||
- | :: =============================================================================== | ||
- | :: 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 | ||
- | </code> | ||
- | |||
- | |||
- | ===== Archivos auxiliares ===== | ||
- | |||
- | ==== v240.pft ==== | ||
- | |||
- | <code> | ||
- | if p(v240) then | ||
- | proc( | ||
- | 'd1000a1000#', | ||
- | "100"d100, | ||
- | "110"d110, | ||
- | "111"d111, | ||
- | '#', | ||
- | ) | ||
- | |||
- | 'a',v1000,'|', | ||
- | v100,v110,v111, | ||
- | '^t',v240*2, | ||
- | '|' | ||
- | fi | ||
- | </code> | ||
- | |||
- | ==== extract-headings.pft ==== | ||
- | |||
- | <code> | ||
- | /* 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 | ||
- | </code> | ||
- | |||
- | ==== auto.fst ==== | ||
- | |||
- | <code> | ||
- | 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 | ||
- | </code> | ||
- | |||
- | ==== create-subfield-9.pft ==== | ||
- | |||
- | <code> | ||
- | /* 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 | ||
- | </code> | ||
- | |||
- | |||
- | ==== recode.pft ==== | ||
- | |||
- | <code> | ||
- | if getenv('CONTROLLED_TAGS') : v1*1.4 then | ||
- | 'd1a1~', | ||
- | replace( | ||
- | v1, | ||
- | s('^9',v1^9), | ||
- | s('^9',ref(['map']l(['map']mfn),v2)) | ||
- | ), | ||
- | '~', | ||
- | fi | ||
- | </code> | ||
- | |||
- | |||
- | {{tag>autoridades}} |