Domanda

Ho una lista di requisiti per un progetto software, assemblati dai resti del suo predecessore. Ogni requisito deve mappare una o più categorie. Ciascuna di tali categorie è costituito da un gruppo di parole chiave. Quello che sto cercando di fare è trovare un algoritmo che mi avrebbe dato una classifica punteggio che delle categorie ciascun requisito rischia di cadere in. I risultati sarebbero utilizzare come punto di partenza per classificare ulteriormente i requisiti.

Per fare un esempio, supponiamo di avere il requisito:

  

Il sistema si applica depositi sul conto specificato di un cliente.

E categorie / parole chiave:

  1. Le operazioni della clientela: raccolta, deposito, clienti, account, account
  2. quadrare i conti: conto, conti, debiti, crediti
  3. Altro Categoria: foo, bar

vorrei l'algoritmo di segnare il requisito più alto nella categoria 1, inferiore nella categoria 2, e non a tutti in categoria 3. Il meccanismo di punteggio è per lo più irrilevante per me, ma ha bisogno di trasmettere quanto categoria più probabile 1 si applica di categoria 2.

Sono nuovo di PNL, quindi sono di tipo in perdita. Ho letto Natural Language Processing in Python e sperava di applicare alcuni concetti, ma non ho visto nulla che molto adatta. Non credo che una distribuzione di frequenza semplice avrebbe funzionato, dal momento che il testo che sto elaborazione è così piccolo (una sola frase.)

È stato utile?

Soluzione

Si potrebbe desiderare di guardare alla categoria delle "misure di similarità" o "misure di distanza" (che è diversa, in gergo di data mining, di "classificazione".)

In sostanza, una misura di similarità è un modo in matematica è possibile:

  1. Prendete due serie di dati (nel tuo caso, le parole)
  2. Fare un po 'di calcolo / equazione / algoritmo
  3. Il risultato è che hai qualche numero che ti dice come "simile" che i dati siano.

Con misure di similarità, questo numero è un numero tra 0 e 1, dove "0" significa "nulla corrisponde affatto" e "1" significa "identico"

Così si può effettivamente pensare a tua frase come vettore - e ogni parola nella tua frase rappresenta un elemento di quel vettore. Allo stesso modo per la lista di ciascuna categoria di parole chiave.

E allora si può fare una cosa molto semplice: prendere il " coseno di similitudine " o " Jaccard indice "(a seconda di come si struttura dei dati.)

Che entrambi questi parametri fanno è che prendono entrambi i vettori (la tua frase di ingresso, e la vostra lista "parola chiave") e gli dà un numero. Se si esegue questa operazione in tutti i tuoi categorie, è possibile classificare i numeri per vedere che partita ha il maggiore coefficiente di similitudine.

Per fare un esempio:

Dalla tua domanda:

  

Le operazioni della clientela: raccolta,   deposito, clienti, account, account

Così si potrebbe costruire un vettore con 5 elementi: (1, 1, 1, 1, 1). Ciò significa che, per la parola chiave "transazioni dei clienti", si dispone di 5 parole, e (questo suona ovvio, ma) ciascuna di quelle parole è presente nella stringa di ricerca. tenere con me.

Quindi, ora si prende la frase:

  

Il sistema si applica depositi a un   account specificato del cliente.

Questo ha 2 parole le "transazioni dei clienti" set: {depositi, conto, cliente}

