Coder Social home page Coder Social logo

jaegon99 / personality-types-predictor Goto Github PK

View Code? Open in Web Editor NEW
1.0 1.0 0.0 14.72 MB

The project uses machine learning to create a classifier for the Myers-Briggs Type Indicator (MBTI), a metric that summarizes different personality characteristics. Results are provided after the analysis of a Twitter account feed.

License: MIT License

Python 50.39% CSS 23.44% HTML 26.17%
python twitter mbti flask machine-learning

personality-types-predictor's Introduction

Personality Types Predictor

Questo progetto nasce come replica ed estensione di un lavoro già esistente, discusso nel report disponibile nell’archivio di web.stanford.edu[1]. Il progetto utilizza il machine learning per creare il classificatore per il Myers-Briggs Type Indicator (MBTI) [2], una metrica che utilizza un risultato di 4 lettere (es. INFJ o ENFP) per riassumere le diverse caratteristiche della personalità in termini di come gli individui percepiscono il mondo e prendono decisioni.

Il lavoro presentato espande tutto quello che viene discusso nel report e presenta delle estensioni al progetto originale, come l’utilizzo dell’API di Twitter per acquisire il feed di un account per poi classificarlo in tempo reale e il confronto tra i due classificatori di tipi differenti citati nel report per verificare quale approccio sia il più vantaggioso.

Normalmente questo risultato deriva dall’utilizzo di questionari e test psicometrici somministrati a ciascuna persona, ma qui otterremo automaticamente un risultato attraverso una semplice interfaccia grafica web, alla quale basta fornire soltanto l’handle del proprio account Twitter.

Il tutto è realizzato principalmente in Python, ad eccezione dell’interfaccia web che viene comunque gestita da python tramite l’utilizzo di Flask.

Introduzione - MBTI

L'obiettivo dell'MBTI è quello di consentire agli intervistati di esplorare e comprendere la propria personalità, compresi i propri gusti, antipatie, punti di forza, punti deboli, possibili preferenze di carriera e compatibilità con altre persone. Nessun tipo di personalità è migliore o peggiore dell’altra. Il questionario stesso è centrato sull’analisi di quattro dicotomie:

Estroversione (E) – Introversione (I)

La dicotomia estroversione-introversione si utilizza come un metodo per descrivere come le persone rispondono e interagiscono con il mondo che li circonda. Gli estroversi sono "volti verso l'esterno" e tendono ad essere orientati all'azione mentre gli introversi tendono ad essere orientati al pensiero.


Sensibilità (S) – Intuizione (N)

Questa implica l'osservazione di come le persone raccolgono informazioni dal mondo che le circonda. Le persone che preferiscono la sensibilità tendono a prestare molta attenzione alla realtà, in particolare a ciò che possono imparare dai propri sensi, mentre coloro che preferiscono l'intuizione prestano maggiore attenzione alle possibilità e alla pianificazione del proprio futuro.


Pensare (V) – Sentire (F)

Questa scala si concentra su come le persone prendono decisioni in base alle informazioni che hanno raccolto dalle loro funzioni di rilevamento o intuizione. Le persone che preferiscono pensare danno maggiore enfasi ai fatti e ai dati oggettivi. Coloro che preferiscono i sentimenti sono più propensi a considerare le persone e le emozioni quando arrivano a una conclusione.


Giudicare (J) – Percepire (P)

L’ultima dicotomia riguarda il modo in cui le persone tendono a trattare con il mondo esterno. Coloro che tendono a giudicare preferiscono pensiero strutturato e le decisioni ferme. Le persone che propendono per la percezione sono più aperte, flessibili e adattabili

Dataset

Il dataset[3] utilizzato è disponibile pubblicamente su Kaggle. Si tratta di un csv contenente oltre 8600 righe di dati, nel quale ognuna è composta da due colonne con i dati relativi ad una profilo:

  • Il tipo (codice/tipo MBTI di 4 lettere di questa persona)
  • Una sezione di ciascuna degli ultime 50 post che hanno pubblicato ogni voce separata da 3 caratteri pipe "|||"

