Πώς να εξαγάγετε λέξεις-κλειδιά από κείμενο με TF-IDF και το Scikit-Learn της Python's

Το 2006, όταν έπρεπε να χρησιμοποιήσω το TF-IDF για εξαγωγή λέξεων-κλειδιών στην Java, κατέληξα να γράψω όλο τον κώδικα από το μηδέν. Τόσο η Επιστήμη των Δεδομένων όσο και το GitHub δεν ήταν κάτι τότε και οι βιβλιοθήκες ήταν περιορισμένες.

Ο κόσμος είναι πολύ διαφορετικός σήμερα. Έχετε πολλές βιβλιοθήκες και αποθετήρια κώδικα ανοιχτού κώδικα στο Github που παρέχουν μια αξιοπρεπή εφαρμογή του TF-IDF. Εάν δεν χρειάζεστε πολύ έλεγχο σχετικά με τον τρόπο υπολογισμού των μαθηματικών TF-IDF, συνιστώ ανεπιφύλακτα να χρησιμοποιήσετε ξανά βιβλιοθήκες από γνωστά πακέτα, όπως το Spark's MLLib ή το scikit-learn της Python.

Το μόνο πρόβλημα που παρατήρησα με αυτές τις βιβλιοθήκες είναι ότι προορίζονται ως προ-βήμα για άλλες εργασίες όπως ομαδοποίηση, μοντελοποίηση θεμάτων και ταξινόμηση κειμένου. Το TF-IDF μπορεί πραγματικά να χρησιμοποιηθεί για την εξαγωγή σημαντικών λέξεων-κλειδιών από ένα έγγραφο για να κατανοήσει τι χαρακτηρίζει ένα έγγραφο. Για παράδειγμα, εάν ασχολείστε με άρθρα της Wikipedia, μπορείτε να χρησιμοποιήσετε το tf-idf για να εξαγάγετε λέξεις που είναι μοναδικές για ένα συγκεκριμένο άρθρο. Αυτές οι λέξεις-κλειδιά μπορούν να χρησιμοποιηθούν ως μια πολύ απλή περίληψη ενός εγγράφου, και για κείμενο-αναλυτικά στοιχεία όταν εξετάζουμε αυτές τις λέξεις-κλειδιά συνολικά.

Σε αυτό το άρθρο , θα σας δείξω πώς μπορείτε να χρησιμοποιήσετε το scikit-learning για να εξαγάγετε λέξεις-κλειδιά από έγγραφα χρησιμοποιώντας TF-IDF. Αυτό θα το κάνουμε ειδικά σε ένα σύνολο δεδομένων υπερχείλισης στοίβας. Εάν θέλετε πρόσβαση στο πλήρες σημειωματάριο Jupyter , μεταβείτε στο repo μου.

Σημαντική σημείωση: Υποθέτω ότι οι άνθρωποι που ακολουθούν αυτό το σεμινάριο είναι ήδη εξοικειωμένοι με την έννοια του TF-IDF. Εάν δεν είστε, εξοικειωθείτε με την ιδέα πριν διαβάσετε. Υπάρχουν μερικά βίντεο στο διαδίκτυο που δίνουν μια διαισθητική εξήγηση για το τι είναι. Για μια πιο ακαδημαϊκή εξήγηση, θα συνιστούσα την εξήγηση του διδακτορικού μου συμβούλου.

Σύνολο δεδομένων

Σε αυτό το παράδειγμα, θα χρησιμοποιούμε ένα σύνολο δεδομένων Stack Overflow που είναι λίγο θορυβώδες και προσομοιώνει αυτό που θα μπορούσατε να αντιμετωπίσετε στην πραγματική ζωή. Μπορείτε να βρείτε αυτό το σύνολο δεδομένων στο εκπαιδευτικό μου repo.

Παρατηρήστε ότι υπάρχουν δύο αρχεία . Το μεγαλύτερο αρχείο, stackoverflow-data-idf.jsonμε 20.000 αναρτήσεις, χρησιμοποιείται για τον υπολογισμό της συχνότητας αντίστροφων εγγράφων (IDF). Το μικρότερο αρχείο, stackoverflow-test.jsonμε 500 δημοσιεύσεις, θα χρησιμοποιηθεί ως δοκιμαστικό σετ για την εξαγωγή λέξεων-κλειδιών από. Αυτό το σύνολο δεδομένων βασίζεται στο δημόσια διαθέσιμο Stack Overflow dump από το Big Query της Google.

Ας ρίξουμε μια ματιά στο σύνολο δεδομένων μας. Ο παρακάτω κώδικας διαβάζει μια συμβολοσειρά json μίας γραμμής από data/stackoverflow-data-idf.jsonένα πλαίσιο δεδομένων pandas και εκτυπώνει το σχήμα και τον συνολικό αριθμό δημοσιεύσεων.

Εδώ, lines=Trueαπλά σημαίνει ότι αντιμετωπίζουμε κάθε γραμμή στο αρχείο κειμένου ως ξεχωριστή συμβολοσειρά json.

