通过 Cloud Natural Language API,您可以从文本中提取实体,执行情感和语法分析,以及将文本分类。
在此实验中,我们将学习如何使用 Natural Language API 分析实体、情感和语法。
学习内容
- 创建 Natural Language API 请求并通过 curl 调用此 API
- 通过 Natural Language API 从文本中提取实体并进行情感分析
- 通过 Natural Language API 对文本执行语言分析
- 用其他语言创建 Natural Language API 请求
所需条件
您将如何使用本教程?
您如何评价自己在 Google Cloud Platform 方面的经验水平?
自定进度的环境设置
如果您还没有 Google 账号(Gmail 或 Google Apps),则必须创建一个。登录 Google Cloud Platform Console (console.cloud.google.com) 并创建一个新项目:
请记住项目 ID,它在所有 Google Cloud 项目中都是唯一名称(很抱歉,上述名称已被占用,您无法使用!)。它稍后将在此 Codelab 中被称为 PROJECT_ID。
接下来,您需要在 Cloud Console 中启用结算功能,才能使用 Google Cloud 资源。
在此 Codelab 中运行仅花费几美元,但是如果您决定使用更多资源或继续让它们运行,费用可能更高(请参阅本文档末尾的“清理”部分)。
Google Cloud Platform 的新用户有资格获享 $300 免费试用。
点击屏幕左上角的菜单图标。

从下拉菜单中选择 API 和服务,然后点击“信息中心”

点击启用 API 和服务。

然后,在搜索框中搜索“语言”。点击 Google Cloud Natural Language API:

点击启用以启用 Cloud Natural Language API:

等待几秒钟,直到该功能启用。启用后,您会看到以下内容:

Google Cloud Shell 是 在云端运行的命令行环境。这个基于 Debian 的虚拟机上已加载您需要的所有开发工具(gcloud、bq、git 等),并提供永久性的 5 GB 主目录。我们将使用 Cloud Shell 创建发送给 Natural Language API 的请求。
如需开始使用 Cloud Shell,请点击标题栏右上角的“激活 Google Cloud Shell”
图标

一个 Cloud Shell 会话随即会在控制台底部的新框内打开,并显示命令行提示符。等待直到出现 user@project:~$ 提示
由于我们后续将使用 curl 向 Natural Language API 发送请求,所以需要生成 API 密钥来传入请求网址。如需创建 API 密钥,请前往 Cloud 控制台中“API 和服务”的“凭据”部分:


在下拉菜单中选择 API 密钥:

接下来,复制您刚刚生成的密钥。您将在本实验的后面部分需要此密钥。
现在您已经有了 API 密钥,可以将其保存到一个环境变量中,这样就不必在每个请求中都手动插入该 API 密钥的值。您可以在 Cloud Shell 中执行此操作。请务必将 <your_api_key> 替换为您刚刚复制的密钥。
export API_KEY=<YOUR_API_KEY>我们将使用的第一个 Natural Language API 方法是 analyzeEntities。通过此方法,API 可以从文本中提取实体(例如人物、地点和事件)。若要试用 API 的实体分析功能,请使用以下语句:
Joanne Rowling, who writes under the pen names J. K. Rowling and Robert Galbraith, is a British novelist and screenwriter who wrote the Harry Potter fantasy series.
我们将在 request.json 文件中构建对 Natural Language API 的请求。在 Cloud Shell 环境中,使用以下代码创建 request.json 文件。您可以使用自己习惯使用的任一命令行编辑器(nano、vim、emacs 等)创建该文件,也可以使用 Cloud Shell 中的内置 Orion 编辑器:

