Μια εισαγωγή στο Bag of Words και πώς να το κωδικοποιήσετε στην Python για NLP

Λευκά και μαύρα πλακάκια scrabble σε μαύρη επιφάνεια από Pixabay

Το Bag of Words (BOW) είναι μια μέθοδος εξαγωγής χαρακτηριστικών από έγγραφα κειμένου. Αυτά τα χαρακτηριστικά μπορούν να χρησιμοποιηθούν για την κατάρτιση των αλγορίθμων μηχανικής μάθησης. Δημιουργεί ένα λεξιλόγιο από όλες τις μοναδικές λέξεις που εμφανίζονται σε όλα τα έγγραφα του σετ εκπαίδευσης.

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

Το BOW είναι μια προσέγγιση που χρησιμοποιείται ευρέως με:

  1. Επεξεργασία φυσικής γλώσσας
  2. Ανάκτηση πληροφοριών από έγγραφα
  3. Ταξινόμηση εγγράφων

Σε υψηλό επίπεδο, περιλαμβάνει τα ακόλουθα βήματα.

Οι δημιουργούμενοι φορείς μπορούν να εισαχθούν στον αλγόριθμο εκμάθησης της μηχανής σας.

Ας ξεκινήσουμε με ένα παράδειγμα για να κατανοήσουμε κάνοντας κάποιες προτάσεις και δημιουργώντας φορείς για αυτούς.

Εξετάστε τις παρακάτω δύο προτάσεις.

1. "Ο Ιωάννης αρέσει να βλέπει ταινίες.
2. "Ο John επίσης θέλει να παρακολουθήσει ποδοσφαιρικούς αγώνες."

Αυτές οι δύο προτάσεις μπορούν επίσης να εκπροσωπούνται με μια συλλογή λέξεων.

1. ['John', 'likes', 'to', 'watch', 'movies', 'Mary', 'likes', 'movies', 'too.']
2. ['John', 'επίσης', 'likes', 'to', 'watch', 'football', 'games']

Επιπλέον, για κάθε πρόταση, αφαιρέστε πολλαπλές εμφανίσεις της λέξης και χρησιμοποιήστε τον αριθμό λέξεων για να την αντιπροσωπεύσετε.

