מדריך לסיווג תוכן

קהל

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

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

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

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

סקירה כללית

במדריך הזה נסביר איך ליצור אפליקציה בסיסית בשפה טבעית באמצעות בקשות classifyText, שמסווגות תוכן לקטגוריות ומציגות ציון מהימנות, כמו:

category: "/Internet & Telecom/Mobile & Wireless/Mobile Apps & Add-Ons"
confidence: 0.6499999761581421

כדי לראות את רשימת כל תוויות הקטגוריות הזמינות, אפשר לעיין במאמר בנושא קטגוריות.

במדריך הזה תיצרו אפליקציה שתבצע את המשימות הבאות:

  • לסווג כמה קובצי טקסט ולכתוב את התוצאה לקובץ אינדקס.
  • עיבוד של טקסט שאילתת הקלט כדי למצוא קובצי טקסט דומים.
  • עיבוד תוויות של קטגוריות של שאילתות קלט כדי למצוא קובצי טקסט דומים.

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

קובצי מקור

קוד המקור של המדריך זמין בדוגמאות של ספריות לקוח ב-Python ב-GitHub.

במדריך הזה נעשה שימוש בטקסט מקור לדוגמה מתוך ויקיפדיה. אפשר למצוא את קובצי הטקסט לדוגמה בתיקייה resources/texts של פרויקט GitHub.

ייבוא ספריות

כדי להשתמש ב-Cloud Natural Language API, צריך לייבא את המודול language מהספרייה google-cloud-language. מודול language.types מכיל מחלקות שנדרשות ליצירת בקשות. המודול language.enums משמש לציון סוג טקסט הקלט. במדריך הזה מוסבר איך לסווג תוכן של טקסט פשוט (language.enums.Document.Type.PLAIN_TEXT).

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

Python

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

כדי לבצע אימות ב-Natural Language, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

import argparse
import json
import os

from google.cloud import language_v1
import numpy

שלב 1. סיווג תוכן

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

הפונקציה classify במדריך קוראת לשיטה classifyText של Natural Language API, קודם יוצרת מופע של המחלקה LanguageServiceClient ואז קוראת לשיטה classify_text של המופע LanguageServiceClient.

הפונקציה classify שמופיעה במדריך מסווגת רק תוכן טקסט בדוגמה הזו. אפשר גם לסווג את התוכן של דף אינטרנט על ידי העברת קוד ה-HTML של דף האינטרנט כמחרוזת text והגדרת הפרמטר type לערך language.enums.Document.Type.HTML.

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

Python

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

כדי לבצע אימות ב-Natural Language, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

def classify(text, verbose=True):
    """Classify the input text into categories."""

    language_client = language_v1.LanguageServiceClient()

    document = language_v1.Document(
        content=text, type_=language_v1.Document.Type.PLAIN_TEXT
    )
    response = language_client.classify_text(request={"document": document})
    categories = response.categories

    result = {}

    for category in categories:
        # Turn the categories into a dictionary of the form:
        # {category.name: category.confidence}, so that they can
        # be treated as a sparse vector.
        result[category.name] = category.confidence

    if verbose:
        print(text)
        for category in categories:
            print("=" * 20)
            print("{:<16}: {}".format("category", category.name))
            print("{:<16}: {}".format("confidence", category.confidence))

    return result

התוצאה שמוחזרת היא מילון עם תוויות הקטגוריות כמפתחות וציוני מהימנות כערכים, למשל:

{
    "/Computers & Electronics": 0.800000011920929,
    "/Internet & Telecom/Mobile & Wireless/Mobile Apps & Add-Ons": 0.6499999761581421
}

סקריפט Python של הדרכה מאורגן כך שאפשר להריץ אותו משורת הפקודה לניסויים מהירים. לדוגמה, אפשר להריץ את הפקודה:

python classify_text_tutorial.py classify "Google Home enables users to speak voice commands to interact with services through the Home's intelligent personal assistant called Google Assistant. A large number of services, both in-house and third-party, are integrated, allowing users to listen to music, look at videos or photos, or receive news updates entirely by voice. "

