Partager via


Utiliser Azure AI services avec SynapseML dans Microsoft Fabric

Azure AI services aide les développeurs et les organisations à créer rapidement des applications intelligentes, de pointe, prêtes à être commercialisées et responsables avec des API et des modèles prêts à l’emploi, intégrés et personnalisables. Dans cet article, vous utiliserez les différents services disponibles dans Azure AI Services pour effectuer des tâches telles que : l'analyse de texte, la traduction, la documentation intelligente, la vision, la recherche d'images, la conversion parole-texte et texte-parole, l'anomalie détection et extraction de données à partir d'API Web.

L’objectif de l’équipe Azure AI Services est d’aider les développeurs à créer des applications capables de voir, d’entendre, de parler, de comprendre et même de commencer à raisonner. Le catalogue de services d'Azure AI Services peut être classé en cinq piliers principaux : Vision, Discours, Langage, Recherche Web et Décision.

Prérequis

Préparer votre système

Pour commencer, importez les bibliothèques requises et initialisez votre session Spark.

from pyspark.sql.functions import udf, col
from synapse.ml.io.http import HTTPTransformer, http_udf
from requests import Request
from pyspark.sql.functions import lit
from pyspark.ml import PipelineModel
from pyspark.sql.functions import col
import os
from pyspark.sql import SparkSession
from synapse.ml.core.platform import *

# Bootstrap Spark Session
spark = SparkSession.builder.getOrCreate()

Importez les bibliothèques des services Azure AI et remplacez les clés et les emplacements dans l'extrait de code suivant par votre clé et votre emplacement des services Azure AI.

from synapse.ml.cognitive import *

# A general Azure AI services key for Text Analytics, Vision and Document Intelligence (or use separate keys that belong to each service)
service_key = "<YOUR-KEY-VALUE>" # Replace <YOUR-KEY-VALUE> with your Azure AI service key, check prerequisites for more details
service_loc = "eastus"

# A Bing Search v7 subscription key
bing_search_key =  "<YOUR-KEY-VALUE>" # Replace <YOUR-KEY-VALUE> with your Bing v7 subscription key, check prerequisites for more details

# An Anomaly Detector subscription key
anomaly_key = <"YOUR-KEY-VALUE"> # Replace <YOUR-KEY-VALUE> with your anomaly service key, check prerequisites for more details
anomaly_loc = "westus2"

# A Translator subscription key
translator_key = "<YOUR-KEY-VALUE>" # Replace <YOUR-KEY-VALUE> with your translator service key, check prerequisites for more details
translator_loc = "eastus"

# An Azure search key
search_key = "<YOUR-KEY-VALUE>" # Replace <YOUR-KEY-VALUE> with your search key, check prerequisites for more details

Effectuer une analyse des sentiments sur le texte

Le service Analyse de texte fournit plusieurs algorithmes permettant d’extraire des insights intelligents à partir d’un texte. Par exemple, vous pouvez utiliser le service pour trouver le sentiment d'un texte d'entrée. Le service renverra un score compris entre 0,0 et 1,0, où les scores faibles indiquent un sentiment négatif et les scores élevés indiquent un sentiment positif.

L'exemple de code suivant renvoie le sentiment pour trois phrases simples.

# Create a dataframe that's tied to it's column names
df = spark.createDataFrame(
    [
        ("I am so happy today, its sunny!", "en-US"),
        ("I am frustrated by this rush hour traffic", "en-US"),
        ("The cognitive services on spark aint bad", "en-US"),
    ],
    ["text", "language"],
)

# Run the Text Analytics service with options
sentiment = (
    TextSentiment()
    .setTextCol("text")
    .setLocation(service_loc)
    .setSubscriptionKey(service_key)
    .setOutputCol("sentiment")
    .setErrorCol("error")
    .setLanguageCol("language")
)

# Show the results of your text query in a table format
display(
    sentiment.transform(df).select(
        "text", col("sentiment.document.sentiment").alias("sentiment")
    )
)

Effectuer des analyses de texte pour les données de santé

Le service d'Analyse de texte pour le Service de contrôle d’intégrité extrait et étiquette les informations médicales pertinentes à partir de textes non structurés tels que les notes du médecin, les résumés de congé, les documents cliniques et les dossiers de santé électroniques.

L'exemple de code suivant analyse et transforme le texte des notes des médecins en données structurées.

df = spark.createDataFrame(
    [
        ("20mg of ibuprofen twice a day",),
        ("1tsp of Tylenol every 4 hours",),
        ("6-drops of Vitamin B-12 every evening",),
    ],
    ["text"],
)

healthcare = (
    AnalyzeHealthText()
    .setSubscriptionKey(service_key)
    .setLocation(service_loc)
    .setLanguage("en")
    .setOutputCol("response")
)

display(healthcare.transform(df))

Traduire un texte dans une autre langue

