¿Cómo encuentro si algún nombre en una lista de nombres aparece en un párrafo con ColdFusion?

Supongamos que tengo una lista de nombres de empleados de una base de datos (miles, potencialmente decenas de miles en un futuro cercano). Para simplificar el problema, suponga que cada combinación de nombre/apellido es única (un gran si, pero una tangente).

También tengo un flujo RSS de contenido de noticias relacionado con el negocio (una vez más, podría haber cientos de artículos por día).

Lo que me gustaría hacer es detectar si el nombre de un empleado aparece en la noticia de varios párrafos y, de ser así, 'etiquetar' la noticia con la persona de la que está hablando.

Puede haber más de un empleado nombrado en una sola noticia, por lo que no es posible romper el bucle después de la primera coincidencia positiva.

Ciertamente puedo aplicar fuerza bruta a las cosas: para cada noticia, repase todos y cada uno de los nombres de los empleados y, si una expresión regular devuelve una coincidencia, anótelo.

¿Hay una forma más sencilla en ColdFusion o debería continuar con mis bucles anidados?

preguntado el 01 de julio de 12 a las 01:07

Si se menciona a un empleado en un artículo, ¿es por su nombre Y apellido? Por ejemplo, "Vanessa Smith le gustan las nueces" o puede ser simplemente el primer nombre "Vanessa le gustan las nueces"? -

Para simplificar el conjunto de problemas, supongamos que cada nombre se usará en un contexto profesional al menos una vez en el artículo; en otras palabras, tanto el nombre como el apellido (es decir, "Vanessa Smith") aparecerán al menos una vez juntos en el artículo. artículo de noticias -

3 Respuestas

Simplemente tirando esto por ahí como algo que podría hacer...

Parece que casi por unanimidad tendrá significativamente más nombres de empleados que palabras por publicación. Así es como podría manejarlo:

Tener una aplicación CF siempre en ejecución que extraerá las fuentes y onAppStart

  1. Agarra a todos los empleados de tu base de datos
  2. Cree una estructura de búsqueda en el ámbito de la aplicación con nombres como claves y una estructura de apellidos como valores (si lo desea, también puede agregar el segundo nombre hermano a los apellidos con un tercer nivel).

Entonces, una clave en la búsqueda podría ser "Vanessa" con una estructura con 2 claves ("Johnson" y "Forta") como su valor.

Luego, cada artículo que analice, simplemente listToArray con un espacio como delimitador y recorra la matriz haciendo un structKeyExists simple con cada token. Para coincidencias, marque el siguiente elemento de la matriz como apellido.

Carné de identidad adivinar esto sería mucho más eficiente en cuanto a procesamiento que hacer muchas búsquedas y también tomaría muy poco tiempo para codificar y puede alimentar cualquier fuente futura de manera extremadamente simple (su verificador toma un argumento, cualquier texto en la Tierra).

Interesado en ver qué ruta toma y si sus experimentos exponen algo nuevo sobre el rendimiento en CF.

Respondido 01 Jul 12, 01:07

Recién terminado de implementar. Se requería un poco de expresiones regulares para asegurar que (1) tuviéramos caracteres válidos para un nombre de clave de estructura y [TJ no es un nombre de variable válido] y (2) que la puntuación no estaba causando fallas [ 'Lady Luck' no se encuentra en una lista delimitada por espacios donde la oración es 'Ella dijo que su nombre era "Lady Luck"]. De lo contrario, la búsqueda de Keylist propuesta se ejecuta increíblemente rápido y es lo suficientemente genérica para funcionar con numerosas fuentes. Muchas Gracias! - Mateo Reinbold

todo eso de lo que constituye un nombre de variable válido ha quedado un poco obsoleto desde CFMX6. Usando la notación de matriz asociativa, un nombre de variable puede ser cualquier cosa, por lo que probablemente pueda optimizar su código ligeramente allí no desinfectando la forma en que los nombres se almacenan en las claves de estructura. @David: ¡buen enfoque! - adam cameron

Matthew, tienes una tarea difícil allí, y realmente hay múltiples partes en el desafío/solución. Pero solo en términos de comparar una lista de valores con un conjunto de texto dado para ver si uno de ellos ocurre allí, encontrará que nadie podría funcionar con CF. Por eso, creé uno nuevo, findList, disponible en cflib:

http://cflib.org/index.cfm?event=page.udfbyid&udfid=1908

No es perfecto, ni tan óptimo como podría ser, pero puede ser un primer paso útil para ti, o darte algunas ideas. Dicho esto, se adaptaba a mis necesidades (determinar si un comentario de blog dado tenía referencia a alguna de las palabras de la lista negra). Lo muestro comparando una lista de URL, pero podría ser cualquier palabra. Espero que sea un poco útil.

Respondido 01 Jul 12, 02:07

Otra opción que vale la pena explorar es aprovechar el motor Solr que viene con CF ahora. Hará el trabajo pesado de búsqueda de cadenas por usted y probablemente pueda concentrarse en mantener dinámicamente sus colecciones actualizadas y optimizadas a medida que ingresan nuevos elementos de alimentación.

¡Buena suerte!

Respondido 01 Jul 12, 03:07

Sí, Solr sería la solución óptima a largo plazo. Pero para este prototipo, busco hacer todo lo posible "en el motor" antes de seguir el camino de los índices de ajuste. - Mateo Reinbold

@MatthewReinbold solr es un componente de CF9+ - Antony

@Antony Entiendo que solr está incluido con CF9. Primero estaba buscando una solución con las construcciones del idioma nativo. - Mateo Reinbold

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.