(in realtà, questo illustra un'altra sfumatura:.? In realtà hanno "del cliente" è questo equivale a "cliente")

Il vettore per la vostra frase potrebbe essere (1, 0, 1, 1, 0)

I 1 nella questo vettore sono nella stessa posizione dei 1 nella primo vettore -. Perché quelle parole sono le stesse

Quindi, potremmo dire: quante volte fanno questi vettori differiscono? Consente di confrontare:

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

Hm. Hanno gli stessi "bit" 3 volte - nel 1 °, 3 ° e 4 ° posto. Essi differiscono solo per 2 bit. Quindi, consente di dire che quando mettiamo a confronto questi due vettori, abbiamo una "distanza" di 2. Congratulazioni, abbiamo appena calcolato la distanza di Hamming ! La abbassare la distanza di Hamming, il più "simile" i dati.

(La differenza tra una misura di "somiglianza" e una misura di "distanza" è che il primo è normalizzata - ti dà un valore compreso tra 0 e 1. Una distanza è solo un numero, in modo che ti dà solo un valore relativo .)

In ogni caso, questo potrebbe non essere il modo migliore per fare l'elaborazione del linguaggio naturale, ma per i vostri scopi è il più semplice e potrebbe effettivamente funzionare abbastanza bene per la vostra applicazione, o almeno come punto di partenza.

(PS: "classificazione" - come avete nel vostro titolo - sarebbe rispondendo alla domanda "Se si prende la mia sentenza, quale categoria è più probabile che cadere in?" Il che è un po 'diverso che dire "quanto più simile è la mia frase alla categoria 1 di categoria 2?", che sembra essere quello che stai dopo.)

buona fortuna!

Altri suggerimenti

Le principali caratteristiche del problema sono:

  • criteri di categorizzazione Esternamente definiti (elenco di parole chiave)
  • Articoli da classificare (linee del documento requisito) sono costituiti da un numero relativamente piccolo di valori attributi, per modo efficace una sola dimensione:. "parola chiave"
  • Come definito, nessun feedback / calibrarion (anche se può essere opportuno suggerire alcuni di che)

Queste caratteristiche portano sia buona e una cattiva notizia: l'attuazione dovrebbe essere relativamente semplice, ma un livello uniforme di accuratezza del processo di categorizzazione può essere difficile da raggiungere. Anche le piccole quantità di diverse quantità (numero di possibili categorie, max / numero medio di parole in un oggetto, ecc) ci dovrebbe dare spazio a scegliere le soluzioni che possono essere CPU e / o Spazio intentsive, se necessario.

Tuttavia, anche con questa licenza ottenuto "vado di fantasia", suggerisco di iniziare con (e stare vicino a) per un semplice algoritmo e spendere su questa base con alcune aggiunte e considerazioni, pur rimanendo vigili del sempre presente pericolo chiamato overfitting.

algoritmo di base (concettuale, vale a dire senza attenzione per trucco prestazioni in questo 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.

Semplice ma plausibile: favoriamo le categorie che hanno la maggior parte delle partite, ma dividiamo per il numero complessivo di partite, come un modo per diminuire il voto di fiducia, quando molte parole sono state trovate. notare che questa divisione non influisce la relativa classifica di categoria una selezione per un determinato elemento, ma può essere significativo quando si confrontano Valutazione di elementi diversi.

Ora, diversi miglioramenti semplici vengono in mente: (I piacerebbe prendere in considerazione seriamente i primi due, e dare pensieri gli altri; di decidere su ciascuno di questi è molto legato alla portata del progetto, il profilo statistico di i dati per essere classificati e di altri fattori ...)

  • Dobbiamo normalizzare le parole chiave lette dalle voci di ingresso e / o della partita in un modo che è tollerante di errori di ortografia. Dal momento che abbiamo così poche parole con cui lavorare, abbiamo bisogno di essere sicuri di non perdere un una significativa causa di un errore di battitura sciocco.
  • dovrebbe dare più importanza alle parole hanno trovato meno frequentemente in CatKWs. Per esempio la parola 'account' dovrebbe poteva meno la parola 'foo' o 'credito'
  • Si potrebbe (ma forse non saremo utile o addirittura utile) dare più peso alle valutazioni di elementi che hanno un minor numero di [non] rumore parole.
  • Si potrebbe anche includere corrispettivo determinato in digrammi (due parole consecutive), per con lingue naturali (e requisiti di documenti non sono del tutto naturale :-)) parola di prossimità è spesso un indicatore forte che le parole stesse.
  • potremmo aggiungere un po 'di importanza per la categoria assegnata alla precedente (o anche dopo, in una logica di look-ahead) voce. L'oggetto sarà probabilmente venire in serie connesse e possiamo trarre beneficio da questa regolarità.

Inoltre, a parte il calcolo del rating per-sé, dovremmo anche considerare:

  • alcuni parametri che sarebbero stati utilizzati per classificare il risultato algoritmo stesso (tbd)
  • una certa logica per raccogliere l'elenco delle parole associate con una categoria assegnata e finalmente correre statistica a questi. Ciò può consentire l'identificazione di parole rappresentante di una categoria e non inizialmente elencati in CatKWs.

La domanda di metriche, dovrebbe essere considerato presto, ma questo sarebbe anche bisogno di un set di riferimento di elemento di input: un "training set" di sorta, anche se stiamo lavorando fuori di un pre-definito dizionario di categoria-parole chiave (in genere la formazione set sono utilizzati per determinare questo elenco di categoria-parole chiave, insieme a un fattore di peso). Naturalmente set siffatto riferimento / formazione dovrebbe essere sia statisticamente significativa e statisticamente rappresentativo [di tutto l'insieme].

Per riassumere: bastone per semplici approcci , in ogni caso il contesto non lascia spazio ad essere molto di fantasia. Prendere in considerazione l'introduzione di un modo per misurare l'efficienza degli algoritmi particolari (o di particolari parametri all'interno di un dato algoritmo), ma attenzione che tali metriche possono essere viziata e richiedono di specializzare la soluzione per un dato insieme al scapito degli altri elementi ( overfitting ).

Sono stato anche affrontando lo stesso problema della creazione di un classificatore basata solo su parole chiave. Stavo facendo un file di parole chiave mapper di classe e che conteneva variabile di classe e la lista di parole chiave che si verificano in una classe particolare. Sono venuto con il seguente algoritmo per farlo e sta funzionando davvero bene.

# 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])
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top