Translator est un service de traduction automatique basé sur le cloud qui fait partie de la famille Azure AI services des API cognitives utilisées pour créer des applications intelligentes. Il est facile d’intégrer Translator à vos applications, sites web, outils et solutions. Cette interface vous permet d’ajouter des expériences utilisateur multilingues dans plus de 90 langues et dialectes. Elle peut être utilisée pour la traduction de texte avec n’importe quel système d’exploitation.

L'exemple de code suivant effectue une traduction de texte simple en fournissant les phrases que vous souhaitez traduire et les langues cibles dans lesquelles vous souhaitez les traduire.

from pyspark.sql.functions import col, flatten

# Create a dataframe including sentences you want to translate
df = spark.createDataFrame(
    [(["Hello, what is your name?", "Bye"],)],
    [
        "text",
    ],
)

# Run the Translator service with options
translate = (
    Translate()
    .setSubscriptionKey(translator_key)
    .setLocation(translator_loc)
    .setTextCol("text")
    .setToLanguage(["zh-Hans"])
    .setOutputCol("translation")
)

# Show the results of the translation.
display(
    translate.transform(df)
    .withColumn("translation", flatten(col("translation.translations")))
    .withColumn("translation", col("translation.text"))
    .select("translation")
)

Extraire les informations d'un document en données structurées

Azure AI Intelligence documentairefait partie d’Azure AI services et vous permet de générer des logiciels de traitement de données automatisé à l’aide de la technologie d’apprentissage automatique. Avec Azure AI Intelligence documentaire, vous pouvez identifier et extraire du texte, des paires de clé/valeur, des marques de sélection, des tableaux et une structure de vos documents. Le service génère des données structurées qui incluent les relations dans le fichier d’origine, les cadres englobants, la confiance, etc.

L'exemple de code suivant analyse une image de carte de visite et extrait ses informations dans des données structurées.

from pyspark.sql.functions import col, explode

# Create a dataframe containing the source files
imageDf = spark.createDataFrame(
    [
        (
            "https://mmlspark.blob.core.windows.net/datasets/FormRecognizer/business_card.jpg",
        )
    ],
    [
        "source",
    ],
)

# Run the Form Recognizer service
analyzeBusinessCards = (
    AnalyzeBusinessCards()
    .setSubscriptionKey(service_key)
    .setLocation(service_loc)
    .setImageUrlCol("source")
    .setOutputCol("businessCards")
)

# Show the results of recognition.
display(
    analyzeBusinessCards.transform(imageDf)
    .withColumn(
        "documents", explode(col("businessCards.analyzeResult.documentResults.fields"))
    )
    .select("source", "documents")
)

Analyser et taguer des images

Le service Vision par ordinateur analyse des images pour identifier une structure comme des visages, des objets et des descriptions en langage naturel.

L'exemple de code suivant analyse les images et les étiquette avec des balises. Les balises sont des descriptions en un mot des éléments de l'image, tels que des objets reconnaissables, des personnes, des paysages et des actions.

# Create a dataframe with the image URLs
base_url = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-sample-data-files/master/ComputerVision/Images/"
df = spark.createDataFrame(
    [
        (base_url + "objects.jpg",),
        (base_url + "dog.jpg",),
        (base_url + "house.jpg",),
    ],
    [
        "image",
    ],
)

# Run the Computer Vision service. Analyze Image extracts information from/about the images.
analysis = (
    AnalyzeImage()
    .setLocation(service_loc)
    .setSubscriptionKey(service_key)
    .setVisualFeatures(
        ["Categories", "Color", "Description", "Faces", "Objects", "Tags"]
    )
    .setOutputCol("analysis_results")
    .setImageUrlCol("image")
    .setErrorCol("error")
)

# Show the results of what you wanted to pull out of the images.
display(analysis.transform(df).select("image", "analysis_results.description.tags"))

La Recherche d’images Bing explore le web pour récupérer des images associées à une demande en langage naturel d’un utilisateur.

L'exemple de code suivant utilise une requête de texte qui recherche des images avec des guillemets. La sortie du code est une liste d'URL d'images contenant des photos liées à la requête.

# Number of images Bing will return per query
imgsPerBatch = 10
# A list of offsets, used to page into the search results
offsets = [(i * imgsPerBatch,) for i in range(100)]
# Since web content is our data, we create a dataframe with options on that data: offsets
bingParameters = spark.createDataFrame(offsets, ["offset"])

# Run the Bing Image Search service with our text query
bingSearch = (
    BingImageSearch()
    .setSubscriptionKey(bing_search_key)
    .setOffsetCol("offset")
    .setQuery("Martin Luther King Jr. quotes")
    .setCount(imgsPerBatch)
    .setOutputCol("images")
)

# Transformer that extracts and flattens the richly structured output of Bing Image Search into a simple URL column
getUrls = BingImageSearch.getUrlTransformer("images", "url")

# This displays the full results returned, uncomment to use
# display(bingSearch.transform(bingParameters))

# Since we have two services, they are put into a pipeline
pipeline = PipelineModel(stages=[bingSearch, getUrls])

