Tengo una lista de productos, que incluye variables como el nombre del producto (como aparece en el recibo) y el comerciante donde se compró el producto.
Tengo una buena cantidad de ellos clasificados manualmente en un grupo fijo de categorías (por ejemplo, bebidas alcohólicas, verduras, carne, etc.).
Los datos son, como siempre, ruidosos. En este caso, particularmente ruidoso porque proviene de recibos escaneados y el OCR en escaneos no tan buenos suele ser muy ruidoso.
Quiero jugar con algoritmos para clasificar nuevos datos, usando las dos variables anteriores.
Hay varias fuentes principales de variación aquí:
- El OCR, que significa que se puede encontrar un producto (por ejemplo, pollo) con una ortografía diferente pero relativamente similar (por ejemplo, pollo, pollo, pollo, ...).
- El mismo producto puede tener diferentes nombres, según el comerciante que vendió el producto. En este caso, los nombres pueden ser similares o completamente diferentes entre los comerciantes, pero bastante similares dentro de cada comerciante.
- El mismo producto puede tener nombres muy diferentes dentro del mismo comerciante (por ejemplo, productos de marca cuyo nombre en el recibo es el nombre de la marca, en comparación con los nombres genéricos; refrescos versus coca cola).
He intentado algún clasificador (ingenuo), utilizando, por ejemplo, la distancia entre cadenas (que aborda principalmente la primera fuente principal de variación mencionada anteriormente), pero no estoy muy contento con los resultados.
Así que quería contactar aquí para pedir ideas sobre cómo abordar este problema. Supongo que muchas personas han "resuelto" o al menos trabajado mucho más tiempo en este tipo de problema que yo (unas pocas horas), por lo que realmente agradecería cualquier orientación aquí.
Por cierto, uso principalmente R, por lo que las soluciones basadas en R serían muy apreciadas.
fuente
Respuestas:
Abordar sus problemas uno por uno:
1) OCR: este es probablemente el problema más fácil, ya que hay muchos algoritmos que funcionan bien en esta tarea. Como referencia, en el conjunto de datos de dígitos escritos a mano más conocido, MNIST , varios algoritmos han logrado una precisión superior al 99,5% (el estado de la técnica son las redes neuronales convolucionales). También puede encontrar muchas soluciones listas para usar para su problema; ayuda mucho si sus datos están en inglés, ya que las herramientas allí son más avanzadas. Si sus escaneos son ruidosos, puede intentar eliminarlos primero.
2) Debe realizar un preprocesamiento para este problema. Primero sugeriría, si es posible, crear una bolsa de palabras , es decir, una lista de todas las palabras únicas en su "corpus". Verifique que todas estas palabras sean correctas y realice una comparación de distancia de cadena (por ejemplo, distancia de Hamming) para corregir errores tipográficos de 1-2 letras. Otra cosa que haría sería calcular las ocurrencias de cada término en su bolsa y eliminar las menos frecuentes (por ejemplo, los términos que aparecen menos de N veces en su corpus son probablemente errores tipográficos, o eliminar el M% menos frecuente de sus términos). Eso debería reducir significativamente el ruido en su conjunto de datos.
3) Para resolver este problema, debe realizar algún tipo de etiquetado semántico. Si está familiarizado con las ontologías, su estructura jerárquica puede ayudar mucho aquí. Puede crear reglas como "coca-cola" es un "refresco" que es un tipo de bebida, etc.
No tengo experiencia en R, pero estoy seguro de que puedes encontrar herramientas para realizar todo lo anterior con bastante facilidad.
fuente
Parece que debería definir similitud entre las entidades.
Tienes muchas fuentes de similitud. Usted mencionó la distancia en los nombres (editar distancia) y la membresía en grupos. Tenga en cuenta que puede extender la similitud por grupos a muchos grupos y muchos tipos de similitud. Los grupos pueden pertenecer a la misma receta, vendidos por el mismo comerciante, pertenecer a la misma categoría, etc. Los tipos de similitud pueden ser planos que pertenecen al mismo grupo, peso con relación inversa al tamaño del grupo, etc. puede usar transitividad. Por ejemplo, puede encontrar un producto similar con nombres diferentes utilizando el hecho de que se usarán con los mismos productos (por ejemplo, spice X` y spice X`` se usarán con pollo).
Muy pronto tendrá muchas relaciones de similitud y se preguntará cómo combinarlas. Ven aquí para ayudar al etiquetado que ya has hecho. Tómelos como pares positivos de productos asociados. Genere conjuntos de productos distintos (no en los pares positivos) como pares negativos. Cree un conjunto de datos en el que la positividad sea el concepto y las similitudes sean los pares. Ahora puede usar el algoritmo de aprendizaje supervisado para obtener un modelo que combine las similitudes en una sola predicción. Puede usar este modelo para predecir la asociación entre un nuevo par. Como beneficio adicional, podrá evaluar el rendimiento del modelo en el conjunto de datos (por ejemplo, precisión, precisión, ...) y tener más certeza.
fuente