2009-09-29 12 views
5

Tengo una lista de requisitos para un proyecto de software, ensamblado a partir de los restos de su predecesor. Cada requisito debe asignarse a una o más categorías. Cada una de las categorías consiste en un grupo de palabras clave. Lo que trato de hacer es encontrar un algoritmo que me otorgue un puntaje que clasifique en cuál de las categorías es probable que caiga cada requisito. Los resultados se usarán como punto de partida para categorizar aún más los requisitos.¿Cómo clasificar el texto según los grupos de palabras clave?

A modo de ejemplo, supongamos que tengo el requisito:

El sistema se aplicará a los depósitos de cuenta especificado de un cliente.

y categorías/palabras clave: Transacciones

  1. clientes: los depósitos, el depósito, el cliente, cuenta, cuentas
  2. cuentas de saldo: cuenta, cuentas, débitos, créditos
  3. Categoría Otros: foo, bar

Me gustaría que el algoritmo marcara el requisito más alto en la categoría 1, más bajo en la categoría 2, y no en absoluto en el gato egory 3. El mecanismo de puntuación es casi irrelevante para mí, pero necesita transmitir cuánto más probable es la categoría 1 que la categoría 2.

Soy nuevo en NLP, así que estoy algo perdido. He estado leyendo Procesamiento de lenguaje natural en Python y esperaba aplicar algunos de los conceptos, pero no he visto nada que encaje. No creo que una simple distribución de frecuencia funcione, ya que el texto que estoy procesando es muy pequeño (una sola frase)

Respuesta

4

Es posible que desee buscar la categoría de "medidas de similitud" o "medidas de distancia" (que es diferente, en la jerga de la minería de datos, de "clasificación")

Básicamente, una medida de similitud es una manera en matemáticas puede:.

  1. tomar dos conjuntos de datos (en su caso, las palabras)
  2. Hacer algunos cálculos/ecuación/algoritmo
  3. El resultado es que tiene un número que le dice qué tan "similar" es esa información.

Con medidas de similitud, este número es un número entre 0 y 1, donde "0" significa "nada se compara en absoluto" y "1" significa "idéntico"

Así que en realidad se puede pensar en su oración como un vector - y cada palabra en su oración representa un elemento de ese vector. Del mismo modo para la lista de palabras clave de cada categoría.

Y entonces usted puede hacer algo muy simple: tomar el "cosine similarity" o "Jaccard index" (. Dependiendo de cómo se estructura sus datos)

Qué tanto de estas métricas hacen es que toman ambos vectores (la entrada oración, y su lista de "palabras clave") y darle un número. Si haces esto en todas tus categorías, puedes clasificar esos números para ver qué partido tiene el mayor coeficiente de similitud.

A modo de ejemplo:

Desde su pregunta: Transacciones

del cliente: depósitos, depósito, cliente, cuenta, cuentas

Por lo que podría construir un vector con los 5 elementos : (1, 1, 1, 1, 1). Esto significa que, para la palabra clave "transacciones del cliente", tiene 5 palabras, y (esto parecerá obvio, pero) cada una de esas palabras está presente en su cadena de búsqueda. mantente conmigo

Así que ahora usted toma su frase:

El sistema se aplicará a los depósitos de cuenta especificado de un cliente .

Esto tiene 2 palabras de las "Transacciones de Clientes" Set: {depósitos, cuentas, clientes}

(en realidad, esto ilustra otro matiz:. Que realmente tiene "cliente de" ¿Esto es equivalente al "cliente ?")

el vector para su sentencia podría ser (1, 0, 1, 1, 0)

los números 1 de este vector están en la misma posición que los números 1 de la primera vector - porque esas palabras son lo mismo.

Entonces podríamos decir: ¿cuántas veces difieren estos vectores? Permite comparar:

(1,1,1,1,1) (1,0,1,1,0)