request.json
{
"document":{
"type":"PLAIN_TEXT",
"content":"Joanne Rowling, who writes under the pen names J. K. Rowling and Robert Galbraith, is a British novelist and screenwriter who wrote the Harry Potter fantasy series."
},
"encodingType":"UTF8"
}在请求中,我们告知 Natural Language API 有关我们将要发送的文本的信息。支持的类型值为 PLAIN_TEXT 或 HTML。在内容中,我们传递要发送给 Natural Language API 以进行分析的文本。Natural Language API 还支持发送存储在 Cloud Storage 中的文件以进行文本处理。如果我们想发送来自 Cloud Storage 的文件,请将 content 替换为 gcsContentUri,并为其赋予 Cloud Storage 中的文本文件的 URI 值。encodingType 告知 API 在处理文本时使用哪种类型的文本编码。API 将使用它来计算特定实体是否出现在文本中。
现在,您可以通过以下 curl 命令(全部包含在一个命令行中)将请求正文以及之前保存的 API 密钥环境变量传递给 Natural Language API:
curl "https://language.googleapis.com/v1/documents:analyzeEntities?key=${API_KEY}" \
-s -X POST -H "Content-Type: application/json" --data-binary @request.json响应的开头应如下所示:
{
"entities": [
{
"name": "Robert Galbraith",
"type": "PERSON",
"metadata": {
"mid": "/m/042xh",
"wikipedia_url": "https://en.wikipedia.org/wiki/J._K._Rowling"
},
"salience": 0.7980405,
"mentions": [
{
"text": {
"content": "Joanne Rowling",
"beginOffset": 0
},
"type": "PROPER"
},
{
"text": {
"content": "Rowling",
"beginOffset": 53
},
"type": "PROPER"
},
{
"text": {
"content": "novelist",
"beginOffset": 96
},
"type": "COMMON"
},
{
"text": {
"content": "Robert Galbraith",
"beginOffset": 65
},
"type": "PROPER"
}
]
},
...
]
}对于响应中的每个实体,我们会获得实体 type、相关的维基百科网址(若有)、salience 和指示此实体在文本中出现的位置的索引。显著性是 [0,1] 范围内的一个数字,表示相应实体对整个文本的中心性。Natural Language API 还可识别以不同方式提及的同一实体。查看响应中的 mentions 列表:API 能够分辨出“Joanne Rowling”“Rowling”“novelist”和“Robert Galbriath”均指代同一个人。
通过 Natural Language API,不仅可以提取实体,还能对一段文本执行情感分析。我们的 JSON 请求将包含与上述请求相同的参数,但这次我们将更改文本,使其包含的内容具有更强烈的感情。将您的 request.json 文件替换为以下内容,并可随意将下方的 content 替换为您自己的文本:
request.json
{
"document":{
"type":"PLAIN_TEXT",
"content":"Harry Potter is the best book. I think everyone should read it."
},
"encodingType": "UTF8"
}接下来,我们将向此 API 的 analyzeSentiment 端点发送请求:
curl "https://language.googleapis.com/v1/documents:analyzeSentiment?key=${API_KEY}" \
-s -X POST -H "Content-Type: application/json" --data-binary @request.json
响应应如下所示:
{
"documentSentiment": {
"magnitude": 0.8,
"score": 0.4
},
"language": "en",
"sentences": [
{
"text": {
"content": "Harry Potter is the best book.",
"beginOffset": 0
},
"sentiment": {
"magnitude": 0.7,
"score": 0.7
}
},
{
"text": {
"content": "I think everyone should read it.",
"beginOffset": 31
},
"sentiment": {
"magnitude": 0.1,
"score": 0.1
}
}
]
}请注意,我们获得了两种类型的情感值:文档整体的情感,以及按语句细分的情感。sentiment 方法返回了两个值:score 和 magnitude。score 是一个介于 -1.0 到 1.0 之间的数字,表示语句中所表达情感的积极或消极程度。magnitude 是一个介于 0 到无穷之间的数字,表示语句中所表达情感的权重,无论该情感是积极还是消极的。包含高权重语句的较长文本段落具有较高的 magnitude 值。第一个语句的 score 为积极 (0.7),而第二个语句的 score 为中性 (0.1)。
除了提供有关我们发送给 NL API 的整个文本文档的情感详细信息之外,它还能按文本中的实体细分情感。我们以以下句子为例:
I liked the sushi but the service was terrible.
在本例中,像上例中那样获取整个句子的情感分数可能不怎么有用。如果这是餐厅评价,并且您有同一间餐厅的数百条评价,您会想要了解人们在评价中表明自己喜欢和不喜欢哪些确切方面。幸运的是,NL API 提供了一种方法来获取文本中每个实体对应的情感,称为 analyzeEntitySentiment。使用上述句子更新您的 request.json 以进行试用:
request.json
{
"document":{
"type":"PLAIN_TEXT",
"content":"I liked the sushi but the service was terrible."
},
"encodingType": "UTF8"
}然后使用以下 curl 命令调用 analyzeEntitySentiment 端点:
curl "https://language.googleapis.com/v1/documents:analyzeEntitySentiment?key=${API_KEY}" \
-s -X POST -H "Content-Type: application/json" --data-binary @request.json
在响应中,我们得到了两个实体对象:“sushi”一个、“service”一个。完整的 JSON 响应如下:
{
"entities": [
{
"name": "sushi",
"type": "CONSUMER_GOOD",
"metadata": {},
"salience": 0.52716845,
"mentions": [
{
"text": {
"content": "sushi",
"beginOffset": 12
},
"type": "COMMON",
"sentiment": {
"magnitude": 0.9,
"score": 0.9
}
}
],
"sentiment": {
"magnitude": 0.9,
"score": 0.9
}
},
{
"name": "service",
"type": "OTHER",
"metadata": {},
"salience": 0.47283158,
"mentions": [
{
"text": {
"content": "service",
"beginOffset": 26
},
"type": "COMMON",
"sentiment": {
"magnitude": 0.9,
"score": -0.9
}
}
],
"sentiment": {
"magnitude": 0.9,
"score": -0.9
}
}
],
"language": "en"
}
可以看到,“sushi”的得分为 0.9,而“service”的得分为 -0.9。不错!您可能还会注意到,针对每个实体返回了两个情感对象。如果这些字词中的任意一个被提及多次,该 API 将针对每次提及返回不同的情感分数和量级,以及该实体的总体情感。
接下来,我们来看看 Natural Language API 的第三种方法 - 语法注释,深入了解文本的语言细节。analyzeSyntax 是一种方法,可提供文本的语义和语法元素的完整详细信息。对于文本中的每个字词,API 将告知我们该字词的词性(名词、动词、形容词等)及其与语句中其他字词的关系(它是否为根动词?是否为修饰语?)。
我们用简单语句试一试。我们的 JSON 请求与以上各个请求类似,只是增加了特征键。这会告知 API 我们要执行语法注释。将您的 request.json 替换为以下内容:
request.json
{
"document":{
"type":"PLAIN_TEXT",
"content": "Hermione often uses her quick wit, deft recall, and encyclopaedic knowledge to help Harry and Ron."
},
"encodingType": "UTF8"
}然后调用 API 的 analyzeSyntax 方法:
curl "https://language.googleapis.com/v1/documents:analyzeSyntax?key=${API_KEY}" \
-s -X POST -H "Content-Type: application/json" --data-binary @request.json对于语句中的每个词元,响应会返回如下所示的一个对象。下面我们来看看“uses”一词的响应:
{
"text": {
"content": "uses",
"beginOffset": 15
},
"partOfSpeech": {
"tag": "VERB",
"aspect": "ASPECT_UNKNOWN",
"case": "CASE_UNKNOWN",
"form": "FORM_UNKNOWN",
"gender": "GENDER_UNKNOWN",
"mood": "INDICATIVE",
"number": "SINGULAR",
"person": "THIRD",
"proper": "PROPER_UNKNOWN",
"reciprocity": "RECIPROCITY_UNKNOWN",
"tense": "PRESENT",
"voice": "VOICE_UNKNOWN"
},
"dependencyEdge": {
"headTokenIndex": 2,
"label": "ROOT"
},
"lemma": "use"
}我们来详细分析一下回答。partOfSpeech 提供了每个字词的语言学详细信息(许多信息都是未知的,因为它们不适用于英语或此特定字词)。tag 给出了相应字词的词性,在本例中为动词。我们还会获取时态、情态以及单词是单数还是复数的详细信息。lemma 是字词的规范形式(对于“uses”,它是“use”)。例如,run、runs、ran 和 running 这几个词的词元均为 run。lemma 值可用于跟踪一个词在大段文字中的出现次数。
dependencyEdge 包含可用于创建文本依存关系解析树的数据。这是呈现语句中字词间相互关系的图表。以上语句的依存关系解析树可能如下所示:

