运用python探索谷歌自然语言API

谷歌是怎么分类网站和微调来改善搜索结果的?其实我们从谷歌的开放API中,可以窥探到一些线索。

作为一名技术咖,我一直在不断的寻找一种新奇的路子,可以使用数据来理解谷歌是怎么分级网站们的。最近,我调查了是否谷歌的自然语言API能更好的告诉我们它们可能怎样分类网站内容的。

虽然有一些开源的NLP工具,我想研究谷歌的工具,假设它可能在其他产品中使用相同的技术,比如搜索。这篇文章介绍谷歌的自然语言API,探索普通的自然语言处理(NLP)任务以及可能如何使用它们来通知网站内容的创建。

理解数据类型

开始前,理解谷歌NLP API返回的数据类型很重要。

实体

实体是文字组,在现实生活中可以找到一些例子。命名实体识别是NLP中比较难的部分,因为一些工具经常需要查看整个内容才能理解词组的用处。比如,同形异义词,可能发间相同,但意思千差万别。英文单词“lead”也有金属“铅”的意思。谷歌有12个有区别的实体类型,同时也有第十三个类型来兜底剩余的部分,为“UNkown”。一些实体与维基的文章有关,表明知识图谱对数据有影响。每个实体返回一个显著性评分,这是它与提供的文本的总体相关性。

运用python探索谷歌自然语言API

情感

情感,是指对一些事情的态度和观点,存在于文档和文档中的句子和单个实体中。对于情感的打分介于-1到1之间。大小代表着情感的不正常强度;强度范围在0.0和无穷之间。

运用python探索谷歌自然语言API

语法

在一些较好的类库中,能发现语法解析包含大部分的NLP活动,类库有 lemmatization, part-of-speech tagging, 和dependency-tree parsing。NLP主要解决帮助机器理解文字和词语之间的关系。语法解析是大部分语言处理或理解任务的基础部分。

运用python探索谷歌自然语言API

目录

对给出的内容进行分类目,分出是哪个具体的行业或一个其它话题目录,目录会进行打分,在0.0到1.0之间。 这些类别似乎与其他谷歌工具(如AdWords)使用的受众和网站类别相同。

运用python探索谷歌自然语言API

拉一些数据

现在我将提取一些样本数据。我使用Google的Search Console API收集了一些搜索查询结果及其相应的网址。Google Search Console是一种工具,可报告人们使用Google搜索查找网站页面时使用。这个开源的Jupyter notebook允许你提取有关你网站的类似数据。对于此示例,我在2019年1月1日至6月1日期间生成的网站(无命名)中提取Google Search Console数据。

此数据集包含有关2,969页和7,144个查询的信息,这些查询在Google搜索结果中显示了网站的页面。下表显示绝大多数页面只收到很少的点击次数,因为此站点侧重于所谓的长尾(更具体,通常更长),而不是短尾(非常一般,更高的搜索量)搜索查询。

运用python探索谷歌自然语言API

为了减少数据集大小并仅获得性能最佳的页面,我将数据集限制为在此期间至少获得20次展示的网页。这是此精炼数据集的页面点击直方图,其中包含723页:

运用python探索谷歌自然语言API

在Python中使用Google的自然语言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提供给自然语言API。它返回情绪,实体和类别的字典,其中这些键的值都是列表。我使用Jupyter Notebook来运行此代码,因为它使用相同的内核更容易注释和重试代码。

# 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文件:

运用python探索谷歌自然语言API

将其上传到名为services.json的项目文件夹。

然后,您可以通过运行以下命令来提取任何URL的API数据:

url = “https://news.ifeng.com/c/7omapIrZobG” 

pull_googlenlp ( client , url )

如果设置正确,您应该看到此输出:

运用python探索谷歌自然语言API

玩转数据

使用这些功能可以抓取给定页面的HTML并将其传递给自然语言 API,我可以在723个URL中运行一些分析。首先,我将通过查看所有页面中返回的顶级类别的数量来查看与网站相关的类别。

分类

运用python探索谷歌自然语言API

这似乎是对这个特定网站的关键主题的相当准确的表示。查看其中一个效果最好的网页排名的单个查询,我可以比较Google相同查询结果中的其他排名网页。

  • 网址1 | 最高类别:/法律与政府/法律(0.5099999904632568)共1类。
  • 没有返回类别。
  • 网址3 | 热门分类:/互联网和电信/移动和无线(0.6100000143051147)共1类。
  • 网址4 | 热门分类:/计算机和电子/软件(0.5799999833106995)共2类。
  • 网址5 | 热门分类:/互联网和电信/移动和无线/移动应用和附加组件(0.75)共1个类别。
  • 没有返回类别。
  • 网址7 | 热门分类:/计算机/电子/软件/商业和生产力软件(0.7099999785423279)共2类。
  • 网址8 | 最高类别:/法律与政府/法律(0.8999999761581421)共3类。
  • 网址9 | 热门分类:/参考/一般参考/表格指南和模板(0.6399999856948853)共1个类别。
  • 没有返回类别。