Questi dati sono stati raccolti tramite PersonalityCafe, un forum online in cui gli utenti registrati sono stati sottoposti al questionario per l’assegnazione del loro tipo MBTI, per essere poi liberi di chattare con altri utenti sul forum. Poiché ci sono cinquanta post inclusi per ogni utente, il numero di post è circa 430000.

Anteprima delle prime 5 righe dei dati

Proporzionalità

Un problema evidente in questo dataset è la rappresentazione non uniforme dei tipi, che non rispettano le proporzioni del mondo reale. Questo, come discusso nel report, rende necessaria una modifica per riportare una proporzione uniforme nel test set. Pertanto, si è operata una selezione sul dataset selezionando il tipo di MBTI con il minor numero di post e seguendo il riferimento alle proporzioni trovate su myersbriggs.org [4] si è creato un test set che rispetta le proporzioni reali.


Proporzioni dei tipi nel Dataset


In questo modo si cercano di prevenire gli errori nei risultati, dovuti alla rappresentazione distorta delle classi nel set di test che sono indicati nel grafico sottostante.


Stop words

Il dataset analizzato proviene da un forum online, diventa dunque necessario la rimozione di alcune parole che nell’analisi risulterebbero di poco valore. Ad esempio, nei post sono presenti le cosiddette stop words, link a siti esterni ed anche codici per rappresentare emoticons. Infine sono stati rimossi anche i riferimenti espliciti ai tipi stessi (ad es. 'INTJ', 'INFP', ecc.), in modo da prevenire al modello imparando a riconoscere i tipi di MBTI per nome. La rimozione è stata effettuata tramite l’utilizzo di Natural Language Toolkit (NLTK), una libreria Python open source per l'elaborazione del linguaggio naturale e con l’utilizzo delle regex per identificare links e emoticons/emoji.

Lemmatizzazione

Per la lemmatizzazione è stato utilizzato il WordNetLemmatizer sempre della libreria NLTK. Lemmatizzare il testo significa ridurre più forme differenti della stessa parola ad un’unica parola radice. Questo ci permette di ricondurre più forme della stessa parola ad un unico significato e semplifica notevolmente il lavoro del classificatore.

Tokenizzazione

Utilizzando un tokenizzatore presente nella libreria Keras, sono state tokenizzate le 2500 parole più comuni del testo lemmatizzato. In questo modo il testo viene trasformato una serie di elenchi di interi selezionati dal nostro vocabolario, eliminando dal testo tutte le parole che non sono presenti nel dizionario. Così facendo si rimuovono quelle parole che non avrebbero avuto lo stesso impatto nel modello.

Padding

Poiché i post tokenizzati sono di lunghezza molto variabile, procediamo rendendoli tutti della stessa lunghezza. Viene allora aggiunto del padding per ogni post tokenizzato in modo tale che abbia esattamente 40 interi. Se sono presenti meno di 40 interi nel post tokenizzato, vengono aggiunti degli zero fino a quando non abbiamo raggiunto la dimensione e vengono rimossi se ce ne sono di più.

Modello

Embedding Layer

Per l’embedding layer si usa una embedding matrix sotto forma di dizionario che mappa ogni parola lemmatizzata alla rappresentazione GloVe a 50 dimensioni di quella parola. GloVe (Global Vectors for Word Representation) è un algoritmo per ottenere rappresentazioni vettoriali per le parole. Il file che andremo ad utilizzare, a differenza del progetto originario, il vettore pre-addestrato su un enorme quantità di dati presi direttamente da Twitter, disponibile sul repository ufficiale[5].

  • Twitter (2B tweets, 27B tokens, 1.2M vocab, 200d vectors, 1.42 GB)

Recurrent Neural Network

Sempre seguendo le indicazioni del report e dato che il set di dati che viene utilizzato è composto da dati di testo sequenziali, confermiamo l’utilizzo di una rete neurale ricorrente (RNN). Tra i vari tipi di reti neurali ricorrenti (RNN) per questo passaggio, si sceglie di utilizzare l'opzione LSTM. Ci serviamo sempre della libreria Keras per importare i vari layer e modelli utilizzati.

Dense Layer e Ottimizzazione

