教程:采用 Azure AI 服务的文本分析

在本教程中,你将学习如何使用文本分析在 Azure Synapse Analytics 上分析非结构化文本。 文本分析是一项 Azure AI 服务,通过它可使用自然语言处理 (NLP) 功能执行文本挖掘和文本分析。

本教程演示如何将文本分析和 SynapseML 结合使用来实现以下目的:

  • 在句子或文档级别检测情感标签
  • 标识给定文本输入的语言
  • 识别文本中包含指向已知知识库的链接的实体
  • 从文本中提取关键短语
  • 标识文本中的不同实体并将它们归类到预定义的类或类型中
  • 标识并标记给定文本中的敏感实体

如果没有 Azure 订阅,可在开始前创建一个试用帐户

先决条件

开始使用

打开 Synapse Studio 并创建新笔记本。 若要开始,请导入 SynapseML

import synapse.ml
from synapse.ml.services import *
from pyspark.sql.functions import col

配置文本分析

使用在配置前的步骤中配置的链接文本分析。

linked_service_name = "<Your linked service for text analytics>"

文本情绪

文本情绪分析提供了一种在句子和文档级别检测情绪标签(如“消极”、“中性”和“积极”)和置信度分数的方法。 有关已启用语言的列表,请参阅文本分析 API 中支持的语言


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

# Run the Text Analytics service with options
sentiment = (TextSentiment()
    .setLinkedService(linked_service_name)
    .setTextCol("text")
    .setOutputCol("sentiment")
    .setErrorCol("error")
    .setLanguageCol("language"))

# Show the results of your text query in a table format
results = sentiment.transform(df)

display(results
    .withColumn("sentiment", col("sentiment").getItem("document").getItem("sentences")[0].getItem("sentiment"))
    .select("text", "sentiment"))

预期结果

text 情绪
今天天气晴朗,我真高兴! 积极
我被这高峰时段的交通弄得心烦意乱 消极
Spark 上的 Azure AI 服务还不错 中立

语言检测程序

语言检测程序评估每个文档的文本输入,并返回带有指示分析强度分数的语言标识符。 此功能对于用于收集语言未知的任意文本的内容存储非常有用。 有关已启用语言的列表,请参阅文本分析 API 中支持的语言

# Create a dataframe that's tied to it's column names
df = spark.createDataFrame([
  ("Hello World",),
  ("Bonjour tout le monde",),
  ("La carretera estaba atascada. Había mucho tráfico el día de ayer.",),
  ("你好",),
  ("こんにちは",),
  (":) :( :D",)
], ["text",])

# Run the Text Analytics service with options
language = (LanguageDetector()
    .setLinkedService(linked_service_name)
    .setTextCol("text")
    .setOutputCol("language")
    .setErrorCol("error"))

# Show the results of your text query in a table format
display(language.transform(df))

预期结果

语言检测程序 v3.1 的预期结果

实体检测程序

实体检测程序返回已识别实体的列表,其中包含指向已知知识库的链接。 有关已启用语言的列表,请参阅文本分析 API 中支持的语言

df = spark.createDataFrame([
    ("1", "Microsoft released Windows 10"),
    ("2", "In 1975, Bill Gates III and Paul Allen founded the company.")
], ["if", "text"])

entity = (EntityDetector()
    .setLinkedService(linked_service_name)
    .setLanguage("en")
    .setOutputCol("replies")
    .setErrorCol("error"))

display(entity.transform(df).select("if", "text", col("replies").getItem("document").getItem("entities").alias("entities")))

预期结果

实体检测程序 v3.1 的预期结果


关键短语提取程序

“关键短语提取”可以计算非结构化的文本,并返回关键短语列表。 如果需要快速确定文档集中的要点,此功能十分有用。 有关已启用语言的列表,请参阅文本分析 API 中支持的语言

df = spark.createDataFrame([
    ("en", "Hello world. This is some input text that I love."),
    ("fr", "Bonjour tout le monde"),
    ("es", "La carretera estaba atascada. Había mucho tráfico el día de ayer.")
], ["lang", "text"])

keyPhrase = (KeyPhraseExtractor()
    .setLinkedService(linked_service_name)
    .setLanguageCol("lang")
    .setOutputCol("replies")
    .setErrorCol("error"))

display(keyPhrase.transform(df).select("text", col("replies").getItem("document").getItem("keyPhrases").alias("keyPhrases")))

预期结果

text keyPhrases
Hello world. 这是我喜欢的一些输入文本。 "["Hello world","input text"]"
Bonjour tout le monde "["Bonjour","monde"]"
La carretera estaba atascada. Había mucho tráfico el día de ayer. "["mucho tráfico","día","carretera","ayer"]"

命名实体识别 (NER)

命名实体识别 (NER) 是指识别文本中不同实体,并将它们分入预定义类或类型(例如:人员、位置、事件、产品和组织)的能力。 有关已启用语言的列表,请参阅文本分析 API 中支持的语言

df = spark.createDataFrame([
    ("1", "en", "I had a wonderful trip to Seattle last week."),
    ("2", "en", "I visited Space Needle 2 times.")
], ["id", "language", "text"])

ner = (NER()
    .setLinkedService(linked_service_name)
    .setLanguageCol("language")
    .setOutputCol("replies")
    .setErrorCol("error"))

display(ner.transform(df).select("text", col("replies").getItem("document").getItem("entities").alias("entities")))

预期结果

命名实体识别 v3.1 的预期结果


个人身份信息 (PII) V3.1

PII 功能是 NER 的一部分,可以识别和标记文本中与个人相关的敏感实体,例如:电话号码、电子邮件地址、邮寄地址、护照号码。 有关已启用语言的列表,请参阅文本分析 API 中支持的语言

df = spark.createDataFrame([
    ("1", "en", "My SSN is 859-98-0987"),
    ("2", "en", "Your ABA number - 111000025 - is the first 9 digits in the lower left hand corner of your personal check."),
    ("3", "en", "Is 998.214.865-68 your Brazilian CPF number?")
], ["id", "language", "text"])

pii = (PII()
    .setLinkedService(linked_service_name)
    .setLanguageCol("language")
    .setOutputCol("replies")
    .setErrorCol("error"))

display(pii.transform(df).select("text", col("replies").getItem("document").getItem("entities").alias("entities")))

预期结果

个人身份信息 v3.1 的预期结果


清理资源

为了确保关闭 Spark 实例,请结束任何已连接的会话(笔记本)。 达到 Apache Spark 池中指定的空闲时间时,池将会关闭。 也可以从笔记本右上角的状态栏中选择“停止会话”。

显示状态栏上的“停止会话”按钮的屏幕截图。