Tabla de Contenidos
Notas sobre la implementación de un OPAC estilo FRBR-Yee (agosto 2005)
INDIZACION - BASE BIBLIOGRÁFICA
En la base bibliográfica, los headings (para nombre, para título, y para nombre/título) se indizan en forma completa, aplicando p.ej. alguna normalización al estilo NACO, véase http://www.loc.gov/catdir/pcc/naco/normrule.html http://www.loc.gov/catdir/pcc/naco/normrule-2.html (prefijos: ah=author heading, wh=work heading)
100 __ $aTwain, Mark, $d1835-1910. => "ah=twain mark 1835 1910" 700 __ $aTwain, Mark, $d1835-1910. $tAdventures of Tom Sawyer. => "wh=twain, mark\1835 1910\adventures of tom sawyer" 600 __ $aTwain, Mark, $d1835-1910. $tAdventures of Tom Sawyer. => "wh=twain, mark\1835 1910\adventures of tom sawyer"
Headings virtuales (combinación de dos campos):
100 __ $aTwain, Mark, $d1835-1910. 240 __ $aAdventures of Tom Sawyer. $lSpanish => "wh=twain, mark\1835 1910\adventures of tom sawyer"
100 __ $aTwain, Mark, $d1835-1910. 245 14 $aThe adventures of Tom Sawyer / $c ... => "wh=twain, mark\1835 1910\adventures of tom sawyer"
Los títulos no controlados se indizan por palabra (prefijo: tw=title word):
245 03 $aRevista de la Unión Matemática Argentina / $c ... => "tw=revista", "tw=de", "tw=la", "tw=union", "tw=matematica", "tw=argentina" 246 __ $aRevista de la UMA => "tw=revista", "tw=de", "tw=la", "tw=uma" 740 __ $aMastropiero que nunca => "tw=mastropiero", "tw=que", "tw=nunca"
El 245 queda, por ahora, en una situación dudosa…
INDIZACION - BASE DE AUTORIDADES
En la base de autoridades, los headings para nombres (sin $t) se indizan por palabras (prefijo: aw=author word):
100 __ $aTwain, Mark, $d1835-1910. => "aw=twain", "aw=mark", "aw=1835", "aw=1910" 400 __ $aClemens, Samuel, $d1835-1910. => "aw=clemens", "aw=samuel", "aw=1835", "aw=1910"
Esto permite chequear las palabras usadas en la búsqueda contra todas las variantes de cada nombre.
Pero en un heading de nombre/título, indizamos el nombre en forma completa, y el título por palabras (¿podemos hacer esto, preservando además la información sobre pertenencia a un mismo campo? Creo que sí, con un truco: dentro del nombre reemplazamos los espacios por un carácter al que definimos como alfabético, e.g. “_”, y usamos simplemente una indización por palabras):
100 __ $aTwain, Mark, $d1835-1910. $tAdventures of Tom Sawyer. => "ah=twain,_mark\1835_1910", "tw=adventures", "tw=of", "tw=tom", "tw=sawyer"
En este tipo de headings la parte del nombre siempre está en forma autorizada, y nos interesa detectar su coincidencia con un heading procedente de un registro de autoridad para nombres. Ejemplo: a partir de los términos “samuel clemens” para autor encontramos “twain, mark\1835 1910”, y luego con este nuevo término más los términos de título “tom sawyer” encontramos “twain, mark\1835 1910\adventures of tom sawyer”. A continuación, podemos usar ese heading de la base de autoridades para obtener los registros bibliográficos asociados (vía 700, 600, 100+240, 100+245).
La idea es que indizamos por palabras porque el usuario del OPAC ingresará palabras y necesitamos poder buscar coincidencias a ese nivel, pero ni bien detectamos headings que coincidan con esas palabras, los usamos a ellos para acceder a nuevos registros (de autoridades o bibliográficos) que resulten relevantes. Para el título, siempre deberemos hacer una búsqueda por palabras dentro de la base bibliográfica, ya que allí tenemos títulos no controlados; para autores, debería bastar con los headings obtenidos de la base de autoridades (excepto por cosas como un 505$r).
ORGANIZACION DE RESULTADOS
Encontrar los registros relevantes es la primera parte de la tarea. La segunda parte consiste en organizarlos. Para esto, necesitamos saber por qué fue recuperado cada registro, es decir, qué papel juega el work-identifier de interés dentro de cada registro bibliográfico:
6xx -> work is about searched work 7xx # -> work is related to searched work 7xx 2 -> work includes searched work 1xx-240 -> expression/manifestation of searched work 1xx-245 -> expression/manifestation of searched work
Esto podemos averiguarlo de dos maneras: (a) al momento de las búsquedas, podemos hacerlas en forma discriminada (lo cual requiere múltiples búsquedas, y una indización de mayor especificidad); (b) una vez recuperados los registros en forma indiscriminada, podemos examinarlos uno por uno en busca de esta información. En cualquiera de los casos, debemos tener en cuenta la posibilidad de que un registro caiga en más de una categoría.
Una posible manera de implementar la opción (b): loop sobre los registros bibliográficos recuperados; para cada registro, generar todos sus work-id asociados y asignarle a cada uno su tipo; si alguno de estos work-id coincide con el work-id de interés, el registro se marca con el tipo del work-id exitoso; si ningún work-id de este registro coincide, entonces hay un problema con el registro. Esta solución tiene un costo que crece linealmente con el número de registros recuperados. Por otra parte, la solución (a) requiere siempre un número fijo de búsquedas (cuatro?), y el hecho de tener que realizar una indización más específica puede ser beneficioso para otros fines.
UN EJEMPLO, PASO A PASO
Ingredientes:
- Registros MARC de LC:
- registro de autoridad para Mark Twain
- registro de autoridad para Adventures of Tom Sawyer, de Mark Twain
- registros bibliográficos asociados a Tom Sawyer de Mark Twain
- Bases ISIS/Malete:
- base de autoridades, con su FST
100 8 if a(v100^t) then 'aw=' v100^a,x1,v100^b,x1,v100^c,x1,v100^q,x1,v100^d, fi 400 8 if a(v400^t) then 'aw=' (v400^a,x1,v400^b,x1,v400^c,x1,v400^q,x1,v400^d /), fi 500 8 if a(v500^t) then 'aw=' (v500^a,x1,v500^b,x1,v500^c,x1,v500^q,x1,v500^d /), fi 100 8 if p(v100^t) then replace(s(v100^a,v100^b,v100^c,v100^q,v100^d),' ','_'),x1,v100^t,x1,v100^n,x1,v100^p, fi 400 8 ( if p(v400^t) then replace(s(v400^a,v400^b,v400^c,v400^q,v400^d),' ','_'),x1,v400^t,x1,v400^n,x1,v400^p, fi /) 500 8 ( if p(v500^t) then replace(s(v500^a,v500^b,v500^c,v500^q,v500^d),' ','_'),x1,v500^t,x1,v500^n,x1,v500^p, fi /)
- base bibliográfica, con su FST
100 0 replace(s(v100^a,v100^b,v100^c,v100^q,v100^d),' ','_') 240 0 if p(v240) then replace(s(v100^a,v100^b,v100^c,v100^q,v100^d),' ','_'),'/',v240^a, fi 245 0 if a(v240) then replace(s(v100^a,v100^b,v100^c,v100^q,v100^d),' ','_'),'/',v245^a, fi 600 0 ( if p(v600^t) then replace(s(v600^a,v600^b,v600^c,v600^q,v600^d),' ','_'),'/',v600^t, fi /) 700 0 ( if p(v700^t) then replace(s(v700^a,v700^b,v700^c,v700^q,v700^d),' ','_'),'/',v700^t, fi /)
- Formulario HTML para ingresar términos de búsqueda
<form id="" action="opac.php" method="get"> <b>Búsqueda de una obra conocida</b> <br> Autor: <input type="text" name="" id="" size="20"> <br> Título: <input type="text" name="" id="" size="20"> <br> <input type="submit" name="" value="Buscar"> </form>
- Script PHP.
opacs desarrollo frbr yee