שלב 2. אינדקס של כמה קובצי טקסט

הפונקציה index בסקריפט של הדרכה מקבלת כקלט ספרייה שמכילה כמה קובצי טקסט, ואת הנתיב לקובץ שבו היא מאחסנת את הפלט המאונדקס (שם קובץ ברירת המחדל הוא index.json). הפונקציה index קוראת את התוכן של כל קובץ טקסט בספריית הקלט, ואז מעבירה את קובצי הטקסט אל Cloud Natural Language API כדי לסווג אותם לקטגוריות תוכן.

Python

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

כדי לבצע אימות ב-Natural Language, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

def index(path, index_file):
    """Classify each text file in a directory and write
    the results to the index_file.
    """

    result = {}
    for filename in os.listdir(path):
        file_path = os.path.join(path, filename)

        if not os.path.isfile(file_path):
            continue

        try:
            with open(file_path) as f:
                text = f.read()
                categories = classify(text, verbose=False)

                result[filename] = categories
        except Exception:
            print(f"Failed to process {file_path}")

    with open(index_file, "w", encoding="utf-8") as f:
        f.write(json.dumps(result, ensure_ascii=False))

    print(f"Texts indexed in file: {index_file}")
    return result

התוצאות מ-Cloud Natural Language API לכל קובץ מאורגנות במילון יחיד, עוברות סריאליזציה כמחרוזת JSON ואז נכתבות לקובץ. לדוגמה:

{
    "android.txt": {
        "/Computers & Electronics": 0.800000011920929,
        "/Internet & Telecom/Mobile & Wireless/Mobile Apps & Add-Ons": 0.6499999761581421
    },
    "google.txt": {
        "/Internet & Telecom": 0.5799999833106995,
        "/Business & Industrial": 0.5400000214576721
    }
}

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

python classify_text_tutorial.py index resources/texts

שלב 3. שליחת שאילתה לאינדקס

שאילתה עם תוויות קטגוריה

אחרי שיוצרים את קובץ האינדקס (שם הקובץ שמוגדר כברירת מחדל = index.json), אפשר לשלוח שאילתות לאינדקס כדי לאחזר חלק משמות הקבצים וציוני רמת הסמך שלהם.

אחת הדרכים לעשות זאת היא להשתמש בתווית קטגוריה בתור השאילתה, כפי שמוסבר במדריך באמצעות הפונקציה query_category. ההטמעה של פונקציות העזר, כמו similarity, נמצאת בקובץ classify_text_tutorial.py. באפליקציות שלכם, צריך לתכנן בקפידה את הדירוג והניקוד של הדמיון בהתאם לתרחישי שימוש ספציפיים.

Python

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

כדי לבצע אימות ב-Natural Language, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

def query_category(index_file, category_string, n_top=3):
    """Find the indexed files that are the most similar to
    the query label.

    The list of all available labels:
    https://cloud.google.com/natural-language/docs/categories
    """

    with open(index_file) as f:
        index = json.load(f)

    # Make the category_string into a dictionary so that it is
    # of the same format as what we get by calling classify.
    query_categories = {category_string: 1.0}

    similarities = []
    for filename, categories in index.items():
        similarities.append((filename, similarity(query_categories, categories)))

    similarities = sorted(similarities, key=lambda p: p[1], reverse=True)

    print("=" * 20)
    print(f"Query: {category_string}\n")
    print(f"\nMost similar {n_top} indexed texts:")
    for filename, sim in similarities[:n_top]:
        print(f"\tFilename: {filename}")
        print(f"\tSimilarity: {sim}")
        print("\n")

    return similarities

רשימה של כל הקטגוריות הזמינות מופיעה במאמר קטגוריות.

כמו קודם, אפשר להפעיל את הפונקציה query_category משורת הפקודה:

python classify_text_tutorial.py query-category index.json "/Internet & Telecom/Mobile & Wireless"

הפלט אמור להיראות כך:

