Python-exempel för Cognitive Services för stordata

Följande kodfragment är redo att köras och hjälper dig att komma igång med att Cognitive Services på Spark med Python.

Exemplen i den här artikeln använder följande Cognitive Services:

  • Språktjänst – hämta sentiment (eller känsla) för en uppsättning meningar.
  • Visuellt innehåll – hämta de taggar (en ordbeskrivningar) som är associerade med en uppsättning bilder.
  • Bing Bildsökning – sök på webben efter bilder som är relaterade till en fråga på naturligt språk.
  • Tal till text – transkribera ljudfiler för att extrahera textbaserade avskrifter.
  • Avvikelseidentifiering – identifiera avvikelser inom en tidsseriedata.

Förutsättningar

  1. Följ stegen i Komma igång för att konfigurera din Azure Databricks och Cognitive Services miljö. Den här självstudien visar hur du installerar MMLSpark och hur du skapar ditt Spark-kluster i Databricks.
  2. När du har skapat en ny notebook Azure Databricks kopierar du den delade koden nedan och klistrar in den i en ny cell i anteckningsboken.
  3. Välj ett tjänstexempel nedan och kopiera och klistra in det i en andra ny cell i anteckningsboken.
  4. Ersätt någon av platshållarna för tjänstprenumerationsnyckeln med din egen nyckel.
  5. Välj körningsknappen (triangelikonen) i det övre högra hörnet av cellen och välj sedan Kör cell.
  6. Visa resultat i en tabell under cellen.

Delad kod

För att komma igång måste vi lägga till den här koden i projektet:

from mmlspark.cognitive import *

# A general Cognitive Services key for the Language service and Computer Vision (or use separate keys that belong to each service)
service_key = "ADD_YOUR_SUBSCRIPION_KEY"
# A Bing Search v7 subscription key
bing_search_key = "ADD_YOUR_SUBSCRIPION_KEY"
# An Anomaly Dectector subscription key
anomaly_key = "ADD_YOUR_SUBSCRIPION_KEY"

# Validate the key
assert service_key != "ADD_YOUR_SUBSCRIPION_KEY"

Exempel på språktjänst

Language Service tillhandahåller flera algoritmer för att extrahera intelligenta insikter från text. Vi kan till exempel hitta attityden hos den angivna indatatexten. Tjänsten returnerar ett resultat mellan 0,0 och 1,0 där låga poäng indikerar negativ attityd och hög poäng indikerar positiv attityd. Det här exemplet använder tre enkla meningar och returnerar sentiment för var och en.

from pyspark.sql.functions import col

