You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ML-For-Beginners/translations/el/6-NLP/5-Hotel-Reviews-2/README.md

35 KiB

Ανάλυση συναισθήματος με κριτικές ξενοδοχείων

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

Προ-διάλεξη κουίζ

Λειτουργίες φιλτραρίσματος & ανάλυσης συναισθήματος

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

Άσκηση: λίγη περισσότερη επεξεργασία δεδομένων

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

  1. Αρχική επεξεργασία στηλών

    1. Απορρίψτε τις lat και lng

    2. Αντικαταστήστε τις τιμές της Hotel_Address με τις ακόλουθες τιμές (αν η διεύθυνση περιέχει το όνομα της πόλης και της χώρας, αλλάξτε την να είναι μόνο πόλη και χώρα).

      Αυτές είναι οι μόνες πόλεις και χώρες στο σύνολο δεδομένων:

      Άμστερνταμ, Ολλανδία

      Βαρκελώνη, Ισπανία

      Λονδίνο, Ηνωμένο Βασίλειο

      Μιλάνο, Ιταλία

      Παρίσι, Γαλλία

      Βιέννη, Αυστρία

      def replace_address(row):
          if "Netherlands" in row["Hotel_Address"]:
              return "Amsterdam, Netherlands"
          elif "Barcelona" in row["Hotel_Address"]:
              return "Barcelona, Spain"
          elif "United Kingdom" in row["Hotel_Address"]:
              return "London, United Kingdom"
          elif "Milan" in row["Hotel_Address"]:        
              return "Milan, Italy"
          elif "France" in row["Hotel_Address"]:
              return "Paris, France"
          elif "Vienna" in row["Hotel_Address"]:
              return "Vienna, Austria" 
      
      # Αντικαταστήστε όλες τις διευθύνσεις με μια συντομευμένη, πιο χρήσιμη μορφή
      df["Hotel_Address"] = df.apply(replace_address, axis = 1)
      # Το άθροισμα των value_counts() θα πρέπει να ισούται με τον συνολικό αριθμό των αξιολογήσεων
      print(df["Hotel_Address"].value_counts())
      

      Τώρα μπορείτε να πραγματοποιήσετε ερωτήματα σε επίπεδο χώρας:

      display(df.groupby("Hotel_Address").agg({"Hotel_Name": "nunique"}))
      
      Hotel_Address Hotel_Name
      Άμστερνταμ, Ολλανδία 105
      Βαρκελώνη, Ισπανία 211
      Λονδίνο, Ηνωμένο Βασίλειο 400
      Μιλάνο, Ιταλία 162
      Παρίσι, Γαλλία 458
      Βιέννη, Αυστρία 158
  2. Επεξεργασία στήλων μετα-κριτικής ξενοδοχείου

  3. Απορρίψτε τη στήλη Additional_Number_of_Scoring

  4. Αντικαταστήστε το Total_Number_of_Reviews με το συνολικό αριθμό κριτικών για αυτό το ξενοδοχείο που υπάρχουν πραγματικά στο σύνολο δεδομένων

  5. Αντικαταστήστε το Average_Score με το δικό μας υπολογισμένο σκορ

# Αφαίρεση `Additional_Number_of_Scoring`
df.drop(["Additional_Number_of_Scoring"], axis = 1, inplace=True)
# Αντικατάσταση του `Total_Number_of_Reviews` και του `Average_Score` με δικές μας υπολογιζόμενες τιμές
df.Total_Number_of_Reviews = df.groupby('Hotel_Name').transform('count')
df.Average_Score = round(df.groupby('Hotel_Name').Reviewer_Score.transform('mean'), 1)
  1. Επεξεργασία στηλών κριτικής

    1. Απορρίψτε τις στήλες Review_Total_Negative_Word_Counts, Review_Total_Positive_Word_Counts, Review_Date και days_since_review

    2. Κρατήστε τις στήλες Reviewer_Score, Negative_Review, και Positive_Review όπως είναι,

    3. Κρατήστε τη στήλη Tags προς το παρόν

    • Θα κάνουμε περαιτέρω λειτουργίες φιλτραρίσματος στις ετικέτες στην επόμενη ενότητα και μετά οι ετικέτες θα απορριφθούν
  2. Επεξεργασία στηλών αξιολογητών

  3. Απορρίψτε τη στήλη Total_Number_of_Reviews_Reviewer_Has_Given

  4. Κρατήστε τη στήλη Reviewer_Nationality