Query: /Internet & Telecom/Mobile & Wireless


Most similar 3 indexed texts:
  Filename: android.txt
  Similarity: 0.665573579045


  Filename: google.txt
  Similarity: 0.517527175966


  Filename: gcp.txt
  Similarity: 0.5

שאילתה עם טקסט

אפשר גם להזין שאילתה עם טקסט שאולי לא מופיע בטקסט שנוסף לאינדקס. הפונקציה query דומה לפונקציה query_category, אבל היא כוללת גם את השלב של שליחת בקשת classifyText לקלט הטקסט, ושימוש בתוצאות כדי לשלוח שאילתה לקובץ האינדקס.

Python

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

כדי לבצע אימות ב-Natural Language, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

def query(index_file, text, n_top=3):
    """Find the indexed files that are the most similar to
    the query text.
    """

    with open(index_file) as f:
        index = json.load(f)

    # Get the categories of the query text.
    query_categories = classify(text, verbose=False)

    similarities = []
    for filename, categories in index.items():
        similarities.append((filename, similarity(query_categories, categories)))

    similarities = sorted(similarities, key=lambda p: p[1], reverse=True)

    print("=" * 20)
    print(f"Query: {text}\n")
    for category, confidence in query_categories.items():
        print(f"\tCategory: {category}, confidence: {confidence}")
    print(f"\nMost similar {n_top} indexed texts:")
    for filename, sim in similarities[:n_top]:
        print(f"\tFilename: {filename}")
        print(f"\tSimilarity: {sim}")
        print("\n")

    return similarities

כדי לעשות זאת משורת הפקודה, מריצים את הפקודה:

python classify_text_tutorial.py query index.json "Google Home enables users to speak voice commands to interact with services through the Home's intelligent personal assistant called Google Assistant. A large number of services, both in-house and third-party, are integrated, allowing users to listen to music, look at videos or photos, or receive news updates entirely by voice. "

יוצג פלט שדומה לזה:

Query: Google Home enables users to speak voice commands to interact with services through the Home's intelligent personal assistant called Google Assistant. A large number of services, both in-house and third-party, are integrated, allowing users to listen to music, look at videos or photos, or receive news updates entirely by voice.

  Category: /Internet & Telecom, confidence: 0.509999990463
  Category: /Computers & Electronics/Software, confidence: 0.550000011921

Most similar 3 indexed texts:
  Filename: android.txt
  Similarity: 0.600579500049


  Filename: google.txt
  Similarity: 0.401314790229


  Filename: gcp.txt
  Similarity: 0.38772339779

המאמרים הבאים

באמצעות Content Classification API תוכלו ליצור אפליקציות אחרות. לדוגמה:

  • סווג כל פסקה במאמר כדי לראות את המעבר בין הנושאים.

  • לסווג תוכן עם חותמות זמן ולנתח את המגמה של נושאים לאורך זמן.

  • השוואה בין קטגוריות תוכן לבין סנטימנט תוכן באמצעות analyzeSentiment.

  • השוואה בין קטגוריות תוכן לבין ישויות שמוזכרות בטקסט.

בנוסף, אפשר להשתמש במוצרים אחרים של Google Cloud Platform כדי לייעל את תהליך העבודה:

  • באפליקציה לדוגמה של המדריך הזה, עיבדנו קובצי טקסט מקומיים, אבל אפשר לשנות את הקוד כדי לעבד קובצי טקסט שמאוחסנים בקטגוריה של Google Cloud Storage. לשם כך, צריך להעביר URI של Cloud Storage לשיטה classify_text.

  • באפליקציה לדוגמה של המדריך הזה, שמרנו את קובץ האינדקס באופן מקומי, וכל שאילתה מעובדת על ידי קריאה של כל קובץ האינדקס. המשמעות היא זמן אחזור גבוה אם יש לכם כמות גדולה של נתונים שעברו אינדוקס או אם אתם צריכים לעבד מספר רב של שאילתות. ‫Datastore היא בחירה טבעית ונוחה לאחסון נתוני האינדקס.