作为一名技术搜索引擎优化师,我一直在寻找以新颖的方式使用数据的方法,以更好地了解 Google 如何对网站进行排名。我最近调查了 Google 的 Natural Language API 是否可以更好地说明 Google 如何对网站内容进行分类。
虽然有 开源 NLP 工具,但我希望探索 Google 的工具,因为我假设它可能在其他产品(如搜索)中使用相同的技术。本文介绍了 Google Natural Language API,并探讨了常见的自然语言处理 (NLP) 任务,以及如何使用它们来指导网站内容的创建。
理解数据类型
首先,重要的是要了解 Google Natural Language API 返回的数据类型。
实体
实体是可以追溯到物理世界中事物的文本短语。命名实体识别 (NER) 是 NLP 的一个难点,因为工具通常需要查看单词周围的完整上下文才能理解它们的用法。例如,同形异义词拼写相同,但有多种含义。句子中的“lead”是指金属(名词)、导致某人移动(动词)还是戏剧中的主角(也是名词)?Google 有 12 种不同的实体类型,以及第 13 种包罗万象的类别,称为“UNKNOWN”。一些实体可以追溯到 Wikipedia 文章,这表明 知识图谱 对数据的影响。每个实体都会返回一个显着性分数,表示其与提供的文本的总体相关性。

情感
情感是对事物的看法或态度,在文档和句子级别以及文档中发现的各个实体层面进行衡量。情感的分数范围从 -1.0(负面)到 1.0(正面)。幅度表示情感的非标准化强度;范围在 0.0 到无穷大之间。

语法
语法解析包含更好的库中发现的大多数常见 NLP 活动,例如 词形还原、词性标注 和 依存关系树解析。NLP 主要处理帮助机器理解文本以及单词之间的关系。语法解析是大多数语言处理或理解任务的基础部分。

类别
类别将给定的全部内容分配到特定的行业或主题类别,置信度得分从 0.0 到 1.0。这些类别似乎与其他 Google 工具(如 AdWords)使用的受众和网站类别相同。

提取一些数据
现在我将提取一些示例数据来试用。我使用 Google 的 Search Console API 收集了一些搜索查询及其对应的 URL。Google Search Console 是一种工具,用于报告人们使用哪些术语通过 Google 搜索找到网站的页面。这个 开源 Jupyter 笔记本 允许您提取有关您网站的类似数据。对于此示例,我提取了一个网站(我不会命名)在 2019 年 1 月 1 日至 6 月 1 日期间生成的 Google Search Console 数据,并将其限制为至少收到一次点击的查询(而不是仅展示次数)。
此数据集包含有关 2,969 个页面和 7,144 个查询的信息,这些查询在 Google 搜索结果中显示了该网站的页面。下表显示,绝大多数页面收到的点击次数很少,因为该网站专注于所谓的长尾(更具体且通常更长)搜索查询,而不是短尾(非常通用,搜索量更高)搜索查询。

为了缩小数据集大小并仅获取效果最佳的页面,我将数据集限制为在期间至少收到 20 次展示的页面。这是此精细数据集的页面点击次数直方图,其中包括 723 个页面