# Show the results of your search: image URLs
display(pipeline.transform(bingParameters))

Transformer la reconnaissance vocale

Le service Reconnaissance vocale convertit des flux ou des fichiers de contenu audio en texte. L'exemple de code suivant transcrit un fichier audio en texte.

# Create a dataframe with our audio URLs, tied to the column called "url"
df = spark.createDataFrame(
    [("https://mmlspark.blob.core.windows.net/datasets/Speech/audio2.wav",)], ["url"]
)

# Run the Speech-to-text service to translate the audio into text
speech_to_text = (
    SpeechToTextSDK()
    .setSubscriptionKey(service_key)
    .setLocation(service_loc)
    .setOutputCol("text")
    .setAudioDataCol("url")
    .setLanguage("en-US")
    .setProfanity("Masked")
)

# Show the results of the translation
display(speech_to_text.transform(df).select("url", "text.DisplayText"))

Transformer la synthèse vocale

La synthèse vocale est un service qui vous permet de créer des applications et des services qui parlent naturellement, en choisissant parmi plus de 270 voix neural dans 119 langues et variantes.

L'exemple de code suivant transforme le texte en un fichier audio qui contient le contenu du texte.

from synapse.ml.cognitive import TextToSpeech

fs = ""
if running_on_databricks():
    fs = "dbfs:"
elif running_on_synapse_internal():
    fs = "Files"

# Create a dataframe with text and an output file location
df = spark.createDataFrame(
    [
        (
            "Reading out loud is fun! Check out aka.ms/spark for more information",
            fs + "/output.mp3",
        )
    ],
    ["text", "output_file"],
)

tts = (
    TextToSpeech()
    .setSubscriptionKey(service_key)
    .setTextCol("text")
    .setLocation(service_loc)
    .setVoiceName("en-US-JennyNeural")
    .setOutputFileCol("output_file")
)

# Check to make sure there were no errors during audio creation
display(tts.transform(df))

Détecter les anomalies dans les données de séries chronologiques

Le Détecteur d’anomalies est idéal pour détecter les irrégularités dans vos données de séries chronologiques. L'exemple de code suivant utilise le service Détecteur d’anomalies pour rechercher des anomalies dans des données de séries temporelles entières.

# Create a dataframe with the point data that Anomaly Detector requires
df = spark.createDataFrame(
    [
        ("1972-01-01T00:00:00Z", 826.0),
        ("1972-02-01T00:00:00Z", 799.0),
        ("1972-03-01T00:00:00Z", 890.0),
        ("1972-04-01T00:00:00Z", 900.0),
        ("1972-05-01T00:00:00Z", 766.0),
        ("1972-06-01T00:00:00Z", 805.0),
        ("1972-07-01T00:00:00Z", 821.0),
        ("1972-08-01T00:00:00Z", 20000.0),
        ("1972-09-01T00:00:00Z", 883.0),
        ("1972-10-01T00:00:00Z", 898.0),
        ("1972-11-01T00:00:00Z", 957.0),
        ("1972-12-01T00:00:00Z", 924.0),
        ("1973-01-01T00:00:00Z", 881.0),
        ("1973-02-01T00:00:00Z", 837.0),
        ("1973-03-01T00:00:00Z", 9000.0),
    ],
    ["timestamp", "value"],
).withColumn("group", lit("series1"))

# Run the Anomaly Detector service to look for irregular data
anamoly_detector = (
    SimpleDetectAnomalies()
    .setSubscriptionKey(anomaly_key)
    .setLocation(anomaly_loc)
    .setTimestampCol("timestamp")
    .setValueCol("value")
    .setOutputCol("anomalies")
    .setGroupbyCol("group")
    .setGranularity("monthly")
)

# Show the full results of the analysis with the anomalies marked as "True"
display(
    anamoly_detector.transform(df).select("timestamp", "value", "anomalies.isAnomaly")
)

Obtenir des informations à partir d'API Web arbitraires

Avec HTTP sur Spark, vous pouvez utiliser n'importe quel service Web dans votre pipeline Big Data. L'exemple de code suivant utilise l'API de la Banque mondiale pour obtenir des informations sur divers pays du monde.

# Use any requests from the python requests library


def world_bank_request(country):
    return Request(
        "GET", "http://api.worldbank.org/v2/country/{}?format=json".format(country)
    )


# Create a dataframe with specifies which countries we want data on
df = spark.createDataFrame([("br",), ("usa",)], ["country"]).withColumn(
    "request", http_udf(world_bank_request)(col("country"))
)

# Much faster for big data because of the concurrency :)
client = (
    HTTPTransformer().setConcurrency(3).setInputCol("request").setOutputCol("response")
)

# Get the body of the response


def get_response_body(resp):
    return resp.entity.content.decode()


# Show the details of the country data returned
display(
    client.transform(df).select(
        "country", udf(get_response_body)(col("response")).alias("response")
    )
)