# 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 Language service with options
sentiment = (TextSentiment()
    .setTextCol("text")
    .setLocation("eastus")
    .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")[0].getItem("sentiment").alias("sentiment")))

Förväntat resultat

text Känsla
Jag är så nöjd idag, dess soliga! positivt
Jag är frustrerad över den här trafiken i timmen negativt
De kognitiva tjänsterna på Spark är inte bra positivt

Visuellt innehåll exempel

Visuellt innehåll analyserar bilder för att identifiera struktur som ansikten, objekt och beskrivningar av naturligt språk. I det här exemplet taggar vi en lista med bilder. Taggar är ordbeskrivningar av saker i bilden, till exempel identifierbara objekt, människor, landskap och åtgärder.


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

# Run the Computer Vision service. Analyze Image extracts infortmation from/about the images.
analysis = (AnalyzeImage()
    .setLocation("eastus")
    .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"))

Förväntat resultat

image tags
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-sample-data-files/master/ComputerVision/Images/objects.jpg ['skating' 'person' 'man' 'outdoor' 'sports' 'sport' 'jump' 'trick' 'board' 'shirt' 'air' 'black' 'park' 'boy' 'side' 'jump' 'trick' 'ramp' 'doing' 'jump' 'jump' 'ramp' 'doing' 'jump']
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-sample-data-files/master/ComputerVision/Images/dog.jpg ['dog' 'outdoor' 'fence' 'fence' 'fence' 'small' 'brown' 'building' 'sitting' 'front' 'standing' 'table' 'walking' 'board' 'beach' 'white' 'holding' 'bridge' 'track']
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-sample-data-files/master/ComputerVision/Images/house.jpg ['utomhus' ''' 'house' 'house' 'building' 'old' 'home' 'front' 'small' 'start' 'brick' 'brick' 'large' 'leading' 'brick' 'building' 'green' 'sitting' 'leading' 'brick' " "risk" "street" "white" "country" "clock" "sign" "parked" "field" "standing" "garden" "water" "red" "horse" "man" "tall" "fire" "group"]

Bing Bildsökning exempel

Bing Bildsökning söker på webben för att hämta bilder relaterade till en användares fråga på naturligt språk. I det här exemplet använder vi en textfråga som söker efter bilder med citattecken. Den returnerar en lista över bild-URL:er som innehåller foton relaterade till vår fråga.

from pyspark.ml import PipelineModel

# 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))

Förväntat resultat

url
https://iheartintelligence.com/wp-content/uploads/2019/01/powerful-quotes-martin-luther-king-jr.jpg
http://everydaypowerblog.com/wp-content/uploads/2014/01/Martin-Luther-King-Jr.-Quotes-16.jpg
http://www.sofreshandsogreen.com/wp-content/uploads/2012/01/martin-luther-king-jr-quote-sofreshandsogreendotcom.jpg
https://everydaypowerblog.com/wp-content/uploads/2014/01/Martin-Luther-King-Jr.-Quotes-18.jpg
https://tsal-eszuskq0bptlfh8awbb.stackpathdns.com/wp-content/uploads/2018/01/MartinLutherKingQuotes.jpg

Tal till text-exempel

Tal till text-tjänsten konverterar strömmar eller filer med talat ljud till text. I det här exemplet transkriberar vi två ljudfiler. Den första filen är lätt att förstå och den andra är mer utmanande.


# 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",),
                           ("https://mmlspark.blob.core.windows.net/datasets/Speech/audio3.mp3",)
                           ], ["url"])

# Run the Speech-to-text service to translate the audio into text
speech_to_text = (SpeechToTextSDK()
    .setSubscriptionKey(service_key)
    .setLocation("eastus")
    .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"))

Förväntat resultat

url DisplayText
https://mmlspark.blob.core.windows.net/datasets/Speech/audio2.wav Anpassat tal innehåller verktyg som gör att du visuellt kan inspektera igenkänningskvaliteten för en modell genom att jämföra ljuddata med motsvarande igenkänningsresultat från den anpassade talportalen. Du kan spela upp uppladdat ljud och avgöra om det angivna igenkänningsresultatet är korrekt. Med det här verktyget kan du snabbt inspektera kvaliteten på Microsofts baslinjetal till text-modell eller en tränad anpassad modell utan att behöva transkribera några ljuddata.
https://mmlspark.blob.core.windows.net/datasets/Speech/audio3.mp3 Lägg till en sir som tänker visuell kontroll.
https://mmlspark.blob.core.windows.net/datasets/Speech/audio3.mp3 Jag hör vad jag tycker.
https://mmlspark.blob.core.windows.net/datasets/Speech/audio3.mp3 Jag gillar den trygghet för radio som jag kan höra också.

Avvikelseidentifiering exempel

Avvikelseidentifiering är bra för att upptäcka oregelbundenheter i dina tidsseriedata. I det här exemplet använder vi tjänsten för att hitta avvikelser i hela tidsserien.

from pyspark.sql.functions import lit

# 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("eastus")
  .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"))

Förväntat resultat

timestamp värde isAnomaly
1972-01-01T00:00:00Z 826 Falskt
1972-02-01T00:00:00Z 799 Falskt
1972-03-01T00:00:00Z 890 Falskt
1972-04-01T00:00:00Z 900 Falskt
1972-05-01T00:00:00Z 766 Falskt
1972-06-01T00:00:00Z 805 Falskt
1972-07-01T00:00:00Z 821 Falskt
1972-08-01T00:00:00Z 20000 Sant
1972-09-01T00:00:00Z 883 Falskt
1972-10-01T00:00:00Z 898 Falskt
1972-11-01T00:00:00Z 957 Falskt
1972-12-01T00:00:00Z 924 Falskt
1973-01-01T00:00:00Z 881 Falskt
1973-02-01T00:00:00Z 837 Falskt
1973-03-01T00:00:00Z 9000 Sant

Godtyckliga webb-API:er

Med HTTP på Spark kan alla webbtjänster användas i din stordatapipeline. I det här exemplet använder vi World Bank API för att få information om olika länder runt om i världen.

from requests import Request
from mmlspark.io.http import HTTPTransformer, http_udf
from pyspark.sql.functions import udf, col

# 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 spcificies 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")))

Förväntat resultat

land svar
Br [{"page":1,"pages":1,"per_page":"50","total":1},[{"id":"BRA","iso2Code":"BR","name":"Brazil","region":{"id":"LCN","iso2code":"ZJ","value":"Latinamerika & Paulo "},"adminregion":{"id":"LAC","iso2code":"XJ","value":"Latinamerika & Contain (exklusive hög inkomst)"},"incomeLevel":{"id":"UMC","iso2code":"XT","value":"Upper middle income"},"type":{"id":"IBD","iso2code":"XF","value":"IBRD"},"capitalCity":"Brasilia", "longitud":"-47.9292","latitude":"-15.7801"}]]
Usa [{"page":1,"pages":1,"per_page":"50","total":1},[{"id":"USA","iso2Code":"US","name":"USA","region":{"id":"NAC","iso2code":"XU","value":"Nordamerika"},"adminregion":{"id":"","iso2code":"",""value":""},"incomeLevel":{"id":"HIC","iso2code":"XD","value":"High income"},"type":{"id":"LNX","iso2code":"XX","value":"Not classified"},"capitalCity":"Washington D.C.","longitude":"-77.032","latitude":"38.8895"}]]

Se även