Sentiment Analysis Tutorial

קהל

המדריך הזה נועד לעזור לכם להתחיל במהירות לחקור ולפתח אפליקציות באמצעות Google Cloud Natural Language API. הוא מיועד לאנשים שמכירים תכנות בסיסי, אבל גם אם אין לכם ידע רב בתכנות, תוכלו לעקוב אחריו. אחרי שתעברו על המדריך הזה, תוכלו להשתמש במסמכי העיון כדי ליצור אפליקציות בסיסיות משלכם.

במדריך הזה מוסבר איך להשתמש באפליקציית Natural Language API באמצעות קוד Python. המטרה כאן היא לא להסביר על ספריות הלקוח של Python, אלא להסביר איך לבצע קריאות ל-Natural Language API. אפליקציות ב-Java וב-Node.js דומות במהותן. אפשר לעיין בדוגמאות של Natural Language API כדי לראות דוגמאות בשפות אחרות (כולל הדוגמה הזו בתוך המדריך).

דרישות מוקדמות

יש כמה דרישות מוקדמות למדריך הזה:

ניתוח הסנטימנט במסמך

במדריך הזה מוסבר איך ליצור אפליקציה בסיסית של Natural Language API באמצעות analyzeSentimentבקשה שמבצעת ניתוח סנטימנט של טקסט. ניתוח הסנטימנט מנסה לקבוע את הגישה הכוללת (חיובית או שלילית) ומיוצג על ידי ערכים מספריים score ו-magnitude. (מידע נוסף על המושגים האלה זמין במאמר בנושא היסודות של שפה טבעית).

קודם נציג את הקוד המלא. (שימו לב שהסרנו את רוב ההערות מהקוד הזה כדי להראות לכם כמה הוא קצר. נספק עוד הערות בהמשך כשנסביר על הקוד).

מידע נוסף על התקנה ושימוש בספריית הלקוח של Google Cloud Natural Language ל-Python זמין במאמר ספריות לקוח של Natural Language API.
"""Demonstrates how to make a simple call to the Natural Language API."""

import argparse

from google.cloud import language_v1



def print_result(annotations):
    score = annotations.document_sentiment.score
    magnitude = annotations.document_sentiment.magnitude

    for index, sentence in enumerate(annotations.sentences):
        sentence_sentiment = sentence.sentiment.score
        print(f"Sentence {index} has a sentiment score of {sentence_sentiment}")

    print(f"Overall Sentiment: score of {score} with magnitude of {magnitude}")
    return 0




def analyze(movie_review_filename):
    """Run a sentiment analysis request on text within a passed filename."""
    client = language_v1.LanguageServiceClient()

    with open(movie_review_filename) as review_file:
        # Instantiates a plain text document.
        content = review_file.read()

    document = language_v1.Document(
        content=content, type_=language_v1.Document.Type.PLAIN_TEXT
    )
    annotations = client.analyze_sentiment(request={"document": document})

    # Print the results
    print_result(annotations)




if __name__ == "__main__":
    parser = argparse.ArgumentParser(
        description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter
    )
    parser.add_argument(
        "movie_review_filename",
        help="The filename of the movie review you'd like to analyze.",
    )
    args = parser.parse_args()

    analyze(args.movie_review_filename)

האפליקציה הפשוטה הזו מבצעת את המשימות הבאות:

  • ייבוא הספריות שנדרשות להפעלת האפליקציה
  • מקבלת קובץ טקסט ומעבירה אותו לפונקציה main()
  • קריאת קובץ הטקסט ושליחת בקשה לשירות
  • מנתח את התגובה מהשירות ומציג אותה למשתמש

בהמשך נפרט על השלבים האלה.

ייבוא ספריות

מידע נוסף על התקנה ושימוש בספריית הלקוח של Google Cloud Natural Language ל-Python זמין במאמר ספריות לקוח של Natural Language API.
import argparse

from google.cloud import language_v1

אנחנו מייבאים את argparse, ספרייה רגילה, כדי לאפשר לאפליקציה לקבל שמות של קובצי קלט כארגומנטים.

כדי להשתמש ב-Cloud Natural Language API, נצטרך גם לייבא את המודול language מהספרייה google-cloud-language. מודול types מכיל מחלקות שנדרשות ליצירת בקשות.

הפעלת האפליקציה

if __name__ == "__main__":
    parser = argparse.ArgumentParser(
        description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter
    )
    parser.add_argument(
        "movie_review_filename",
        help="The filename of the movie review you'd like to analyze.",
    )
    args = parser.parse_args()

    analyze(args.movie_review_filename)

כאן אנחנו פשוט מנתחים את הארגומנט שהועבר כדי לקבל את שם הקובץ של הטקסט ומעבירים אותו לפונקציה analyze().

אימות ל-API

לפני שמתקשרים עם שירות Natural Language API, צריך לאמת את השירות באמצעות פרטי כניסה שהושגו קודם. הדרך הכי פשוטה לקבל פרטי כניסה באפליקציה היא באמצעות Application Default Credentials ‏(ADC). כברירת מחדל, ADC ינסה לקבל פרטי כניסה מקובץ הסביבה GOOGLE_APPLICATION_CREDENTIALS, שצריך להיות מוגדר כך שיצביע על קובץ ה-JSON של מפתח חשבון השירות. (הגדרתם את חשבון השירות והסביבה שלכם לשימוש ב-ADC במדריך למתחילים. מידע נוסף זמין במאמר הגדרת חשבון שירות).

ספריית הלקוח של Google Cloud ל-Python משתמשת באופן אוטומטי בפרטי הכניסה שמוגדרים כברירת מחדל לאפליקציה.