Στήλες ετικετών

Η στήλη Tag είναι προβληματική καθώς είναι μια λίστα (σε μορφή κειμένου) αποθηκευμένη στη στήλη. Δυστυχώς η σειρά και ο αριθμός των υποτμημάτων σε αυτή τη στήλη δεν είναι πάντα ο ίδιος. Είναι δύσκολο για έναν άνθρωπο να εντοπίσει τις σωστές φράσεις που τον ενδιαφέρουν, επειδή υπάρχουν 515.000 σειρές, και 1427 ξενοδοχεία, και το καθένα έχει ελαφρώς διαφορετικές επιλογές που μπορεί να επιλέξει ένας αξιολογητής. Εδώ λάμπει το NLP. Μπορείτε να σαρώσετε το κείμενο και να βρείτε τις πιο κοινές φράσεις, και να τις μετρήσετε.

Δυστυχώς, δεν μας ενδιαφέρουν μονές λέξεις, αλλά πολύ-λέξεις φράσεις (π.χ. Επαγγελματικό ταξίδι). Η εκτέλεση ενός αλγορίθμου κατανομής συχνότητας πολύ-λέξεων σε τόσα δεδομένα (6762646 λέξεις) θα μπορούσε να πάρει πολύ χρόνο, αλλά χωρίς να δούμε τα δεδομένα, θα φαινόταν ότι αυτό είναι αναγκαία δαπάνη. Εδώ είναι χρήσιμη η εξερευνητική ανάλυση δεδομένων, γιατί έχετε δει ένα δείγμα από τις ετικέτες όπως [' Business trip ', ' Solo traveler ', ' Single Room ', ' Stayed 5 nights ', ' Submitted from a mobile device '], μπορείτε να αρχίσετε να ρωτάτε αν είναι δυνατό να μειώσετε πολύ την επεξεργασία που πρέπει να κάνετε. Ευτυχώς, αυτό είναι δυνατό - αλλά πρώτα πρέπει να ακολουθήσετε μερικά βήματα για να προσδιορίσετε τις ετικέτες που σας ενδιαφέρουν.

Φιλτράρισμα ετικετών

Θυμηθείτε ότι ο στόχος του συνόλου δεδομένων είναι να προσθέσει συναισθηματικές πληροφορίες και στήλες που θα σας βοηθήσουν να επιλέξετε το καλύτερο ξενοδοχείο (για εσάς ή ίσως για έναν πελάτη που σας ζητάει να δημιουργήσετε ένα bot σύστασης ξενοδοχείου). Πρέπει να αναρωτηθείτε αν οι ετικέτες είναι χρήσιμες ή όχι στο τελικό σύνολο δεδομένων. Εδώ είναι μια ερμηνεία (αν χρειάζεστε το σύνολο δεδομένων για άλλους λόγους, διαφορετικές ετικέτες μπορεί να παραμείνουν ή όχι στην επιλογή):

  1. Ο τύπος ταξιδιού είναι σημαντικός και πρέπει να παραμείνει
  2. Ο τύπος της ομάδας των καλεσμένων είναι σημαντικός και πρέπει να παραμείνει
  3. Ο τύπος δωματίου, σουίτας ή στούντιο που διέμεινε ο καλεσμένος δεν είναι σχετικός (όλα τα ξενοδοχεία έχουν βασικά τα ίδια δωμάτια)
  4. Η συσκευή από την οποία υποβλήθηκε η κριτική δεν είναι σχετική
  5. Ο αριθμός των διανυκτερεύσεων που διέμεινε ο αξιολογητής θα μπορούσε να είναι σημαντικός αν συσχετίσετε μεγαλύτερες διαμονές με τη μεγαλύτερη αρέσκεια στο ξενοδοχείο, αλλά είναι απίθανο, και πιθανώς άσχετο

Συνοψίζοντας, κρατήστε 2 είδη ετικετών και αφαιρέστε τις υπόλοιπες.

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

# Αφαιρέστε τις ανοιχτές και κλειστές αγκύλες
df.Tags = df.Tags.str.strip("[']")
# αφαιρέστε επίσης όλα τα εισαγωγικά
df.Tags = df.Tags.str.replace(" ', '", ",", regex = False)