1. "John": 1, "likes": 2, "to": 1, "watch": 1, "movies": 2, "Mary"
2. {"John": 1, "επίσης": 1, "likes": 1, "to": 1, "watch": 1, "ποδόσφαιρο"

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

 {"John": 2, "likes": 3, "to": 2, "watch": 2, "movies" ποδόσφαιρο ": 1," παιχνίδια ": 1}

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

Το μήκος του φορέα θα είναι πάντα ίσο με το μέγεθος του λεξιλογίου. Σε αυτή την περίπτωση το μήκος του φορέα είναι 11.

Για να αναπαραστήσουμε τις πρωτότυπες προτάσεις σε ένα διάνυσμα, κάθε διάνυσμα αρχικοποιείται με όλα τα μηδενικά - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

Αυτό ακολουθείται από επανάληψη και σύγκριση με κάθε λέξη στο λεξιλόγιό μας και αύξηση της διανυσματικής τιμής εάν η πρόταση έχει αυτή τη λέξη.

Ο Ιωάννης αρέσει να βλέπει ταινίες. Η Mary αγαπά επίσης τις ταινίες.
[1, 2, 1, 1, 2, 1, 1, 0, 0, 0]
Ο John επίσης θέλει να παρακολουθήσει ποδοσφαιρικούς αγώνες.
[1, 1, 1, 1, 0, 0, 1, 1, 1]

Για παράδειγμα, στην πρόταση 1 η λέξη "likes" εμφανίζεται στη δεύτερη θέση και εμφανίζεται δύο φορές. Έτσι το δεύτερο στοιχείο του φορέα μας για την πρόταση 1 θα είναι 2: [1, 2, 1, 1, 2, 1, 1, 0, 0, 0]

Το διάνυσμα είναι πάντα ανάλογο με το μέγεθος του λεξιλογίου μας.

Ένα μεγάλο έγγραφο όπου το δημιουργούμενο λεξιλόγιο είναι τεράστιο μπορεί να οδηγήσει σε ένα διάνυσμα με πολλές τιμές 0. Αυτό ονομάζεται αραιό διάνυσμα. Οι αραιωμένοι φορείς απαιτούν περισσότερη μνήμη και υπολογιστικούς πόρους κατά τη μοντελοποίηση. Ο τεράστιος αριθμός θέσεων ή διαστάσεων μπορεί να κάνει τη διαδικασία μοντελοποίησης πολύ δύσκολη για τους παραδοσιακούς αλγορίθμους.

Κωδικοποίηση του αλγορίθμου BOW

Η εισαγωγή στον κώδικα μας θα είναι πολλαπλές προτάσεις και η έξοδος θα είναι οι φορείς.

Η συστοιχία εισόδου είναι αυτή:

["Ο Τζο περίμενε το τρένο", "Το τρένο ήταν αργά", "η Μαρία και η Σαμάνθα πήραν το λεωφορείο",
"Κοίταξα τη Μαρία και τη Σαμάνθα στο σταθμό λεωφορείων",
"Η Μαρία και η Σαμάνθα έφθασαν νωρίς στο σταθμό των λεωφορείων, αλλά περίμεναν μέχρι το μεσημέρι για το λεωφορείο"]

Βήμα 1: Δηλώστε μια πρόταση

Θα ξεκινήσουμε με την κατάργηση των προειδοποιητικών λέξεων από τις προτάσεις.

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

To Tokenization είναι η πράξη της διάσπασης μιας σειράς χορδών σε κομμάτια όπως λέξεις, λέξεις-κλειδιά, φράσεις, σύμβολα και άλλα στοιχεία που ονομάζονται μάρκες. Τα κουπόνια μπορούν να είναι μεμονωμένες λέξεις, φράσεις ή ακόμα και ολόκληρες προτάσεις. Στη διαδικασία του tokenization, ορισμένοι χαρακτήρες όπως τα σημεία στίξης απορρίπτονται.

def word_extraction (πρόταση):
    ignore = ['a', '', '' είναι '']
    λέξεις = re.sub ("[^ \ w]", "", πρόταση) .split ()
    cleaned_text = [w.lower () για το w σε λέξεις εάν w δεν αγνοείται]
    επιστροφή cleaned_text

Για πιο ισχυρή εφαρμογή των διακοπτών, μπορείτε να χρησιμοποιήσετε τη βιβλιοθήκη python nltk. Έχει ένα σύνολο προκαθορισμένων λέξεων ανά γλώσσα. Ακολουθεί ένα παράδειγμα:

εισαγωγή nltk
από τις εντολές εισαγωγής nltk.corpus
 set (stopwords.words ('αγγλικά'))

Βήμα 2: Εφαρμόστε το tokenization σε όλες τις προτάσεις

def tokenize (προτάσεις):
    λέξεις = []
    για πρόταση σε προτάσεις:
        w = εξήγηση λέξης (πρόταση)
        words.extend (w)
        
    λέξεις = ταξινομημένες (λίστα (σύνολο (λέξεις)))
    επιστροφή λέξεων

Η μέθοδος επαναλαμβάνει όλες τις προτάσεις και προσθέτει την εξαγόμενη λέξη σε μια συστοιχία.

Η έξοδος αυτής της μεθόδου θα είναι:

["και", "έφτασε", "σε", "λεωφορείο", "αλλά", "νωρίς", "για", "i", "joe", "late", " μεσημέρι ',' σαμάνθα ',' σταθμός ',' το ',' πήρε ',' τρένο ',' μέχρι ',' περίμενε ',' ήταν ']

Βήμα 3: Δημιουργήστε λεξιλόγιο και δημιουργήστε διανύσματα

Χρησιμοποιήστε τις μεθόδους που ορίζονται στα βήματα 1 και 2 για να δημιουργήσετε το λεξιλόγιο εγγράφων και να εξαγάγετε τις λέξεις από τις προτάσεις.

def generate_bow (allsentences):
    vocab = tokenize (allsentences)
    print ("Λίστα λέξεων για το έγγραφο \ n {0} \ n" .format (vocab));
για ποινή σε όλα τα άτομα:
        λέξεις = εξήγηση λέξης (πρόταση)
        bag_vector = numpy.zeros (len (vocab))
        για το w με λέξεις:
            για i, λέξη στο enumerate (vocab):
                αν λέξη == w:
                    bag_vector [i] + = 1
                    
        εκτύπωση ("{0} \ n {1} \ n" .format (πρόταση, numpy.array (bag_vector)))

Εδώ είναι η καθορισμένη εισαγωγή και εκτέλεση του κώδικα μας:

allseens = ["ο Joe περίμενε το τρένο", "το τρένο ήταν αργά", "η Mary και η Samantha πήραν το λεωφορείο",
"Κοίταξα τη Μαρία και τη Σαμάνθα στο σταθμό λεωφορείων",
"Η Μαρία και η Σαμάνθα έφθασαν νωρίς στο σταθμό των λεωφορείων, αλλά περίμεναν μέχρι το μεσημέρι για το λεωφορείο"]
generate_bow (allsentences)

Οι φορείς εξόδου για κάθε μια από τις προτάσεις είναι:

Παραγωγή:
Ο Τζο περίμενε το τρένο
[0. 0. 0. 0. 0. 0. 1. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 2. 0. 1. 0.]
Το τρένο καθυστέρησε
[0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 1. 0. 1. 0. 0. 1.]
Η Μαρία και η Σαμάνθα πήραν το λεωφορείο
[1. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 1. 0. 1. 0. 0. 1. 0. 0. 0. 0.]
Ψάξαμε τη Μαρία και τη Σαμάνθα στο σταθμό των λεωφορείων
[1. 0. 1. 1. 0. 0. 1. 1. 0. 0. 1. 1. 0. 1. 1. 0. 0. 0. 0. 0. 0.]
Η Μαρία και η Σαμάνθα έφθασαν νωρίς στο σταθμό των λεωφορείων, αλλά περίμεναν μέχρι το μεσημέρι για το λεωφορείο
[1. 1. 1. 2. 1. 1. 1. 0. 0. 0. 0. 1. 1. 1. 1. 0. 0. 0. 1. 1. 0.]

Όπως μπορείτε να δείτε, κάθε πρόταση συγκρίθηκε με τη λίστα λέξεων που δημιουργήσαμε στο Βήμα 1. Με βάση τη σύγκριση, η τιμή του στοιχείου διανυσματικού μπορεί να αυξηθεί. Αυτοί οι φορείς μπορούν να χρησιμοποιηθούν σε αλγόριθμους ML για ταξινόμηση εγγράφων και προβλέψεις.

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

Ενημερώσεις σε τσάντα λέξεων

Το μοντέλο BOW εξετάζει μόνο αν εμφανίζεται μια γνωστή λέξη σε ένα έγγραφο ή όχι. Δεν ενδιαφέρεται για το νόημα, το πλαίσιο και τη σειρά με την οποία εμφανίζονται.

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

Περιορισμοί του BOW

  1. Σημασιολογικό νόημα: η βασική προσέγγιση BOW δεν λαμβάνει υπόψη την έννοια της λέξης στο έγγραφο. Αγνοεί εντελώς το πλαίσιο στο οποίο χρησιμοποιείται. Η ίδια λέξη μπορεί να χρησιμοποιηθεί σε πολλά σημεία βάσει του πλαισίου ή των κοντινών λέξεων.
  2. Μέγεθος διάνυσμα: Για ένα μεγάλο έγγραφο, το μέγεθος του φορέα μπορεί να είναι τεράστιο με αποτέλεσμα πολλούς υπολογισμούς και χρόνο. Ίσως χρειαστεί να αγνοήσετε τις λέξεις με βάση τη συνάφεια με την περίπτωση χρήσης σας.

Αυτή ήταν μια μικρή εισαγωγή στη μέθοδο BOW. Ο κώδικας έδειξε πώς λειτουργεί σε χαμηλό επίπεδο. Υπάρχουν πολλά περισσότερα για την κατανόηση του BOW. Για παράδειγμα, αντί να χωρίζουμε τη φράση μας σε μία λέξη (1 γραμμάριο), μπορείτε να χωρίσετε το ζευγάρι δύο λέξεων (bi-gram ή 2-gram). Κατά καιρούς, η αναπαράσταση bi-gram φαίνεται να είναι πολύ καλύτερη από τη χρήση 1-γραμμάριο. Αυτά μπορούν συχνά να αναπαρασταθούν χρησιμοποιώντας σημειογραφία N-gram. Έχω απαριθμήσει μερικά ερευνητικά έγγραφα στο τμήμα πόρων για πιο εμπεριστατωμένη γνώση.

Δεν χρειάζεται να κωδικοποιήσετε το BOW όποτε το χρειάζεστε. Είναι ήδη μέρος πολλών διαθέσιμων πλαισίων όπως το CountVectorizer στη μάθηση sci-kit.

Ο προηγούμενος κώδικας μπορεί να αντικατασταθεί με:

από την εισαγωγή του sklearn.feature_extraction.text του CountVectorizer

vectorizer = CountVectorizer ()
X = vectorizer.fit_transform (allsentences)

εκτύπωση (X.toarray ())

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

Ευχαριστώ που διαβάσατε το άρθρο. Ο κώδικας που εμφανίζεται είναι διαθέσιμος στο GitHub μου.

Μπορείτε να με ακολουθήσετε στο Medium, στο Twitter και στο LinkedIn. Για οποιεσδήποτε ερωτήσεις, μπορείτε να επικοινωνήσετε μαζί μου μέσω e-mail (praveend806 [at] gmail [dot] com).

Πόροι για να διαβάσετε περισσότερα στην τσάντα λέξεων

  1. Wikipedia-BOW
  2. Κατανόηση του μοντέλου Bag-of-Words: Ένα στατιστικό πλαίσιο
  3. Σημασιολογία-Διατήρηση Τσάντα-από-Λόγια Μοντέλα και Εφαρμογές