שליחת הבקשה

עכשיו ששירות Natural Language API מוכן, אפשר לגשת לשירות באמצעות קריאה ל-method‏ analyze_sentiment של מופע LanguageServiceClient.

ספריית הלקוח מכילה את הפרטים של הבקשות והתגובות ל-API. מידע מלא על המבנה הספציפי של בקשה כזו מופיע בהפניית Natural Language API.

מידע נוסף על התקנה ושימוש בספריית הלקוח של Google Cloud Natural Language ל-Python זמין במאמר ספריות לקוח של Natural Language API.
def analyze(movie_review_filename):
    """Run a sentiment analysis request on text within a passed filename."""
    client = language_v1.LanguageServiceClient()

    with open(movie_review_filename) as review_file:
        # Instantiates a plain text document.
        content = review_file.read()

    document = language_v1.Document(
        content=content, type_=language_v1.Document.Type.PLAIN_TEXT
    )
    annotations = client.analyze_sentiment(request={"document": document})

    # Print the results
    print_result(annotations)

קטע הקוד הזה מבצע את הפעולות הבאות:

  1. יוצר מופע של LanguageServiceClient כלקוח.
  2. קורא את שם הקובץ שמכיל את נתוני הטקסט לתוך משתנה.
  3. יוצר מופע של אובייקט Document עם התוכן של הקובץ.
  4. מבצע קריאה ל-analyze_sentiment של הלקוח.

ניתוח התשובה

def print_result(annotations):
    score = annotations.document_sentiment.score
    magnitude = annotations.document_sentiment.magnitude

    for index, sentence in enumerate(annotations.sentences):
        sentence_sentiment = sentence.sentiment.score
        print(f"Sentence {index} has a sentiment score of {sentence_sentiment}")

    print(f"Overall Sentiment: score of {score} with magnitude of {magnitude}")
    return 0

אנחנו מעבדים את התגובה כדי לחלץ את ערכי הסנטימנט score לכל משפט, ואת הערכים הכוללים score ו-magnitude לכל הביקורת, ומציגים אותם למשתמש.

מריצים את הדוגמה

כדי להריץ את הדוגמה שלנו, נבדוק אותה על קבוצה של ביקורות (מזויפות) על הסרט "בלייד ראנר".

  1. מורידים את הדוגמאות מ-Google Cloud Storage:

    gcloud storage cp gs://cloud-samples-tests/natural-language/sentiment-samples.tgz .
    

    כדי להתקין את הגרסה העדכנית של Google Cloud CLI, אפשר לעיין במאמרי העזרה של ה-CLI של gcloud.

  2. פותחים את קובץ ה-ZIP של הדוגמאות, ונוצרת תיקייה בשם reviews:

    gunzip sentiment-samples.tgz
    tar -xvf sentiment-samples.tar
    
  3. הפעלת ניתוח הסנטימנט באחד מהקבצים שצוינו:

    python sentiment_analysis.py reviews/bladerunner-pos.txt
    Sentence 0 has a sentiment score of 0.8
    Sentence 1 has a sentiment score of 0.9
    Sentence 2 has a sentiment score of 0.8
    Sentence 3 has a sentiment score of 0.2
    Sentence 4 has a sentiment score of 0.1
    Sentence 5 has a sentiment score of 0.4
    Sentence 6 has a sentiment score of 0.3
    Sentence 7 has a sentiment score of 0.4
    Sentence 8 has a sentiment score of 0.2
    Sentence 9 has a sentiment score of 0.9
    Overall Sentiment: score of 0.5 with magnitude of 5.5
    

בדוגמה שלמעלה, אפשר לראות שהביקורת הייתה חיובית יחסית (ציון של 0.5) ורגשית יחסית (עוצמה של 5.5).

ניתוח של הדוגמאות האחרות אמור להניב ערכים דומים לאלה שמוצגים בהמשך:

python sentiment_analysis.py reviews/bladerunner-neg.txt
...
Overall Sentiment: score of -0.6 with magnitude of 3.3

python sentiment_analysis.py reviews/bladerunner-mixed.txt
...
Overall Sentiment: score of 0 with magnitude of 4.7

python sentiment_analysis.py reviews/bladerunner-neutral.txt
...
Overall Sentiment: score of -0.1 with magnitude of 1.8

שימו לב שכל הערכים דומים (מה שמצביע על כמות יחסית שווה של סנטימנט בעל משמעות רגשית), למעט המקרה של 'ניטרלי', שמצביע על ביקורת שאין בה הרבה סנטימנט רגשי, חיובי או שלילי. (מידע נוסף על ציוני סנטימנט ועל עוצמת הסנטימנט, ועל האופן שבו מפרשים את הערכים האלה, זמין במאמר הסבר על ערכים של ניתוח סנטימנט).

אם רוצים לבצע ניתוח סנטימנטים עם יותר נתונים, אוניברסיטת סטנפורד מספקת מערך נתונים של ביקורות על סרטים ב-IMDB. כדי לאחזר את הביקורות על הסרטים האלה:

  1. מורידים את מערך הנתונים Large Movie Review.
  2. מחלצים את הקובץ לספריית העבודה. הביקורות על הסרטים מחולקות לספריות pos ו-neg בתוך ספריות הנתונים train ו-test, וכל קובץ טקסט מכיל ביקורת אחת על סרט.
  3. מריצים את הכלי sentiment_analysis.py על אחד מקובצי הטקסט של ביקורות הסרטים.

כל הכבוד! ביצעתם את משימות ההיסק הראשונות שלכם באמצעות Google Cloud Natural Language API.