Κάθε ετικέτα γίνεται κάτι σαν: Business trip, Solo traveler, Single Room, Stayed 5 nights, Submitted from a mobile device.

Στη συνέχεια βρίσκουμε ένα πρόβλημα. Κάποιες κριτικές ή σειρές έχουν 5 στήλες, άλλες 3, άλλες 6. Αυτό είναι αποτέλεσμα του πώς δημιουργήθηκε το σύνολο δεδομένων, και είναι δύσκολο να διορθωθεί. Θέλετε να πάρετε μια καταμέτρηση συχνότητας κάθε φράσης, αλλά είναι σε διαφορετική σειρά σε κάθε κριτική, οπότε η καταμέτρηση μπορεί να είναι λάθος, και ένα ξενοδοχείο μπορεί να μην πάρει μια ετικέτα που δικαιούται.

Αντίθετα, θα χρησιμοποιήσετε τη διαφορετική σειρά προς όφελός μας, γιατί κάθε ετικέτα είναι πολυλεκτική αλλά επίσης διαχωρίζεται με κόμμα! Ο πιο απλός τρόπος να το κάνετε είναι να δημιουργήσετε 6 προσωρινές στήλες με κάθε ετικέτα να εισάγεται στη στήλη που αντιστοιχεί στη θέση της στην ετικέτα. Μπορείτε έπειτα να συγχωνεύσετε τις 6 στήλες σε μία μεγάλη στήλη και να εκτελέσετε τη μέθοδο value_counts() στη στήλη αυτή. Τυπώνοντας αυτό, θα δείτε ότι υπήρχαν 2428 μοναδικές ετικέτες. Εδώ είναι ένα μικρό δείγμα:

Ετικέτα Αριθμός
Leisure trip 417778
Submitted from a mobile device 307640
Couple 252294
Stayed 1 night 193645
Stayed 2 nights 133937
Solo traveler 108545
Stayed 3 nights 95821
Business trip 82939
Group 65392
Family with young children 61015
Stayed 4 nights 47817
Double Room 35207
Standard Double Room 32248
Superior Double Room 31393
Family with older children 26349
Deluxe Double Room 24823
Double or Twin Room 22393
Stayed 5 nights 20845
Standard Double or Twin Room 17483
Classic Double Room 16989
Superior Double or Twin Room 13570
2 rooms 12393

Κάποιες από τις κοινές ετικέτες όπως το Submitted from a mobile device δεν μας είναι χρήσιμες, γι' αυτό ίσως είναι σοφό να αφαιρεθούν πριν μετρηθεί η εμφάνιση φράσεων, αλλά είναι τόσο γρήγορη λειτουργία που μπορείτε να τις κρατήσετε και να τις αγνοήσετε.

Αφαίρεση ετικετών με διάρκεια διαμονής

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

Διάρκεια διαμονής Αριθμός
Stayed 1 night 193645
Stayed 2 nights 133937
Stayed 3 nights 95821
Stayed 4 nights 47817
Stayed 5 nights 20845
Stayed 6 nights 9776
Stayed 7 nights 7399
Stayed 8 nights 2502
Stayed 9 nights 1293
... ...

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

Τύπος δωματίου Αριθμός
Double Room 35207
Standard Double Room 32248
Superior Double Room 31393
Deluxe Double Room 24823
Double or Twin Room 22393
Standard Double or Twin Room 17483
Classic Double Room 16989
Superior Double or Twin Room 13570

Τέλος, και αυτό είναι ευχάριστο (επειδή δεν πήρε σχεδόν καθόλου επεξεργασία), θα μείνετε με τις ακόλουθες χρήσιμες ετικέτες:

Ετικέτα Αριθμός
Leisure trip 417778
Couple 252294
Solo traveler 108545
Business trip 82939
Group (συνδυασμένο με Travellers with friends) 67535
Family with young children 61015
Family with older children 26349
With a pet 1405

Θα μπορούσατε να πείτε ότι το Travellers with friends είναι το ίδιο με το Group κατά προσέγγιση, και θα ήταν δίκαιο να συνδυάσετε τα δύο όπως παραπάνω. Ο κώδικας για τον εντοπισμό των σωστών ετικετών βρίσκεται στο σημειωματάριο Tags.

