Pregunta

Tengo un sitio que se puede buscar usando Lucene.He notado en los registros que los usuarios a veces no encuentran lo que buscan porque ingresan un término singular, pero en el sitio solo se usa la versión plural de ese término.Me gustaría que la búsqueda también encontrara usos de otras formas de una palabra.Este es un problema que estoy seguro se ha resuelto muchas veces, entonces, ¿cuáles son las mejores prácticas para esto?

Tenga en cuenta:este sitio solo tiene contenido en ingles.

Algunos enfoques en los que he pensado:

  1. Busque la palabra en algún tipo de archivo de sinónimos para determinar formas alternativas de una palabra determinada.
    • Algunos ejemplos:
      • Busca "automóvil", también agrega "autos" a la consulta.
      • Busca "carry", también agrega "carries" y "carried" a la consulta.
      • Busca "pequeño", también agrega "más pequeño" y "más pequeño" a la consulta.
      • Busca "puede" y también agrega "no puedo", "no puedo", "latas" y "enlatado" a la consulta.
      • Y debería funcionar a la inversa (es decir,la búsqueda de "carries" debe agregar "carry" y "carried").
    • Desventajas:
      • No funciona para muchas palabras técnicas nuevas a menos que el diccionario/tesauro se actualice con frecuencia.
      • No estoy seguro del rendimiento de la búsqueda en el archivo de sinónimos.
  2. Generar las formas alternativas algorítmicamente, basándose en algunas heurísticas.
    • Algunos ejemplos:
      • Si la palabra termina en "s" o "es" o "ed" o "er" o "est", elimine el sufijo
      • Si la palabra termina en "ies" o "ied" o "ier" o "iest", conviértala a "y"
      • Si la palabra termina en "y", conviértala a "ies", "ied", "ier" y "iest".
      • Intente agregar "s", "es", "er" y "est" a la palabra.
    • Desventajas:
      • Genera muchas no palabras para la mayoría de las entradas.
      • Se siente como un truco.
      • Parece algo que encontrarías en TheDailyWTF.com.:)
  3. ¿Algo mucho más sofisticado?

Estoy pensando en hacer algún tipo de combinación de los dos primeros enfoques, pero no estoy seguro de dónde encontrar un archivo de sinónimos (o cómo se llama, ya que "tesauro" no es del todo correcto, pero tampoco lo es "diccionario"). ).

¿Fue útil?

Solución

Considerar la inclusión de la PorterStemFilter en su análisis de tuberías. Asegúrese de realizar el mismo análisis en las consultas que se utiliza en la construcción del índice.

También he utilizado el Lancaster derivada algoritmo con buenos resultados. Utilizando el PorterStemFilter como guía, es fácil de integrar con Lucene.

Otros consejos

Palabra derivada funciona bien para Inglés, sin embargo para los idiomas donde la palabra derivada es casi imposible (como la mía) la opción # 1 es viable. Sé de al menos una dicha aplicación para mi idioma (islandés) para Lucene que parece funcionar muy bien.

Algunos de los que se parecen a las ideas con buena pinta. En lo personal, me acaba de añadir etiquetas a la consulta (transformación de consulta) para que sea difusa, o puede utilizar la orden interna FuzzyQuery , que utiliza levenshtein editar distancias, lo que ayudaría a mispellings.

Uso de búsqueda difusa ' etiquetas de consulta ', Levenshtein también se utiliza. Considere una búsqueda de 'coche'. Si cambia la consulta para 'coche ~', encontrará 'coche' y 'coches' y así sucesivamente. Hay otras transformaciones a la consulta que debe manejar casi todo lo que necesita.

Si está trabajando en un campo especializado (Lo hice con la horticultura) o con un lenguaje que does't juega muy bien con los métodos normales derivadas podría utilizar el registro de consultas para crear una tabla derivada manual.

Hay que crear una palabra -> mapeo madre para todos los desajustes que se pueda imaginar / la gente está buscando, entonces cuando la indexación o la búsqueda reemplazan cualquier palabra que se da en la tabla con el vástago apropiado. Gracias a la consulta el almacenamiento en caché esta es una solución bastante barato.

Stemming es una forma bastante estándar para abordar esta cuestión. He encontrado que la despalilladora Porter es agresiva manera de búsqueda de palabra clave estándar. Se termina por confundir palabras juntas que tienen diferentes significados. Probar el algoritmo de KStemmer.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top