Pregunta

Tengo una lista de requisitos para un proyecto de software, montado a partir de los restos de su predecesor. Cada requisito debe asignar a una o más categorías. Cada una de las categorías es la de un grupo de palabras clave. Lo que estoy tratando de hacer es encontrar un algoritmo que me daría un ranking de puntuación cuál de las categorías es probable que caiga en cada requisito. Los resultados serían uso como punto de partida para categorizar aún más los requisitos.

A modo de ejemplo, supongamos que tengo el requisito:

  

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

y categorías / palabras clave:

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

Me quiero el algoritmo para anotar el requisito más alto en la categoría 1, inferior en la categoría 2, y no a todos de la categoría 3. El mecanismo de puntuación es sobre todo irrelevante para mí, pero debe transmitir la cantidad de la categoría más probable que se aplica 1 que la categoría 2.

Soy nuevo en PNL, así que estoy un poco en una pérdida. He estado leyendo Procesamiento de Lenguaje Natural en Python y tenía la esperanza de aplicar algunos de los conceptos, pero no he visto nada que encaja bastante. No creo que una distribución de frecuencias simples funcionaría, ya que el texto que estoy procesamiento es tan pequeña (una sola frase.)

¿Fue útil?

Solución

Es posible que desee ver 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. Tome dos conjuntos de datos (en su caso, las palabras)
  2. Haga un poco de cálculo / ecuación / algoritmo
  3. El resultado es que usted tiene un número que le dice cómo "similares" es que los datos.

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 sentencia como un vector - y cada palabra en su sentencia representa un elemento de ese vector. Lo mismo sucede con lista de palabras clave de cada categoría.

Y a continuación, puede hacer algo muy simple: tomar el " coseno similitud " o " Jaccard índice "(dependiendo de cómo se estructuren los datos.)

¿Qué tanto de estas métricas hacen es que toman ambos vectores (su frase de entrada, y su lista de "palabra clave") y le dará un número. Si lo hace en todas sus categorías, puede clasificar esos números con el fin de ver qué partido tiene el mayor coeficiente de similitud.

A modo de ejemplo:

A partir de la pregunta:

  

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

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

Así que ahora usted toma su frase:

  

El sistema se aplicará a los depósitos de una   cuenta especificada del cliente.

Esto tiene 2 palabras de las "Transacciones de clientes" set: {depósitos, cuenta, cliente}

(en realidad, esto ilustra otro matiz:.? Que realmente tiene "cliente de" ¿Es esto equivale a un "cliente")

El vector para su frase podría ser (1, 0, 1, 1, 0)

Los números 1 de este vector están en la misma posición que los 1 está en el primer vector -. Porque esas palabras son el mismo

Así que podríamos decir: ¿cuántas veces se diferencian estos vectores? Vamos a comparar:

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

Hm. Tienen los mismos "bit" 3 veces - en la primera, tercera y cuarta posición. Sólo se diferencian por 2 bits. Por lo que permite decir que cuando comparamos estos dos vectores, tenemos una "distancia" de 2. Felicidades, sólo computa la distancia de Hamming ! Cuanto menor sea la distancia de Hamming, más "similar" a los datos.

(La diferencia entre una medida "similitud" y una medida "distancia" es que el primero se normaliza - le da un valor entre 0 y 1. Una distancia es cualquier número, por lo que sólo le da un valor relativo .)

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

(PS: "clasificación" - y cuando tenga en su título - estaría respondiendo a la pregunta "Si tomas mi sentencia, que es lo más probable que caiga en la categoría?" ¿Qué es un poco diferente a decir "¿cuánto más similares es mi oración para la categoría 1 a categoría 2?", que parece ser lo que está buscando.)

buena suerte!

Otros consejos

Las principales características del problema son:

  • criterios de clasificación definidos externamente (lista de palabras clave)
  • artículos al ser clasificados (líneas desde el documento requisito) están hechas de un número relativamente pequeño de valores de atributos, para efectivamente una sola dimensión:. "palabra clave"
  • Tal como se define, no feedback / calibrarion (aunque puede ser apropiado sugerir algunos de que)