Το τελευταίο βήμα είναι να δημιουργήσετε νέες στήλες για κάθε μία από αυτές τις ετικέτες. Στη συνέχεια, για κάθε σειρά κριτικής, αν η στήλη Tag ταιριάζει με μία από τις νέες στήλες, προσθέστε 1, αν όχι, προσθέστε 0. Το τελικό αποτέλεσμα θα είναι ένας αριθμός που δείχνει πόσοι αξιολογητές επέλεξαν αυτό το ξενοδοχείο (συνολικά) για, π.χ., επαγγελματικό ταξίδι έναντι αναψυχής, ή για να φέρουν ένα κατοικίδιο, και αυτή είναι χρήσιμη πληροφορία κατά την πρόταση ξενοδοχείου.

# Επεξεργασία των Ετικετών σε νέες στήλες
# Το αρχείο Hotel_Reviews_Tags.py, εντοπίζει τις πιο σημαντικές ετικέτες
# Ταξίδι αναψυχής, Ζευγάρι, Μόνος ταξιδιώτης, Επαγγελματικό ταξίδι, Ομάδα σε συνδυασμό με Ταξιδιώτες με φίλους,
# Οικογένεια με μικρά παιδιά, Οικογένεια με μεγαλύτερα παιδιά, Με κατοικίδιο
df["Leisure_trip"] = df.Tags.apply(lambda tag: 1 if "Leisure trip" in tag else 0)
df["Couple"] = df.Tags.apply(lambda tag: 1 if "Couple" in tag else 0)
df["Solo_traveler"] = df.Tags.apply(lambda tag: 1 if "Solo traveler" in tag else 0)
df["Business_trip"] = df.Tags.apply(lambda tag: 1 if "Business trip" in tag else 0)
df["Group"] = df.Tags.apply(lambda tag: 1 if "Group" in tag or "Travelers with friends" in tag else 0)
df["Family_with_young_children"] = df.Tags.apply(lambda tag: 1 if "Family with young children" in tag else 0)
df["Family_with_older_children"] = df.Tags.apply(lambda tag: 1 if "Family with older children" in tag else 0)
df["With_a_pet"] = df.Tags.apply(lambda tag: 1 if "With a pet" in tag else 0)

Αποθήκευση του αρχείου σας

Τέλος, αποθηκεύστε το σύνολο δεδομένων όπως είναι τώρα με ένα νέο όνομα.

df.drop(["Review_Total_Negative_Word_Counts", "Review_Total_Positive_Word_Counts", "days_since_review", "Total_Number_of_Reviews_Reviewer_Has_Given"], axis = 1, inplace=True)

# Αποθήκευση νέου αρχείου δεδομένων με υπολογισμένες στήλες
print("Saving results to Hotel_Reviews_Filtered.csv")
df.to_csv(r'../data/Hotel_Reviews_Filtered.csv', index = False)

Λειτουργίες ανάλυσης συναισθήματος

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

Άσκηση: φόρτωση και αποθήκευση των φιλτραρισμένων δεδομένων

Σημειώστε ότι τώρα φορτώνετε το φιλτραρισμένο σύνολο δεδομένων που αποθηκεύτηκε στην προηγούμενη ενότητα, όχι το αρχικό σύνολο δεδομένων.

import time
import pandas as pd
import nltk as nltk
from nltk.corpus import stopwords
from nltk.sentiment.vader import SentimentIntensityAnalyzer
nltk.download('vader_lexicon')

# Φορτώστε τις φιλτραρισμένες κριτικές ξενοδοχείων από CSV
df = pd.read_csv('../../data/Hotel_Reviews_Filtered.csv')

# Ο κώδικάς σας θα προστεθεί εδώ


# Τελικά θυμηθείτε να αποθηκεύσετε τις κριτικές ξενοδοχείων με τα νέα δεδομένα NLP που προστέθηκαν
print("Saving results to Hotel_Reviews_NLP.csv")
df.to_csv(r'../data/Hotel_Reviews_NLP.csv', index = False)

Αφαίρεση στοπ λέξεων

Αν εκτελούσατε ανάλυση συναισθήματος στις αρνητικές και θετικές στήλες κριτικής, θα μπορούσε να πάρει πολύ χρόνο. Δοκιμασμένο σε ισχυρό φορητό με γρήγορο CPU, πήρε 12 - 14 λεπτά ανάλογα με τη βιβλιοθήκη συναισθήματος που χρησιμοποιήθηκε. Αυτός είναι (σχετικά) μεγάλος χρόνος, οπότε αξίζει να εξεταστεί αν μπορεί να επιταχυνθεί.

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

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

