教程:采用 Azure AI 服务的文本分析
在本教程中,你将学习如何使用文本分析在 Azure Synapse Analytics 上分析非结构化文本。 文本分析是一项 Azure AI 服务,通过它可使用自然语言处理 (NLP) 功能执行文本挖掘和文本分析。
本教程演示如何将文本分析和 SynapseML 结合使用来实现以下目的:
- 在句子或文档级别检测情感标签
- 标识给定文本输入的语言
- 识别文本中包含指向已知知识库的链接的实体
- 从文本中提取关键短语
- 标识文本中的不同实体并将它们归类到预定义的类或类型中
- 标识并标记给定文本中的敏感实体
如果没有 Azure 订阅,可在开始前创建一个试用帐户。
先决条件
- Azure Synapse Analytics 工作区,其中 Azure Data Lake Storage Gen2 存储帐户配置为默认存储。 你需要成为所使用的 Data Lake Storage Gen2 文件系统的存储 Blob 数据参与者。
- Azure Synapse Analytics 工作区中的 Spark 池。 有关详细信息,请参阅在 Azure Synapse 中创建 Spark 池。
- 在 Azure Synapse 中配置 Azure AI 服务教程中所述的预配置步骤。
开始使用
打开 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))
预期结果
实体检测程序
实体检测程序返回已识别实体的列表,其中包含指向已知知识库的链接。 有关已启用语言的列表,请参阅文本分析 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")))
预期结果
关键短语提取程序
“关键短语提取”可以计算非结构化的文本,并返回关键短语列表。 如果需要快速确定文档集中的要点,此功能十分有用。 有关已启用语言的列表,请参阅文本分析 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")))
预期结果
个人身份信息 (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")))
预期结果
清理资源
为了确保关闭 Spark 实例,请结束任何已连接的会话(笔记本)。 达到 Apache Spark 池中指定的空闲时间时,池将会关闭。 也可以从笔记本右上角的状态栏中选择“停止会话”。