Encontrar sujeto en oración incompleta con NLTK

Tengo una lista de productos que estoy tratando de clasificar en categorías. Se describirán con oraciones incompletas como:

“Alojamiento de unidad de estado sólido”

“Cable de disco duro”

“Disco Duro 1TB”

“Disco duro de 500 GB, restaurado por el fabricante”

¿Cómo puedo usar python y NLP para obtener una salida como “Carcasa, Cable, Unidad, Unidad” o un árbol que describe qué palabra está modificando cuál? Gracias de antemano

Las técnicas de PNL están relativamente mal equipadas para manejar este tipo de texto.

Expresado de manera diferente: es muy posible crear una solución que incluya procesos de PNL para implementar el clasificador deseado, pero la complejidad agregada no necesariamente se ve recompensada en términos de velocidad de desarrollo ni mejoras de precisión del clasificador.
Si uno realmente insiste en usar técnicas de PNL, el etiquetado POS y su capacidad para identificar nombres es la idea más obvia, pero Chunking y el acceso a WordNet u otras fonts léxicas son otros usos plausibles de NLTK.

En cambio, una solución ad hoc basada en expresiones regulares simples y algunas heurísticas como las sugeridas por NoBugs es probablemente un enfoque apropiado para el problema. Ciertamente, tales soluciones tienen dos riesgos principales:

  • ajuste excesivo a la parte del texto revisado / considerado en la construcción de las reglas
  • posible desorden / complejidad de la solución si se introducen demasiadas reglas y sub-reglas.

Realizar un análisis estadístico simple en la totalidad (o una muestra muy grande) de los textos a considerar debería ayudar a guiar la selección de algunas heurísticas y también evitar las preocupaciones excesivas. Estoy bastante seguro de que un número relativamente pequeño de reglas, asociadas con un diccionario personalizado, deberían ser suficientes para producir un clasificador con la precisión adecuada y el rendimiento de velocidad / recursos.

Algunas ideas:

  • cuente todas las palabras (y posiblemente todos los bi-gramos y tri-gramos) en una porción considerable del cuerpo por mano. Esta información puede impulsar el diseño del clasificador al permitirle asignar el mayor esfuerzo y las reglas más rígidas a los patrones más comunes.
  • introduzca manualmente un diccionario corto que asocia las palabras más populares con:
    • su función POS (principalmente una materia binaria aquí: es decir, sustantivos frente a modificadores y otros no sustantivos).
    • su raíz de sinónimo [si corresponde]
    • su clase [si corresponde]
  • Si el patrón se mantiene para la mayoría del texto de entrada, considere usar la última palabra antes del final del texto o antes de la primera coma como la clave principal para la selección de la clase. Si el patrón no se mantiene, simplemente dale más peso a la primera y la última palabra.
  • Considere una primera pasada donde el texto se reescriba con los bi-gtwigs más comunes reemplazados por una sola palabra (incluso una palabra de código artificial) que estaría en el diccionario.
  • Considere también reemplazar los errores tipográficos o sinónimos más comunes con su correspondiente raíz de sinónimos. Agregar la regularidad en la entrada ayuda a mejorar la precisión y también ayuda a hacer algunas reglas / unas pocas entradas en el diccionario tienen un gran retorno de la precisión.
  • para palabras que no se encuentran en el diccionario, asum que las palabras que se mezclan con números y / o precedidas por números son modificadores, no sustantivos. Supongamos que el
  • considere una clasificación de dos niveles en la que las entradas que no pueden asignarse de manera plausible a una clase se colocan en la “stack manual” para solicitar una revisión adicional que resulte en más reglas y / o entradas de diccionario. Después de algunas iteraciones, el clasificador debería requerir cada vez menos mejoras y ajustes.
  • Busque características no obvias. Por ejemplo, algunos cuerpos están hechos de una combinación de fonts, pero algunas de las fonts pueden incluir regularidades particulares que ayudan a identificar la fuente y / o ser aplicables como sugerencias de clasificación. Por ejemplo, algunas fonts solo pueden contener, por ejemplo, texto en mayúsculas (o texto que normalmente tiene más de 50 caracteres, o palabras truncadas al final, etc.)

Me temo que esta respuesta no llega a proporcionar fragmentos de Python / NLTK como base para una solución, pero, francamente, estos enfoques simples basados ​​en NLTK probablemente sean decepcionantes. Además, deberíamos tener un conjunto de muestras mucho más grande del texto de entrada para guiar la selección de enfoques plausibles, incluidos los que se basan en las técnicas NLTK o NLP en general.

Me gustaría crear una lista de nombres, ya sea manualmente, con todos los nombres que está buscando, o analizar un diccionario como este . Filtrar todos menos los nombres al menos lo llevaría a “Unidad de estado”, “Cable de unidad” o “Unidad”, ignorando todo después del primer signo de puntuación.