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