Estas características aportan buenas y malas noticias: la implementación debería ser relativamente sencillo, pero un nivel constante de precisión del proceso de categorización puede ser difícil de lograr. También las pequeñas cantidades de diversas cantidades (número de categorías posibles, máx / número medio de palabras en un artículo, etc.) nos debe dar espacio para seleccionar las soluciones que pueden ser CPU y / o intentsive espacio, si es necesario.

Sin embargo, incluso con esta licencia tiene "vaya de lujo", sugiero empezar con (y estar cerca de) a un simple algoritmo y expender sobre esta base con algunas adiciones y consideraciones, permaneciendo vigilante del peligro siempre presente llamado overfitting.

algoritmo básico (conceptual, es decir, no se centran en el rendimiento truco 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ía de los partidos, pero se divide por el número total de partidos, como una manera de disminuir el índice de confianza cuando se descubrió que muchas palabras. en cuenta que esta división no afecta a la clasificación relativa de una categoría de selección de un determinado artículo, pero puede ser significativa al comparar calificación de los diferentes elementos.

Ahora, varias mejoras simples vienen a la mente: (Me considero serio los dos primeros, y dar ideas a los demás; decidir sobre cada uno de ellos está muy ligado al 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. Ya que tenemos tan pocas palabras las que trabajar, tenemos que garantizar que no pierden un tema muy importante, debido a un error tipográfico tonta.
  • Se debe dar más importancia a las palabras encontraron con menos frecuencia en CatKWs. Por ejemplo la palabra 'Cuenta' debe podía menos de la palabra 'foo' o 'crédito'
  • Podríamos (pero tal vez eso no va a ser útil o incluso útil) dan más peso a las votaciones de los artículos que tienen un menor número de [no] ruido palabras.
  • También podría incluir la consideración basado en digramas (dos palabras consecutivas), para con las lenguas naturales (y documentos de requisitos no son muy natural :-)) palabra proximidad es a menudo un indicador más fuerte que las palabras mismas.
  • podemos añadir un poco de importancia a la categoría asignada a la precedente (o incluso después, en un aspecto de la ventaja lógica) concepto. Artículo vendrá probablemente en serie relacionado y que se pueden beneficiar de esta regularidad.

Además, aparte del cálculo de la calificación per se, también debemos tener en cuenta:

  • algunas métricas que se utilizan para calificar el resultado propio algoritmo (TBD)
  • cierta lógica para recoger la lista de palabras asociadas a una categoría asignada y finalmente a ejecutar estadística sobre estos. Esto puede permitir la identificación de palabras representativo de una categoría y no enumerado inicialmente en CatKWs.

La cuestión de las métricas, se deben considerar temprano, pero esto también requeriría un conjunto de referencia de elemento de entrada: un "conjunto de entrenamiento" de la especie, a pesar de que estamos trabajando fuera un pre-definido diccionario categoría-palabras clave (por lo general la formación conjuntos se utilizan para determinar esta misma lista de palabras clave-categoría, junto con un factor de peso). Por supuesto conjunto dicha referencia / formación debe ser tanto estadísticamente significativa y estadísticamente representativa [de todo el conjunto].

Para resumir: palo para enfoques simples , de todos modos el contexto no deja lugar a ser muy elegante. Considerar la introducción de una forma de medir la eficiencia de los algoritmos particulares (o de los parámetros particulares dentro de un algoritmo dado), pero ten en cuenta que estos indicadores pueden ser defectuoso y le pedirá a especializarse la solución para un conjunto dado en el detrimento de los otros artículos ( overfitting ).

También estaba enfrentando el mismo problema de crear un clasificador basado sólo en palabras clave. Estaba teniendo un archivo asignador de palabras clave de clase y que contenía variable de clase y la lista de palabras clave que ocurren en una clase en particular. Vine con el siguiente algoritmo para hacer y está trabajando muy bien.

# predictor algorithm
for docs in readContent:
    for x in range(len(docKywrdmppr)):
        catAccum[x]=0
    for i in range(len(docKywrdmppr)):
        for word in removeStopWords(docs):
            if word.casefold() in removeStopWords(docKywrdmppr['Keywords'][i].casefold()):
                print(word)
                catAccum[i]=catAccum[i]+counter
    print(catAccum)
    ind=catAccum.index(max(catAccum))
    print(ind)
    predictedDoc.append(docKywrdmppr['Document Type'][ind])
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top