Σημειώστε ότι αυτό το σύνολο δεδομένων Stack Overflow περιέχει 19 πεδία, όπως τίτλο ανάρτησης, σώμα, ετικέτες, ημερομηνίες και άλλα μεταδεδομένα που δεν χρειαζόμαστε για αυτό το σεμινάριο. Για αυτό το σεμινάριο, ενδιαφερόμαστε κυρίως για το σώμα και τον τίτλο. Αυτά θα γίνουν πηγή κειμένου για εξαγωγή λέξεων-κλειδιών.

Θα δημιουργήσουμε τώρα ένα πεδίο που συνδυάζει bodyκαι τα δύο και titleέτσι έχουμε τα δύο σε ένα πεδίο. Θα εκτυπώσουμε επίσης τη δεύτερη καταχώριση κειμένου στο νέο μας πεδίο μόνο για να δούμε πώς φαίνεται το κείμενο.

Ω, αυτό δεν φαίνεται πολύ ευανάγνωστο! Λοιπόν, αυτό οφείλεται σε όλο τον καθαρισμό που έγινε pre_process(..). Μπορείτε να κάνετε πολύ περισσότερα πράγματα pre_process(..), όπως να εξαλείψετε όλες τις ενότητες κώδικα και να ομαλοποιήσετε τις λέξεις στη ρίζα του. Για απλότητα, θα εκτελέσουμε μόνο κάποια ήπια προεπεξεργασία.

Δημιουργία λεξιλογίου και μετρήσεων λέξεων για το IDF

Τώρα πρέπει να δημιουργήσουμε το λεξιλόγιο και να ξεκινήσουμε τη διαδικασία μέτρησης. Μπορούμε να χρησιμοποιήσουμε το CountVectorizer για να δημιουργήσουμε ένα λεξιλόγιο από όλο το κείμενο στο δικό μας df_idf['text'], ακολουθούμενο από το πλήθος των λέξεων στο λεξιλόγιο:

Το αποτέλεσμα των δύο τελευταίων γραμμών από τον παραπάνω κώδικα είναι μια αραιή αναπαράσταση μήτρας των μετρήσεων. Κάθε στήλη αντιπροσωπεύει μια λέξη στο λεξιλόγιο. Κάθε σειρά αντιπροσωπεύει το έγγραφο στο σύνολο δεδομένων μας, όπου οι τιμές είναι η λέξη μετράει.

Σημειώστε ότι, με αυτήν την αναπαράσταση, οι μετρήσεις ορισμένων λέξεων θα μπορούσαν να είναι 0 εάν η λέξη δεν εμφανιζόταν στο αντίστοιχο έγγραφο.

Εδώ περνάμε δύο παραμέτρους στο CountVectorizer max_dfκαι stop_words. Το πρώτο είναι απλώς να αγνοήσουμε όλες τις λέξεις που έχουν εμφανιστεί στο 85% των εγγράφων, καθώς αυτές μπορεί να είναι ασήμαντες. Το τελευταίο είναι μια προσαρμοσμένη λίστα λέξεων διακοπής. Μπορείτε επίσης να χρησιμοποιήσετε λέξεις διακοπής που είναι εγγενείς στο sklearn από τη ρύθμιση stop_words='english'. Η λίστα λέξεων διακοπής που χρησιμοποιείται για αυτό το σεμινάριο βρίσκεται εδώ.

Το προκύπτον σχήμα του word_count_vectorείναι (20000.124901) δεδομένου ότι έχουμε 20.000 έγγραφα στο σύνολο δεδομένων μας (οι σειρές) και το μέγεθος του λεξιλογίου είναι 124.901.

Σε ορισμένες εφαρμογές εξόρυξης κειμένου, όπως ομαδοποίηση και ταξινόμηση κειμένου, συνήθως περιορίζουμε το μέγεθος του λεξιλογίου. Είναι πολύ εύκολο να το κάνετε αυτό ρυθμίζοντας max_features=vocab_sizeκατά την εκκίνηση του CountVectorizer. Για αυτό το σεμινάριο ας περιορίσουμε το μέγεθος του λεξιλογίου μας σε 10.000:

Τώρα, ας δούμε 10 λέξεις από το λεξιλόγιό μας:

['serializing', 'private', 'struct', 'public', 'class', 'contains', 'properties', 'string', 'serialize', 'attempt']

Γλυκά, σχετίζονται κυρίως με τον προγραμματισμό.

TfidfTransformer για τον υπολογισμό του IDF

Ήρθε η ώρα να υπολογίσετε τις τιμές IDF.

Στον παρακάτω κώδικα, παίρνουμε ουσιαστικά τον αραιό πίνακα από το CountVectorizer ( word_count_vector) για να δημιουργήσουμε το IDF όταν καλείτε fit(...):

