User Tools

Site Tools


auto.bat

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
auto.bat [04/05/2009 00:00]
auto.bat [04/05/2009 20:21]
fernando
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 desarrollo}}
auto.bat.txt · Last modified: 04/05/2009 00:00 (external edit)