Infine, utilizziamo uno dense layer con la sigmoide come funzione di attivazione per produrre un valore compreso tra 0 e 1, che rappresenta la probabilità di classe prevista, poiché ci sono solo due classi. Inoltre, seguendo il report, viene utilizzata binary crossentropy per la loss function (poiché ci sono solo due classi) e un ottimizzatore Adam dalla libreria degli optimizers per karas di tensorflow.

Esperimento

Una volta osservata la natura dell'indicatore Myers-Briggs ed anche la sproporzionalità delle classi nel test set, si sceglie di suddividere la classificazione delle 16 classi in quattro attività di classificazione, facendo riferimento alle quattro dicotomie dell’indicatore. Questo perché un tipo MBTI è composto da quattro classi binarie, dove ogni classe binaria rappresenta una dimensione della personalità come teorizzato dagli inventori del modello.

Pertanto si andranno ad addestrare quattro diversi classificatori binari, in modo tale che ciascuno sia specializzato in una delle dimensioni della personalità. La somma dei risultati andrà a rappresentare il tipo di indicatore.

Per confrontare i risultati con il report è stata svolta la classificazione dei post sul test set pre-elaborato e previsto la classe per ogni singolo post. Sono stati prodotti dunque l’accuracy e una matrice di confusione per ogni dimensione MBTI.

Allo stesso modo sono stati addestrati quattro classificatori Naive Bayes per le quattro dimensioni della personalità. Questo confronto con un classificatore Bayesiano servirà a determinare se l'utilizzo della RNN riesca a produrre risultati superiori come afferma il report. Si utilizza un MultinomialNB come classificatore per il confronto dalla libreria sklearn.

Due to the fact that our data set is composed of sequential text data, we decided to use a recurrent neural network in order to capture some of the information in the text data that would otherwise be ignored (e.g. as with a naive Bayes classifier).


Risultati

Per la classificazione dei post sul test set precedentemente elaborato, abbiamo una previsione della classe per ogni singolo post. Ad entrambi è stata applicata la k-fold cross validation (CV) che consiste nella suddivisione dell'insieme di dati totale in k=5 parti di uguale numerosità e, a ogni passo, la kª parte dell'insieme di dati viene utilizzata come test set, mentre la restante parte costituisce il train set.

Qui seguono Il punteggio di accuratezza e una matrice di confusione per ogni dimensione MBTI per il classificatore RNN.


Accuracy e Confusion Matrix per RNN


Sebbene ciò sembri indicare una debole capacità complessiva del nostro modello di classificare correttamente tutte e quattro le dimensioni MBTI, va notato che, in effetti, altri modelli che si concentrano sulla classificazione multiclasse di MBTI possono ottenere una maggiore precisione della classificazione perfetta, ma lo fanno rischiando di sbagliare completamente la loro previsione. Il modello rappresenta un compromesso di questi due aspetti: otteniamo tassi inferiori di classificazione perfetta in cambio di tassi più elevati di classificazione approssimativamente corretta.

Per la classificazione dei post sul test set precedentemente elaborato, abbiamo una previsione della classe per ogni singolo post, questa volta utilizzando i classificatori Bayesiani, che effettivamente, come affermato nel report, hanno prodotto dei risultati meno accurati. Qui seguono Il punteggio di accuratezza e una matrice di confusione per ogni dimensione MBTI.


Accuracy e Confusion Matrix per NBC



Twitter

Tramite l’utilizzo dell’API fornita da Twitter dopo la creazione di un account da sviluppatore, il sistema riesce a recuperare in forma testuale gli ultimi 100 post dal profilo della persona analizzata. A questi viene eseguito lo stesso lavoro di rimozione, lemmatizzazione e tokenizzazione che è stato descritto in precedenza per il dataset. Su questi dati viene utilizzato il modello per determinare il tipo di MBTI.

Interfaccia

L’interfaccia è una pagina web che può essere aperta in locale attraverso l’esecuzione di main.py. Qui attraverso l’utilizzo di Flask avviene la comunicazione tra la pagina web e il sistema, che una volta ricevuto l’handle recupera i post e avvia la procedura.

Segue uno screen dell’interfaccia grafica a termine dell’esecuzione del processo.

Proporzioni dei tipi nel Dataset

Rifetimenti

personality-types-predictor's People

Contributors

jaegon99 avatar

Stargazers

 avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.