Η αφαίρεση των στοπ λέξεων είναι επίσης μια γρήγορη λειτουργία, η αφαίρεση τους από 2 στήλες κριτικών σε 515.000 σειρές πήρε 3.3 δευτερόλεπτα στη συσκευή δοκιμών. Θα μπορούσε να πάρει λίγο περισσότερο ή λιγότερο χρόνο αναλόγως τη CPU, τη μνήμη RAM, αν έχετε SSD ή όχι, και άλλους παράγοντες. Η σχετικά μικρή διάρκεια της λειτουργίας σημαίνει ότι αν βελτιώσει τον χρόνο ανάλυσης συναισθήματος, αξίζει να γίνει.

from nltk.corpus import stopwords

# Φόρτωση των αξιολογήσεων του ξενοδοχείου από CSV
df = pd.read_csv("../../data/Hotel_Reviews_Filtered.csv")

# Αφαιρέστε τις λέξεις-κλειδιά - μπορεί να είναι αργό για μεγάλο όγκο κειμένου!
# Ο Ryan Han (ryanxjhan στο Kaggle) έχει μια εξαιρετική ανάρτηση που μετρά την απόδοση διαφόρων προσεγγίσεων αφαίρεσης λέξεων-κλειδιών
# https://www.kaggle.com/ryanxjhan/fast-stop-words-removal # χρησιμοποιώντας την προσέγγιση που προτείνει ο Ryan
start = time.time()
cache = set(stopwords.words("english"))
def remove_stopwords(review):
    text = " ".join([word for word in review.split() if word not in cache])
    return text

# Αφαιρέστε τις λέξεις-κλειδιά και από τις δύο στήλες
df.Negative_Review = df.Negative_Review.apply(remove_stopwords)   
df.Positive_Review = df.Positive_Review.apply(remove_stopwords)

Εκτέλεση ανάλυσης συναισθήματος

Τώρα πρέπει να υπολογίσετε την ανάλυση συναισθήματος και για τις δύο στήλες αρνητικών και θετικών κριτικών, και να αποθηκεύσετε το αποτέλεσμα σε 2 νέες στήλες. Η δοκιμή του συναισθήματος θα είναι να το συγκρίνετε με το σκορ του αξιολογητή για την ίδια κριτική. Για παράδειγμα, αν η ανάλυση σκέφτεται ότι η αρνητική κριτική είχε συναίσθημα 1 (εξαιρετικά θετικό συναίσθημα) και η θετική κριτική επίσης 1, αλλά ο αξιολογητής έδωσε το χαμηλότερο σκορ στο ξενοδοχείο, τότε είτε το κείμενο της κριτικής δεν ταιριάζει με το σκορ, είτε ο αναλυτής συναισθήματος δεν αναγνώρισε σωστά το συναίσθημα. Πρέπει να περιμένετε κάποιους λανθασμένους βαθμούς συναισθήματος, και συχνά αυτό θα μπορεί να εξηγηθεί, π.χ. η κριτική μπορεί να είναι εξαιρετικά σαρκαστική "Φυσικά ΑΓΑΠΗΣΑ να κοιμάμαι σε δωμάτιο χωρίς θέρμανση" και ο αναλυτής συναισθήματος να θεωρεί ότι αυτό είναι θετικό συναίσθημα, ενώ ένας άνθρωπος διαβάζοντάς το θα καταλάβαινε ότι είναι σαρκασμός.

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

Hutto, C.J. & Gilbert, E.E. (2014). VADER: Ένα Λιτό Μοντέλο Βασισμένο σε Κανόνες για Ανάλυση Συναισθήματος Κειμένων Κοινωνικών Μέσων. Όγδοο Διεθνές Συνέδριο για Ιστότοπους και Κοινωνικά Μέσα (ICWSM-14). Ann Arbor, MI, Ιούνιος 2014.

from nltk.sentiment.vader import SentimentIntensityAnalyzer