上面响应中的 headTokenIndex 是具有指向“uses”的弧的词元的索引。我们可以将句子中的每个词元视为数组中的一个词,而“uses”的 headTokenIndex 为 2 是指它在树中连接到的词“often”。
Natural Language API 还支持英语以外的语言(完整列表请点击此处查看)。我们来尝试以下实体请求,并使用一个日语句子:
request.json
{
"document":{
"type":"PLAIN_TEXT",
"content":"日本のグーグルのオフィスは、東京の六本木ヒルズにあります"
},
"encodingType": "UTF8"
}请注意,我们并未告知 API 文本采用哪种语言写成,它能自动检测语言。接下来,我们会将其发送到 analyzeEntities 端点:
curl "https://language.googleapis.com/v1/documents:analyzeEntities?key=${API_KEY}" \
-s -X POST -H "Content-Type: application/json" --data-binary @request.json以下是响应中的前两个实体:
{
"entities": [
{
"name": "日本",
"type": "LOCATION",
"metadata": {
"mid": "/m/03_3d",
"wikipedia_url": "https://en.wikipedia.org/wiki/Japan"
},
"salience": 0.23854347,
"mentions": [
{
"text": {
"content": "日本",
"beginOffset": 0
},
"type": "PROPER"
}
]
},
{
"name": "グーグル",
"type": "ORGANIZATION",
"metadata": {
"mid": "/m/045c7b",
"wikipedia_url": "https://en.wikipedia.org/wiki/Google"
},
"salience": 0.21155767,
"mentions": [
{
"text": {
"content": "グーグル",
"beginOffset": 9
},
"type": "PROPER"
}
]
},
...
]
"language": "ja"
}该 API 会提取“日本”作为位置和“Google”作为组织,以及每个实体的维基百科网页。
您已学习如何通过 Cloud Natural Language API 提取实体、分析情感和进行语法注释,以执行文本分析。
所学内容
- 创建 Natural Language API 请求并通过 curl 调用此 API
- 通过 Natural Language API 从文本中提取实体并进行情感分析
- 对文本执行语言分析以创建依存关系解析树
- 以日语创建 Natural Language API 请求
后续步骤
- 查看文档中的 Natural Language API 教程。
- 试用 Vision API 和 Speech API!