Εξαιρετικά σημαντικό σημείο : το IDF πρέπει πάντα να βασίζεται σε μια μεγάλη εταιρεία και να είναι αντιπροσωπευτικό των κειμένων που θα χρησιμοποιούσατε για εξαγωγή λέξεων-κλειδιών. Έχω δει πολλά άρθρα στον Ιστό που υπολογίζουν το IDF χρησιμοποιώντας μια χούφτα έγγραφα. Θα νικήσετε ολόκληρο τον σκοπό της στάθμισης IDF εάν δεν βασίζεται σε μια μεγάλη εταιρεία όπως:

  1. το λεξιλόγιό σας γίνεται πολύ μικρό και
  2. έχετε περιορισμένη ικανότητα να παρατηρείτε τη συμπεριφορά των λέξεων που γνωρίζετε.

Υπολογισμός TF-IDF και εξαγωγή λέξεων-κλειδιών

Μόλις υπολογίσουμε το IDF μας, είμαστε έτοιμοι να υπολογίσουμε το TF-IDF και στη συνέχεια να εξαγάγουμε κορυφαίες λέξεις-κλειδιά από τα διανύσματα TF-IDF.

Σε αυτό το παράδειγμα, θα εξαγάγουμε τις κορυφαίες λέξεις-κλειδιά για τις ερωτήσεις στο data/stackoverflow-test.json. Αυτό το αρχείο δεδομένων έχει 500 ερωτήσεις με πεδία όμοια με αυτά data/stackoverflow-data-idf.jsonπου είδαμε παραπάνω. Θα ξεκινήσουμε διαβάζοντας το δοκιμαστικό αρχείο μας, εξάγοντας τα απαραίτητα πεδία - τίτλο και σώμα - και εισάγοντας τα κείμενα σε μια λίστα.

Το επόμενο βήμα είναι να υπολογίσετε την τιμή tf-idf για ένα δεδομένο έγγραφο στο σύνολο δοκιμών μας, κάνοντας κλήση tfidf_transformer.transform(...). Αυτό δημιουργεί ένα διάνυσμα βαθμολογιών tf-idf.

Στη συνέχεια, ταξινομούμε τις λέξεις στο διάνυσμα με φθίνουσα σειρά των τιμών tf-idf και μετά επαναλαμβάνουμε για εξαγωγή των λέξεων-κλειδιών top-n. Στο παρακάτω παράδειγμα, εξάγουμε λέξεις-κλειδιά για το πρώτο έγγραφο στο σύνολο δοκιμών μας.

Η sort_coo(...)μέθοδος ταξινομεί ουσιαστικά τις τιμές στο διάνυσμα διατηρώντας παράλληλα το ευρετήριο στηλών. Μόλις έχετε το ευρετήριο στηλών, τότε είναι πολύ εύκολο να αναζητήσετε την αντίστοιχη τιμή λέξης, όπως θα δείτε στο extract_topn_from_vector(...)πού βρισκόμαστε feature_vals.append(feature_names[idx]).

Μερικά αποτελέσματα!

Σε αυτήν την ενότητα, θα δείτε την ερώτηση υπερχείλισης στοίβας ακολουθούμενη από τις αντίστοιχες εξαγόμενες λέξεις-κλειδιά.

Ερώτηση σχετικά με την ενσωμάτωση του Eclipse Plugin

Από τις παραπάνω λέξεις-κλειδιά, οι κορυφαίες λέξεις-κλειδιά πραγματικά νόημα, μιλά για eclipse, maven, integrate, war, και tomcat, τα οποία είναι όλα μοναδικά για το συγκεκριμένο ζήτημα.

Υπάρχουν μερικές λέξεις-κλειδιά που θα μπορούσαν να έχουν εξαλειφθεί, όπως possibilityκαι ίσως ακόμη και project. Μπορείτε να το κάνετε προσθέτοντας πιο κοινές λέξεις στη λίστα διακοπών σας. Μπορείτε ακόμη και να δημιουργήσετε το δικό σας σύνολο stop list, πολύ συγκεκριμένο για τον τομέα σας.

Τώρα ας δούμε ένα άλλο παράδειγμα.

Ερώτηση σχετικά με την εισαγωγή SQL

Ακόμη και με όλες τις ετικέτες html, λόγω της προεπεξεργασίας, μπορούμε να εξαγάγουμε μερικές πολύ ωραίες λέξεις-κλειδιά εδώ. Η τελευταία λέξη appropriatelyθα μπορούσε να χαρακτηριστεί ως λέξη διακοπής. Μπορείτε να συνεχίσετε να εκτελείτε διαφορετικά παραδείγματα για να λάβετε ιδέες για το πώς να τελειοποιήσετε τα αποτελέσματα.

Βόλα! Τώρα μπορείτε να εξαγάγετε σημαντικές λέξεις-κλειδιά από οποιονδήποτε τύπο κειμένου!

Πόροι

  • Πλήρης πηγαίος κώδικας και σύνολο δεδομένων για αυτό το σεμινάριο
  • Στοίβα δεδομένων υπερχείλισης στο BigQuery της Google

Ακολουθήστε το ιστολόγιό μου για να μάθετε περισσότερα Εξόρυξη κειμένου, NLP και Μηχανική Εκμάθηση από μια εφαρμοσμένη προοπτική.

Αυτό το άρθρο δημοσιεύθηκε αρχικά στο kavita-ganesan.com.