{"id":525,"date":"2012-06-02T10:18:19","date_gmt":"2012-06-02T10:18:19","guid":{"rendered":"http:\/\/www.arvo.es\/dspace\/?p=525"},"modified":"2012-07-19T17:01:10","modified_gmt":"2012-07-19T17:01:10","slug":"configurando-el-buscador-lucene-sobre-alfabetos-diacriticos-stemmers","status":"publish","type":"post","link":"https:\/\/www.arvo.es\/dspace\/configurando-el-buscador-lucene-sobre-alfabetos-diacriticos-stemmers\/","title":{"rendered":"Configurando el buscador Lucene, sobre alfabetos, diacr\u00edticos, stemmers &#8230;."},"content":{"rendered":"<p>A raiz de algunas preguntas que aparecieron \u00faltimamente en las listas de <a href=\"http:\/\/GUDE@LISTSERV.REDIRIS.ES\">GUDE <\/a>, sobre anomal\u00edas en los resultados de b\u00faquedas, me compromet\u00ed a escribir sobre el tema. No se si este post arrojar\u00e1 alguna luz o confundir\u00e1 a\u00fan m\u00e1s&#8230;espero que lo primero.<\/p>\n<p>Este post es aplicable a las configuraciones de buscador basadas en Lucene, no en SOLR, es decir, todas las 1.6 y anteriores  y las 1.7 y 1.8 que no usen la facilidad Discovery&#8230;<\/p>\n<p>Nuestro camino empieza a partir de la l\u00ednea en dspace.cfg:<\/p>\n<pre>search.analyzer = org.dspace.search.DSAnalyzer<\/pre>\n<p>es decir,  el analizador est\u00e1ndar de Dspace, que como bien nos recuerdan, <em>est\u00e1 dise\u00f1ado para textos en ingl\u00e9s<\/em>. Y este analizador tiene los siguientes filtros, aplicados en cascada:   <\/p>\n<ul>\n<li><strong>StandarFilter<\/strong>  -> labores preparatorias de conversi\u00f3n del texto en cadena de palabras para el resto de filtros<\/li>\n<li><strong>LowerCaseFilter<\/strong>&#8211;>  conversi\u00f3n a min\u00fasculas<\/li>\n<li><strong>StopFilter<\/strong> &#8211;>  Elimina las palabras gramaticales o \u00abvac\u00edas\u00bb , que no aportan gran significado a la b\u00fasqueda, como art\u00edculos, conjunciones, preposiciones, etc, a partir de una lista  de exclusi\u00f3n o \u00abstopword\u00bb. La lista original del filtro incorpora t\u00e9rminos ingleses<\/li>\n<li><strong>PorterStemFilter<\/strong>&#8211;> El algoritmo de Ra\u00edces de Porter (es lo que significa Porter Stem) retira sufijos y otras terminaciones morfol\u00f3gicas comunes de las palabras inglesas. Y desde luego con el espa\u00f1ol, catal\u00e1n, portugu\u00e9s, etc&#8230; no es donde ofrece sus mejores resultados&#8230;.<\/li>\n<\/ul>\n<blockquote><p><strong>Sobre PorterStemFilter:<\/strong> B\u00e1sicamente mejora las b\u00fasquedas en ingl\u00e9s, obteniendo la ra\u00edz de una mayor\u00eda de t\u00e9rminos. As\u00ed loving, loves, loved, lovable, .., se ven reducidas a lov-  y se mejora sustancialmente la b\u00fasqueda. De manera colateral, y por eso su uso pasa desapercibido a los hispanohablantes, es un stemmer v\u00e1lido para algunos plurales, pero no todos, del espa\u00f1ol, ya que recordemos que no est\u00e1 dise\u00f1ado para nuestro idioma.<\/p>\n<p>Para los curiosos, el filtro implementa un proceso definido en 1979 por Martin Porter, y que puede verse <a href=\"http:\/\/tartarus.org\/~martin\/PorterStemmer\">aqu\u00ed<\/a> .. Como dice Porter, y otros antes y despu\u00e9s, el algoritmo simplemente devuelve mejores resultados en las b\u00fasquedas automatizadas, <strong>en ingl\u00e9s<\/strong>. Mejores que si no se usa el filtro. Pero tiene, evidentemente, sus carencias y equivocaciones, ya identificadas por Porter. <\/p><\/blockquote>\n<p>Y de forma \u00abhist\u00f3rica\u00bb, como un conocimiento pasado de instalaci\u00f3n en instalaci\u00f3n, y que nosotros mismos hemos implentado, la mayor\u00eda de instalaciones con textos en espa\u00f1ol, portugu\u00e9s, franc\u00e9s&#8230; han a\u00f1adido, <strong>a continuaci\u00f3n en la cadena de transformaciones<\/strong>  un nuevo filtro: <\/p>\n<ul>\n<li><strong>ISOLatin1AccentFilter<\/strong>, que reemplaza los caracteres acentuados del juego de caracteres ISO Latin 1 (ISO-8859-1) por sus equivalentes sin acentuar, es decir reemplaza<em> \u00e1<\/em> por <em>a<\/em>. <\/li>\n<\/ul>\n<p>Con esta configuraci\u00f3n, y con este orden de transformaciones, entre otros efectos, las palabras terminadas en <em>es<\/em>, son consideradas plurales (en ingl\u00e9s, pero plurales) y reducidas a su ra\u00edz, singular, por el PorterStemFilter. Por contra, las palabras terminadas en <em>\u00e9s<\/em>, no son reducidas, pues para este Filtro, si terminas en <em>\u00e9s<\/em> no eres un plural. Los resultados de la b\u00fasqueda son as\u00ed dispares&#8230;y de ah\u00ed las preguntas en GUDE.<\/p>\n<blockquote><p><strong>Un poco de wikipedia:<\/strong> Un signo diacr\u00edtico es un signo gr\u00e1fico que confiere a los signos escritos, no necesariamente letra, un valor especial.<br \/>\nSon diacr\u00edticos, por ejemplo, los acentos ortogr\u00e1ficos ( \u00b4\u00a0; ` ), la di\u00e9resis ( \u00a8 ), los signos empleados en el alfabeto fon\u00e9tico, como la oclusi\u00f3n (^) o la nasalizaci\u00f3n ( ~ ), la tilde de la \u00f1 (virgulilla), la cedilla ( \u00b8 ) , la colita ( \u02db ), la coma ( , ), el doble acento agudo, ( \u02dd ), el car\u00f3n ( \u02c7 ), el breve ( \u02d8 ), el macr\u00f3n ( \u02c9 ), el anillo ( \u02da ), el punto ( . ), el acento circunflejo ( ^ ) y el garfio ( \u0309 ).<\/p><\/blockquote>\n<blockquote><p><strong>Otro poco de wikipedia<\/strong>:  ISO 8859-1 es la norma de la ISO que define la codificaci\u00f3n del alfabeto latino, incluyendo los diacr\u00edticos (como letras acentuadas, \u00f1, \u00e7), y letras especiales (como \u00df, \u00d8), necesarios para la escritura de las siguientes lenguas originarias de Europa occidental: afrik\u00e1ans, alem\u00e1n, <strong>aragon\u00e9s<\/strong>, <strong><a href=\"http:\/\/http:\/\/ast.wikipedia.org\/wiki\/Portada\">asturiano<\/a><\/strong>, <strong>castellano<\/strong>, <strong>catal\u00e1n<\/strong>, dan\u00e9s, escoc\u00e9s, <strong>espa\u00f1ol<\/strong>, fero\u00e9s, fin\u00e9s, franc\u00e9s, ga\u00e9lico, <strong>gallego<\/strong>, ingl\u00e9s, island\u00e9s, italiano, neerland\u00e9s, noruego, portugu\u00e9s, sueco y <strong>Euskera<\/strong>.<br \/>\nTambi\u00e9n conocida como Alfabeto Latino n.\u00ba 1 o ISO Lat\u00edn 1.<\/p><\/blockquote>\n<p>Dicho esto, se\u00f1alar que ISOLatin1AccentFilter ha sido retirado,  \u00abdeprecated\u00bb,  por Apache Lucene y ha sido sustituido por ASCIIFoldingFilter (hubo un ISOLatinACCENT por el intermedio..). Los detalles de la sustituci\u00f3n, <a href=\"https:\/\/issues.apache.org\/jira\/browse\/LUCENE-1390\">aqu\u00ed<\/a>.<\/p>\n<p>Esta clase mejora la ISOLatin1Accent, ya que \u00e9sta solo trataba el primer bloque de BASIC Latin, y lo ampl\u00eda  incluyendo (y filtrando a sus caracteres base) una larga lista de extensiones:   C1 Controls y Latin-1 Supplement, Latin Extended-A, Latin Extended-B, Phonetic Extensions, General Punctuation, Superscripts and Subscripts, etc&#8230;<\/p>\n<p>Y tambi\u00e9n se\u00f1alar que Lucene tiene un org.apache.lucene.analysis.es.SpanishAnalyzer, que puede ser declarado en dspace.cfg como sustituci\u00f3n a  org.dspace.search.DSAnalyzer. Las implicaciones de esta sustituci\u00f3n, es que en vez de usar la cadena  <em>StandarFilter  -> LowerCaseFilter&#8211;>  StopFilter &#8211;> PorterStemFilter&#8211;> ISOLatin1AccentFilter<\/em>, usa el filtro definido por <em>SpanishAnalyzer<\/em>, un <em>SpanishLightStemFilter<\/em>. Las malas noticias son que las pruebas que hemos realizado con este Stemmer son \u00bfdecepcionantes?, con un tratamiento desconcertante de las palabras agudas acentuadas terminadas en o, a y e  &#8230;os suena, \u00bfverdad?  No obstante, nos reservamos una segunda evaluaci\u00f3n m\u00e1s pausada sobre este filtro.<\/p>\n<p><strong>ya casi&#8230; Conclusiones o recomendaciones<\/strong><\/p>\n<ul>\n<li>Seguir adoptando y adaptando  <em>org.dspace.search.DSAnalyzer<\/em>, no cambiar a   <em>org.apache.lucene.analysis.es.SpanishAnalyzer<\/em>, en tanto Lucene no mejore el Stemmer de espa\u00f1ol incluido por defecto. <\/li>\n<li>Posiblemente cambiar ISOLatin1AccentFilter  por  ASCIIFoldingFilter. No mejorar\u00e1 radicalmente los resultados de ninguna b\u00fasqueda, pero si en el futuro se retira de las librer\u00edas Apache, el build no os dar\u00e1 problemas <\/li>\n<li>Dependiendo del idioma predominante en nuestro Repositorio, valorar quitar PorterStemFilter de la cadena del analizador. Si requer\u00eds un Stemmer, otra opci\u00f3n, que hemos probado y aparentemente no tiene los problemas reportados en las listas GUDE, aunque a lo  peor tiene otros efectos colaterales, es invertir el orden de los filtros PorterStem e ISOLatin1\/ASCIIFolding.<\/li>\n<\/ul>\n<p>con lo que <strong>org.dspace.search.DSAnalyzer<\/strong> nos podr\u00eda quedar as\u00ed:<\/p>\n<p>import org.apache.lucene.analysis.ASCIIFoldingFilter;<br \/>\n..<br \/>\n..<br \/>\n        result = new StandardFilter(result);<br \/>\n        result = new LowerCaseFilter(result);<br \/>\n        result = new StopFilter(result, stopSet);<br \/>\n        result = new ASCIIFoldingFilter(result);<br \/>\n        result = new PorterStemFilter(result);<\/p>\n<p><strong>Ya terminamos<\/strong><\/p>\n<p>Sobre todo, recordar los objetivos de un analizador: simplemente devolver mejores resultados en la mayor\u00eda de consultas. Es una transacci\u00f3n. Si dejamos pelada la cadena de an\u00e1lisis, los resultados ser\u00e1n extremadamente precisos, en el sentido de ofrecer solo resultados coincidentes con la cadena de b\u00fasqueda, pero no estaremos aprovechando las posibilidades de Lucene y nos habremos dejado en el camino un porcentaje amplio de resultados relevantes. Vuestra decisi\u00f3n.<\/p>\n<p>(y perd\u00f3n por que esta vez me ha salido un rollo)<br \/>\n(y sacaremos un post con la configuraci\u00f3n propuesta para SOLR)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A raiz de algunas preguntas que aparecieron \u00faltimamente en las listas de GUDE , sobre anomal\u00edas en los resultados de b\u00faquedas, me compromet\u00ed a escribir sobre el tema. No se si este post arrojar\u00e1 alguna luz o confundir\u00e1 a\u00fan m\u00e1s&#8230;espero &hellip;<\/p>\n<p class=\"read-more\"><a href=\"https:\/\/www.arvo.es\/dspace\/configurando-el-buscador-lucene-sobre-alfabetos-diacriticos-stemmers\/\">Leer m\u00e1s &raquo;<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[4,48,53],"class_list":["post-525","post","type-post","status-publish","format-standard","hentry","category-documentacion_tecnica","tag-dspace","tag-language-packs","tag-lucene"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.arvo.es\/dspace\/wp-json\/wp\/v2\/posts\/525","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.arvo.es\/dspace\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.arvo.es\/dspace\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.arvo.es\/dspace\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.arvo.es\/dspace\/wp-json\/wp\/v2\/comments?post=525"}],"version-history":[{"count":33,"href":"https:\/\/www.arvo.es\/dspace\/wp-json\/wp\/v2\/posts\/525\/revisions"}],"predecessor-version":[{"id":672,"href":"https:\/\/www.arvo.es\/dspace\/wp-json\/wp\/v2\/posts\/525\/revisions\/672"}],"wp:attachment":[{"href":"https:\/\/www.arvo.es\/dspace\/wp-json\/wp\/v2\/media?parent=525"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.arvo.es\/dspace\/wp-json\/wp\/v2\/categories?post=525"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.arvo.es\/dspace\/wp-json\/wp\/v2\/tags?post=525"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}