Hm. Tienen el mismo "bit" 3 veces, en la 1.ª, 3.ª y 4.ª posición. Solo difieren en 2 bits. Entonces, digamos que cuando comparamos estos dos vectores, tenemos una "distancia" de 2. ¡Felicidades, acabamos de calcular el Hamming distance! Cuanto menor sea tu distancia de Hamming, más "similar" será la información.

(La diferencia entre una medida de "similitud" y una medida de "distancia" es que la primera se normaliza: le da un valor entre 0 y 1. Una distancia es cualquier número, por lo que solo le da un pariente valor.)

De todos modos, esta podría no ser la mejor manera de procesar el lenguaje natural, pero para sus propósitos es la más simple y podría funcionar bastante bien para su aplicación, o al menos como punto de partida.

(PD: "clasificación" - como tiene en su título - sería responder a la pregunta "Si toma mi oración, ¿en qué categoría es más probable que caiga?" Que es un poco diferente que decir "cómo Mucho más similar es mi oración a la categoría 1 que a la categoría 2 ", que parece ser lo que buscas.

¡buena suerte!

+0

Una palabra de advertencia: las técnicas descritas aquí se aplican mejor en tareas de tipo clúster. Aquí, las listas predefinidas de palabras asociadas con cada categoría no son en absoluto elementos prototípicos y las funciones de distancia tradicionales entre estos y los elementos reales no son representativas de la pertenencia de los elementos a las categorías correspondientes. Por ejemplo, una categoría en particular puede tener docenas de palabras clave (aunque solo esperamos encontrar algunas en una instancia determinada de un elemento), dicha categoría probablemente estará subrepresentada debido a la baja puntuación en la distancia jerárquica. – mjv

+0

Hm, tiene razón acerca de que Hamming es una medida pobre, como dice en su respuesta, sería bueno que los resultados se normalicen, para obtener una proporción de "aciertos" a "errores" para ver qué tan cerca está el los conjuntos están relacionados. Tal vez usar ese método como ejemplo fue una elección subóptima. – poundifdef

+0

Ambos tienen razón, y lo que idealmente me gustaría hacer es normalizar el tiempo y la pluralidad tanto en palabras clave como en oraciones. De esta forma, solo incluyo "cliente" y no "clientes", "depósito" y no "depósitos" ni "depositados". Creo que Hamming todavía corre el riesgo de una representación insuficiente, pero creo que es una buena prueba de lo que estoy tratando de hacer. – technomalogical

2

Las principales características del problema son:

  • criterios de clasificación definidos externamente (lista de palabras clave)
  • artículos que deben ser clasificados (líneas del documento de requerimientos) están hechas de un número relativamente pequeño de valores de atributos , para efectivamente una sola dimensión: "palabra clave".
  • Como se ha definido, no hay retroalimentación/calibrarion (aunque puede ser apropiado sugerir algo de eso)

Estas características aportan buenas y malas noticias: la implementación debería ser relativamente sencillo, pero un nivel consistente de la precisión del proceso de categorización puede ser difícil de lograr. Además, las cantidades pequeñas de varias cantidades (número de categorías posibles, número máximo/promedio de palabras en un elemento, etc.) deberían darnos espacio para seleccionar soluciones que pueden ser intenciones de CPU y/o espacio, de ser necesario.

Sin embargo, incluso con esta licencia tiene "ir de lujo", sugiero empezar con (y estar cerca) a un algoritmo simple y para gastan sobre esta base con algunas adiciones y consideraciones, sin dejar de ser vigilante del peligro siempre presente llamado sobreajuste.

algoritmo básico (conceptual, es decir, no se centran en truco de rendimiento en este momento)

 
    Parameters = 
    CatKWs = an array/hash of lists of strings. The list contains the possible 
       keywords, for a given category. 
     usage: CatKWs[CustTx] = ('deposits', 'deposit', 'customer' ...) 
    NbCats = integer number of pre-defined categories 
    Variables: 
     CatAccu = an array/hash of numeric values with one entry per each of the 
       possible categories. usage: CatAccu[3] = 4 (if array) or 
       CatAccu['CustTx'] += 1 (hash) 
     TotalKwOccurences = counts the total number of keywords matches (counts 
     multiple when a word is found in several pre-defined categories) 

    Pseudo code: (for categorizing one input item) 
     1. for x in 1 to NbCats 
      CatAccu[x] = 0 // reset the accumulators 
     2. for each word W in Item 
      for each x in 1 to NbCats 
       if W found in CatKWs[x] 
         TotalKwOccurences++ 
         CatAccu[x]++ 
     3. for each x in 1 to NbCats 
      CatAccu[x] = CatAccu[x]/TotalKwOccurences // calculate rating 
     4. Sort CatAccu by value 
     5. Return the ordered list of (CategoryID, rating) 
       for all corresponding CatAccu[x] values about a given threshold. 

simple pero posible: estamos a favor de las categorías que tienen la mayor cantidad de partidos, pero se divide por el número total de coincide, como una forma de disminuir la calificación de confianza cuando se encontraron muchas palabras. tenga en cuenta que esta división no afecta la clasificación relativa de una selección de categoría para un artículo dado, pero puede ser significativa cuando se compara la calificación de diferentes artículos.

Ahora, me vienen a la mente varias mejoras simples: (Consideraría seriamente las dos primeras y daría una idea a las otras; decidir cada una de ellas está muy relacionado con el alcance del proyecto, el perfil estadístico de los datos que se clasifican y otros factores ...)

  • debemos normalizar las palabras clave leídos de los elementos de entrada y/o el partido de una manera que es tolerante con los errores ortográficos. Como tenemos muy pocas palabras para trabajar, debemos asegurarnos de no perder una significativa debido a un error tipográfico tonto.
  • Deberíamos dar más importancia a las palabras que se encuentran con menos frecuencia en CatKW. Por ejemplo, la palabra 'Cuenta' debería ser menor que la palabra 'foo' o 'crédito'
  • Podríamos (pero tal vez eso no sea útil o incluso útil) dar más peso a las calificaciones de los artículos que tienen menos [ palabras sin ruido].
  • También podríamos incluir consideraciones basadas en digramas (dos palabras consecutivas), ya que con los lenguajes naturales (y los documentos de requisitos no son del todo naturales :-)) la proximidad de las palabras suele ser un indicador más sólido de las palabras mismas.
  • podríamos agregar un poco de importancia a la categoría asignada al elemento anterior (o incluso siguiente, en una lógica de anticipación). El artículo probablemente vendrá en series relacionadas y podemos beneficiarnos de esta regularidad.

