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

קהל

המדריך הזה נועד לעזור לכם להתחיל במהירות לחקור ולפתח אפליקציות באמצעות 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 במדריך קוראת לשיטה Natural Language API classifyText, קודם יוצרת מופע של המחלקה 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 של Google Cloud Storage לשיטה classify_text.

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