在 Python 中使用 Google Natural Language API 库
为了测试 API,创建一个小程序,利用 Python 中的 google-cloud-language 库。以下代码是 Python 3.5+。
首先,激活一个新的虚拟环境并安装库。将 <your-env> 替换为环境的唯一名称。
virtualenv <your-env>
source <your-env>/bin/activate
pip install --upgrade google-cloud-language
pip install --upgrade requests
此脚本从 URL 提取 HTML,并将 HTML 馈送到 Natural Language API。它返回一个 sentiment、entities 和 categories 的字典,其中这些键的值都是列表。我使用 Jupyter 笔记本运行此代码,因为它使使用相同的内核更容易注释和重试代码。
# Import needed libraries
import requests
import json
from google.cloud import language
from google.oauth2 import service_account
from google.cloud.language import enums
from google.cloud.language import types
# Build language API client (requires service account key)
client = language.LanguageServiceClient.from_service_account_json('services.json')
# Define functions
def pull_googlenlp(client, url, invalid_types = ['OTHER'], **data):
html = load_text_from_url(url, **data)
if not html:
return None
document = types.Document(
content=html,
type=language.enums.Document.Type.HTML )
features = {'extract_syntax': True,
'extract_entities': True,
'extract_document_sentiment': True,
'extract_entity_sentiment': True,
'classify_text': False
}
response = client.annotate_text(document=document, features=features)
sentiment = response.document_sentiment
entities = response.entities
response = client.classify_text(document)
categories = response.categories
def get_type(type):
return client.enums.Entity.Type(entity.type).name
result = {}
result['sentiment'] = []
result['entities'] = []
result['categories'] = []
if sentiment:
result['sentiment'] = [{ 'magnitude': sentiment.magnitude, 'score':sentiment.score }]
for entity in entities:
if get_type(entity.type) not in invalid_types:
result['entities'].append({'name': entity.name, 'type': get_type(entity.type), 'salience': entity.salience, 'wikipedia_url': entity.metadata.get('wikipedia_url', '-') })
for category in categories:
result['categories'].append({'name':category.name, 'confidence': category.confidence})
return result
def load_text_from_url(url, **data):
timeout = data.get('timeout', 20)
results = []
try:
print("Extracting text from: {}".format(url))
response = requests.get(url, timeout=timeout)
text = response.text
status = response.status_code
if status == 200 and len(text) > 0:
return text
return None
except Exception as e:
print('Problem with url: {0}.'.format(url))
return None
要访问 API,请按照 Google 的 快速入门说明 在 Google Cloud Console 中创建一个项目,启用 API,并下载服务帐户密钥。之后,您应该会有一个类似于这样的 JSON 文件

将其上传到您的项目文件夹,文件名为 services.json。
然后,您可以通过运行以下命令为任何 URL(例如 Opensource.com)提取 API 数据
url = "https://open-source.net.cn/article/19/6/how-ssh-running-container"
pull_googlenlp(client,url)
如果设置正确,您应该会看到此输出

为了更容易上手,我创建了一个 Jupyter Notebook,您可以下载并使用它来测试提取网页的实体、类别和情感。我更喜欢使用 JupyterLab,它是 Jupyter Notebook 的扩展,包括文件查看器和其他增强的用户体验功能。如果您是这些工具的新手,我认为 Anaconda 是开始使用 Python 和 Jupyter 的最简单方法。它使安装和设置 Python 以及常用库变得非常容易,尤其是在 Windows 上。
玩转数据
有了这些抓取给定页面的 HTML 并将其传递给 Natural Language API 的函数,我可以对 723 个 URL 进行一些分析。首先,我将查看与该站点相关的类别,方法是查看所有页面返回的顶级类别的计数。
类别

这似乎是对该特定站点关键主题的相当准确的表示。查看一个效果最佳页面排名的单个查询,我可以比较 Google 结果中针对同一查询的其他排名页面。
- URL 1 | 顶级类别:/法律与政府/法律 (0.5099999904632568),共 1 个类别。
- 未返回任何类别。
- URL 3 | 顶级类别:/互联网与电信/移动与无线 (0.6100000143051147),共 1 个类别。
- URL 4 | 顶级类别:/计算机与电子产品/软件 (0.5799999833106995),共 2 个类别。
- URL 5 | 顶级类别:/互联网与电信/移动与无线/移动应用与插件 (0.75),共 1 个类别。
- 未返回任何类别。
- URL 7 | 顶级类别:/计算机与电子产品/软件/商业与生产力软件 (0.7099999785423279),共 2 个类别。
- URL 8 | 顶级类别:/法律与政府/法律 (0.8999999761581421),共 3 个类别。
- URL 9 | 顶级类别:/参考/通用参考/表格指南与模板 (0.6399999856948853),共 1 个类别。
- 未返回任何类别。
上面括号中的数字表示 Google 对页面内容与该类别相关的置信度。第八个结果对于同一类别的置信度远高于第一个结果,因此这似乎不是定义排名相关性的灵丹妙药。此外,这些类别太宽泛,无法理解特定的搜索主题。
查看按排名位置的平均置信度,至少对于此数据集而言,这两个指标之间似乎没有关联

这两种方法对于大规模审查网站以确保内容类别看起来合适,并且样板或销售内容不会将您的页面移出您主要专业领域的范围是有意义的。想想如果您销售工业用品,但您的页面返回营销作为主要类别。似乎没有强烈的暗示表明类别相关性与您的排名好坏有任何关系,至少在页面级别是这样。
情感
我不会在情感上花费太多时间。在所有从 API 返回情感的页面中,它们分为两类:0.1 和 0.2,这几乎是中性情感。根据直方图,很容易看出情感没有提供太多价值。对于新闻或观点网站来说,衡量情感与特定页面中位排名的相关性将是一个更有趣的指标。