Además, aparte del cálculo de la calificación per se, deberíamos también considerar:

  • algunas métricas que se utilizan para calificar el resultado propio algoritmo (por determinar)
  • cierta lógica para recopilar la lista de palabras asociadas con una categoría asignada y eventualmente ejecutar estadísticas sobre ellas. Esto puede permitir la identificación de palabras representativas de una categoría y que no figuran inicialmente en CatKW.

La cuestión de las métricas, debe considerarse anticipadamente, pero esto también requeriría un conjunto de referencia de entrada: un "conjunto de entrenamiento" de tipo, aunque trabajemos fuera de una categoría de diccionario predefinida-keywords (Por lo general, los conjuntos de entrenamiento se utilizan para determinar esta misma lista de palabras clave de categoría, junto con un factor de peso). Por supuesto, ese conjunto de referencia/entrenamiento debe ser estadísticamente significativo y estadísticamente representativo [del conjunto completo].

En resumen: palo para sencilla acerca, de todos modos el contexto no deja lugar a ser muy elegante. Considere introducir una forma de medir la eficiencia de los algoritmos particulares (o de parámetros particulares dentro de un algoritmo dado), pero tenga en cuenta que tales métricas pueden ser defectuosas y le pedirá que especialice la solución para un conjunto dado en detrimento de los otros elementos (overfitting).

Cuestiones relacionadas