Tekstklassifikation og forudsigelse ved hjælp af metoden Bag Of Words

Der er en række tilgange til tekstklassificering. I andre artikler har jeg dækket multinomiale naive Bayes og neurale netværk.

En af de enkleste og mest almindelige tilgange kaldes "Bag of Words." Det er blevet brugt af kommercielle analyseprodukter, herunder Clarabridge, Radian6 og andre.

Metoden er relativt enkel: givet et sæt emner og et sæt vilkår, der er knyttet til hvert emne, skal du bestemme, hvilke emner der findes i et dokument (for eksempel en sætning).

Mens andre, mere eksotiske algoritmer også organiserer ord i "poser", i denne teknik opretter vi ikke en model eller anvender matematik på den måde, hvorpå denne "taske" krydser et klassificeret dokument. Et dokuments klassifikation vil være polymorf, da det kan knyttes til flere emner.

Virker det for simpelt til at være nyttigt? Prøv det, før du springer til konklusioner. I NLP er det ofte tilfældet, at en simpel tilgang nogle gange kan gå langt.

Vi har brug for tre ting:

  • En emne / orddefinitionsfil
  • En klassificeringsfunktion
  • En notesbog til test af vores klassifikator

Og så vil vi gå lidt længere og bygge og teste en forudsigende model ved hjælp af vores klassificeringsdata.

Emner og ord

Vores definitionsfil er i JSON-format. Vi bruger den til at klassificere meddelelser mellem patienter og en sygeplejerske, der er tildelt deres pleje.

topics.json

Der er to punkter i denne definition.

Lad os først se på nogle vilkår nogle vilkår. For eksempel er "bruis" en stilk. Det dækker supersæt som "blå mærker", "blå mærker" og så videre. For det andet er udtryk, der indeholder * , faktisk mønstre , for eksempel * dpm er et mønster for en numerisk d igit efterfulgt af "pm".

For at holde tingene enkle håndterer vi kun numerisk mønstermatchning, men dette kan udvides til et bredere anvendelsesområde.

Denne evne til at finde mønstre inden for et udtryk er meget nyttig til klassificering af dokumenter, der indeholder datoer, klokkeslæt, monetære værdier osv.

Lad os prøve nogle klassifikationer.

Klassifikatoren returnerer et JSON-resultatsæt, der indeholder sætningen / sætningerne, der er knyttet til hvert emne, der findes i meddelelsen. En meddelelse kan indeholde flere sætninger, og en sætning kan knyttes til ingen, et eller flere emner.

Lad os se på vores klassifikator. Koden er her.

msgClassify.py

Koden er relativt ligetil og inkluderer en bekvemmelighed til at opdele et dokument i sætninger.

Forudsigelig modellering

Den samlede klassifikation for et sæt dokumenter, der er knyttet til et resultat, kan bruges til at opbygge en forudsigende model.

I denne brugstilfælde ville vi se, om vi kunne forudsige hospitalsindlæggelser baseret på meddelelserne mellem patient og sygeplejerske før hændelsen. Vi sammenlignede meddelelser til patienter, der gjorde og ikke fik hospitaliseringer.

Du kan bruge en lignende teknik til andre typer beskeder forbundet med noget binært resultat.

Denne proces tager en række trin:

  • Et sæt meddelelser klassificeres, og hvert emne modtager en optælling for dette sæt. Resultatet er en fast liste over emner med en% -allokering fra meddelelserne.
  • Emnetildelingen tildeles derefter en binær værdi , i vores tilfælde en 0, hvis der ikke var nogen indlæggelse og en 1, hvis der var en indlæggelse
  • En logistisk regressionsalgoritme bruges til at opbygge en forudsigende model
  • Modellen bruges til at forudsige resultatet fra nye input

Lad os se på vores inputdata. Dine data skal have en lignende struktur. Vi bruger en panda DataFrame.

"Hændelse" er det binære resultat, og det skal være den første kolonne i inputdataene.

Hver efterfølgende kolonne er et emne og% af klassifikationen fra det sæt meddelelser, der tilhører patienten.

I række 0, ser vi, at omkring en fjerdedel af de meddelelser for denne patient er omkring tak emne, og ingen er over medicinske termer eller penge . Således er hver række et binært resultat og en klassificeringsprofil for beskeder på tværs af emner.

Dine inputdata vil have forskellige emner, forskellige kolonnetiketter og en anden binær tilstand, men ellers vil de have en lignende struktur.

Lad os bruge scikit-lære til at opbygge en logistisk regression og teste vores model.

Her er vores output:

precision recall f1-score support 0 0.66 0.69 0.67 191 1 0.69 0.67 0.68 202avg / total 0.68 0.68 0.68 393

Præcisionen og tilbagekaldelsen af ​​denne model i forhold til testdataene er i high-60'erne - lidt bedre end et gæt , og desværre ikke nøjagtig nok til at være af stor værdi.

I dette eksempel var datamængden relativt lille (tusind patienter, ~ 30 beskeder, der blev udtaget pr. Patient). Husk, at kun halvdelen af ​​dataene kan bruges til træning, mens den anden halvdel (efter blanding) bruges til at teste.

Ved at medtage strukturerede data som alder, køn, tilstand, tidligere hændelser osv. Kunne vi styrke vores model og producere et stærkere signal. At have flere data vil også være nyttigt, da antallet af træningsdatakolonner er ret stort.

Prøv dette med dine strukturerede / ustrukturerede data, og se om du kan få en meget forudsigelig model. Du får muligvis ikke den slags præcision, der fører til automatiserede handlinger, men en "risiko" sandsynlighed kan bruges som en filter- eller sorteringsfunktion eller som et tidligt advarselsskilt for menneskelige eksperter.

"Bag of Words" -tilgangen er velegnet til visse former for tekstklassificeringsarbejde, især hvor sproget ikke er nuanceret.

God fornøjelse.