实体
在我看来,实体是 API 中最有趣的部分。这是按显着性(或与页面的相关性)排列的所有页面中顶级实体的选择。请注意,Google 正在为相同的术语(销售单)推断不同的类型,这可能是错误的。这是由术语在内容中以不同的上下文出现引起的。

然后我单独查看了每种实体类型以及所有实体类型,以查看实体的显着性与页面的最佳排名位置之间是否存在任何关联。对于每种类型,我匹配了与按显着性排序(降序)的该类型匹配的顶级实体的显着性(与页面的总体相关性)。
某些实体类型在所有示例中返回零显着性,因此我从下面的图表中省略了这些结果。

消费品实体类型具有最高的正相关性,皮尔逊相关系数为 0.15854,虽然排名数字越小越好,但 人物 实体具有最佳结果,相关系数为 -0.15483。这是一个非常小的样本集,特别是对于单个实体类型,所以我不能对数据做太多解释。我没有发现任何具有强相关性的价值,但 人物 实体最有意义。网站通常有关于其首席执行官和其他主要员工的页面,这些页面很可能在这些查询的搜索结果中表现良好。
接下来,在整体查看网站时,以下主题根据 实体 名称 和 实体类型 出现。

我模糊了一些似乎过于具体的结果,以掩盖网站的身份。从主题上讲,名称信息是按主题查看您(或竞争对手)的网站以查看其核心主题的好方法。这仅基于示例网站的排名 URL 而不是所有网站可能的 URL 完成(因为 Search Console 数据仅报告在 Google 中获得展示次数的页面),但结果会很有趣,特别是如果您要从 Ahrefs 等工具中提取网站的主要排名 URL,该工具跟踪许多、许多查询以及这些查询的 Google 结果。
实体数据中另一个有趣的部分是,标记为 CONSUMER_GOOD 的实体倾向于“看起来”像我在知识结果中看到的结果,即页面右侧的 Google 搜索结果。

在我们的数据集中,消费品 实体名称中,有三个或更多单词的名称中,有 5.8% 的知识结果与 Google 针对实体名称的结果相同。这意味着,如果您在 Google 中搜索该术语或短语,则右侧的区块(例如,上面显示的 Linux 知识结果)将显示在搜索结果页面中。由于 Google“选择”一个示例网页来代表实体,因此这是一个很好的机会来识别在搜索结果中以单一方式被推荐的机会。同样有趣的是,在 Google 中显示这些知识结果的 5.8% 的名称中,Natural Language API 没有返回任何 Wikipedia URL。这非常有趣,值得进一步分析。这将非常有用,特别是对于 Ahrefs 等传统全球排名跟踪工具在其数据库中没有的更深奥的主题。
如前所述,知识结果对于希望其内容在 Google 中得到推荐的网站所有者非常重要,因为它们在桌面搜索中得到了强烈突出显示。它们也更有可能(假设)与 Google Discover 的知识库主题相符,Discover 是 Android 和 iOS 的一项产品,旨在根据用户感兴趣但尚未明确搜索的主题向用户展示内容。
总结
本文介绍了 Google Natural Language API,分享了一些代码,并研究了此 API 可能对网站所有者有用的方法。主要要点是
- 学习使用 Python 和 Jupyter Notebooks 为您的数据收集任务打开了一个充满令人难以置信的 API 和开源项目(如 Pandas 和 NumPy)的世界,这些项目由非常聪明和有才华的人构建。
- Python 允许我快速提取和测试我对 API 对特定用途的价值的假设。
- 通过 Google 的分类 API 传递网站的页面可能是一个很好的检查,以确保其内容属于正确的主题类别。对竞争对手的网站执行此操作也可能为调整或创建内容提供指导。
- Google 的情感评分对于示例网站似乎不是一个有趣的指标,但对于新闻或基于观点的网站来说可能是。
- Google 发现的实体为网站整体提供了更精细的主题级别视图,并且与分类一样,在竞争性内容分析中非常有趣。
- 实体可能有助于定义您的内容可以与 Google 知识块在搜索结果或 Google Discover 结果中对齐的机会。对于更长(字数)的 消费品 实体,我们的结果集中有 5.8% 显示这些结果,对于某些网站来说,可能有机会更好地优化其页面的这些实体的显着性得分,以更好地抓住在 Google 搜索结果或 Google Discover 建议中获得此特色位置的机会。
评论已关闭。