# Δημιουργήστε τον αναλυτή συναισθημάτων vader (υπάρχουν και άλλοι στο NLTK που μπορείτε να δοκιμάσετε επίσης)
vader_sentiment = SentimentIntensityAnalyzer()
# Hutto, C.J. & Gilbert, E.E. (2014). VADER: Ένα λιτό μοντέλο βασισμένο σε κανόνες για την ανάλυση συναισθημάτων κειμένου στα μέσα κοινωνικής δικτύωσης. Όγδοο Διεθνές Συνέδριο για τα Ιστολόγια και τα Μέσα Κοινωνικής Δικτύωσης (ICWSM-14). Αν Άρμπορ, MI, Ιούνιος 2014.

# Υπάρχουν 3 πιθανότητες εισόδου για μια αξιολόγηση:
# Μπορεί να είναι "Καμία Αρνητική", οπότε επιστρέψτε 0
# Μπορεί να είναι "Καμία Θετική", οπότε επιστρέψτε 0
# Μπορεί να είναι μια αξιολόγηση, οπότε υπολογίστε το συναίσθημα
def calc_sentiment(review):    
    if review == "No Negative" or review == "No Positive":
        return 0
    return vader_sentiment.polarity_scores(review)["compound"]    

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

# Προσθέστε μια στήλη αρνητικής συναισθηματικής φόρτισης και μια στήλη θετικής συναισθηματικής φόρτισης
print("Calculating sentiment columns for both positive and negative reviews")
start = time.time()
df["Negative_Sentiment"] = df.Negative_Review.apply(calc_sentiment)
df["Positive_Sentiment"] = df.Positive_Review.apply(calc_sentiment)
end = time.time()
print("Calculating sentiment took " + str(round(end - start, 2)) + " seconds")

Αυτό διαρκεί περίπου 120 δευτερόλεπτα στον υπολογιστή μου, αλλά θα διαφέρει σε κάθε υπολογιστή. Αν θέλετε να εκτυπώσετε τα αποτελέσματα και να δείτε αν το συναίσθημα ταιριάζει με την κριτική:

df = df.sort_values(by=["Negative_Sentiment"], ascending=True)
print(df[["Negative_Review", "Negative_Sentiment"]])
df = df.sort_values(by=["Positive_Sentiment"], ascending=True)
print(df[["Positive_Review", "Positive_Sentiment"]])

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

# Αναδιάταξη των στηλών (Αυτό είναι απλώς αισθητικό, αλλά για να διευκολυνθεί η εξερεύνηση των δεδομένων αργότερα)
df = df.reindex(["Hotel_Name", "Hotel_Address", "Total_Number_of_Reviews", "Average_Score", "Reviewer_Score", "Negative_Sentiment", "Positive_Sentiment", "Reviewer_Nationality", "Leisure_trip", "Couple", "Solo_traveler", "Business_trip", "Group", "Family_with_young_children", "Family_with_older_children", "With_a_pet", "Negative_Review", "Positive_Review"], axis=1)

print("Saving results to Hotel_Reviews_NLP.csv")
df.to_csv(r"../data/Hotel_Reviews_NLP.csv", index = False)

Πρέπει να εκτελέσετε ολόκληρο τον κώδικα για το σημειωματάριο ανάλυσης (αφού έχετε εκτελέσει το σημειωματάριο φιλτραρίσματος για να δημιουργήσετε το αρχείο Hotel_Reviews_Filtered.csv).

Για να επανεξετάσουμε, τα βήματα είναι:

  1. Το αρχείο γνήσιου συνόλου δεδομένων Hotel_Reviews.csv εξετάζεται στο προηγούμενο μάθημα με το σημειωματάριο εξερεύνησης
  2. Το Hotel_Reviews.csv φιλτράρεται με το σημειωματάριο φιλτραρίσματος με αποτέλεσμα το Hotel_Reviews_Filtered.csv
  3. Το Hotel_Reviews_Filtered.csv επεξεργάζεται με το σημειωματάριο ανάλυσης συναισθήματος με αποτέλεσμα το Hotel_Reviews_NLP.csv
  4. Χρησιμοποιήστε το Hotel_Reviews_NLP.csv στην παρακάτω NLP Πρόκληση

Συμπέρασμα

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

Εξέταση μετά το μάθημα

Πρόκληση

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

Ανασκόπηση & Αυτοεκπαίδευση

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

Αποστολή

Δοκιμάστε ένα διαφορετικό σύνολο δεδομένων


Αποποίηση ευθυνών: Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία μετάφρασης με τεχνητή νοημοσύνη Co-op Translator. Ενώ επιδιώκουμε την ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή λανθασμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.