上面括号中的数字表示Google对页面内容与该类别相关的信心。第八个结果的置信度高于同一类别的第一个结果,所以这似乎不是定义排名相关性的灵丹妙药。此外,类别太宽泛,无法用于特定的搜索主题。

通过排名位置查看平均置信度,这两个指标之间似乎没有相关性,至少对于此数据集:

运用python探索谷歌自然语言API

这两种方法都有意义地审查大规模的网站,以确保内容类别看起来合适,并且样板或销售内容不会使您的网页与您的主要专业领域相关。想想如果你是销售工业用品的,你的网页会将营销作为主要类别。似乎没有强烈的倾向,至少在页面级别,类别相关性与您的排名有关。

情绪

我不会花太多时间在情绪上。在从API返回情绪的所有页面中,它们分为两个区间:0.1和0.2,这几乎是中性情绪。根据直方图,很容易说出情绪没有提供太多价值。运行新闻或意见的网站以衡量特定网页的情绪与中位数的相关性将是一个更有趣的指标。

运用python探索谷歌自然语言API

实体

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

运用python探索谷歌自然语言API

然后我单独查看每个实体类型,并一起查看实体的显着性和页面的最佳排名位置之间是否存在任何关联。

一些实体类型在所有示例中返回零显着性,因此我从下面的图表中省略了这些结果。

运用python探索谷歌自然语言API

“消费品”实体类型的正相关系数最高,皮尔逊相关系数为0.15854,但由于排名越靠后,“人”实体的相关系数为-0.15483,结果最好。这是一个非常小的示例集,特别是对于单个实体类型,所以我不能生成太多的数据。我没有发现任何与强相关性相关的值,但是“人”实体最有意义。网站通常有关于其首席执行官和其他关键员工的页面,这些页面很可能在这些查询的搜索结果中表现良好。

继续往下看,在整体地查看站点时,基于实体名称和实体类型出现了以下主题。

运用python探索谷歌自然语言API

我模糊了一些搜索结果,这些结果似乎过于具体,无法掩盖网站的身份。从主题上看,名称信息是查看(或竞争对手的)站点主题的好方法。这样做是只基于url示例站点的排名并不是所有网站的url可能(因为只搜索控制台数据报告页面接受印象在谷歌),尤其是如果你把一个网站排名的工具,主要是url Ahrefs等,跟踪许多谷歌查询和搜索结果,结果将会是很有趣的。

实体数据中另一个有趣的部分是,标记为消费品的实体往往“看起来”像我在知识结果中看到的结果,即,谷歌的搜索结果在页面的右侧。

运用python探索谷歌自然语言API

在我们的数据集中包含三个或更多单词的消费品实体名称中,5.8%的知识结果与谷歌对实体名称的结果相同。这意味着,如果您在谷歌中搜索术语或短语,那么右边的块。由于谷歌“选择”一个示例页面来表示实体,这是一个很好的机会来确定在搜索结果中具有独特特征的机会。同样有趣的是,在谷歌中显示这些知识结果的5.8%名称中,没有一个实体具有从自然语言API返回的维基url。这非常有趣,值得进一步分析。这将非常有用,特别是对于传统的全球排名跟踪工具(如ahref)数据库中没有的,更深奥的话题。

如前所述,知识搜索结果对于想要在谷歌中突出显示其内容的站点所有者非常重要,因为它们在桌面搜索中被突出显示。假设他们也更有可能与谷歌Discover的知识库主题保持一致。谷歌Discover是一款面向Android和iOS的应用程序,它试图根据用户感兴趣但尚未明确搜索的主题而为用户显示的内容。

总结

本文讨论了谷歌的自然语言API,共享了一些代码,并研究了该API对站点所有者有用的方式。关键内容是:

  • 学习使用Python和Jupyter记事本,将您的数据收集任务,运用到一个由非常聪明和有才华的人构建的令人难以置信的api和开源项目(如panda和NumPy)的世界。
  • Python允许我快速地提取和测试我关于特定用途的API值的假设。
  • 通过谷歌的分类API传递网站页面可能是一个很好的检查,以确保其内容属于正确的主题类别。在竞争对手的网站上这样做也可以提供调整或创建内容的指导。
  • 对于示例站点,谷歌的情绪评分似乎不是一个有趣的度量标准,但对于新闻或基于观点的站点,它可能是一个有趣的度量标准。
  • 谷歌的发现实体提供了一个更细粒度的主题级别的网站整体视图,就像分类,将非常有趣的竞争内容分析使用。
  • 实体可以帮助定义您的内容与搜索结果中的谷歌知识块或谷歌发现结果对齐的机会。5.8%的结果设定时间(字数)消费品实体,显示这些结果,可能会有机会,对于一些网站,更好地为这些实体优化页面的显著成绩有更大的机会捕获这个出现在Google搜索结果中。


分享到:


相關文章: