博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python的c语言api_使用Python探索Google的自然语言API
阅读量:2525 次
发布时间:2019-05-11

本文共 10892 字,大约阅读时间需要 36 分钟。

python的c语言api

作为技术搜索引擎优化器,我一直在寻找新颖的方式使用数据,以更好地了解Google如何对网站进行排名。 我最近调查了Google的是否可以更好地告知Google如何对网站内容进行分类。

尽管有 ,但我想在Google可能在其他产品(例如Search)中使用相同技术的前提下探索Google的工具。 本文介绍了Google的自然语言API,并探讨了常见的自然语言处理(NLP)任务以及如何将其用于通知网站内容的创建。

了解数据类型

首先,了解Google自然语言API返回的数据类型非常重要。

实体

实体是可以绑定到物理世界中某些事物的文本短语。 命名实体识别(NER)是NLP的难点,因为工具通常需要查看单词周围的完整上下文才能理解其用法。 例如,同形异义字拼写相同,但是具有多种含义。 句子中的“铅”是指导致某人移动的金属(名词)(动词)还是剧本中的主要角色(也是名词)? Google有12种不同类型的实体,还有第13个综合类别,称为“未知”。 一些实体与Wikipedia文章相关,暗示了对数据的影响。 每个实体都返回一个显着性分数,这是其与所提供文本的整体相关性。

Entities

情绪

在文档和句子级别以及文档中发现的单个实体中,对情感,事物的看法或态度进行了衡量。 情绪的得分范围从-1.0(负)到1.0(正)。 大小代表情感的非标准化强度; 它的范围是0.0到无穷大。

Sentiment

句法

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

Syntax

分类目录

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

Categories

拉一些数据

。 Google Search Console是一种工具,可以报告人们使用Google Search查找网站页面所用的术语。 此可让您提取有关您网站的类似数据。 在此示例中,我将Google Search Console数据提取到2019年1月1日至6月1日之间生成的网站(我不会命名)上,并将其限制为至少获得一次点击(而不是印象)的查询。

该数据集包含有关2969页和7144条查询的信息,这些查询在Google搜索结果中显示了网站的页面。 下表显示,绝大多数页面获得的点击很少,因为该网站侧重于所谓的长尾(更具体,通常更长)而不是短尾(非常普遍,搜索量更大)搜索查询。

Histogram of clicks for all pages

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

Histogram of clicks for subset of pages

在Python中使用Google的自然语言API库

要测试该API,请创建一个利用Python中的库的小脚本。 以下代码是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笔记本来运行此代码,因为它使使用同一内核的批注和重试代码更加容易。

# 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 file

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

然后,您可以通过运行以下命令为任何URL(例如Opensource.com)提取API数据:

url      
=
"https://opensource.com/article/19/6/how-ssh-running-container"
pull_googlenlp
( client
, url
)

如果设置正确,您将看到以下输出:

Output from pulling API data

为了使入门更加容易,我创建了一个 ,您可以下载该并用于测试提取网页的实体,类别和情感。 我更喜欢使用 ,它是Jupyter Notebook的扩展,其中包括文件查看器和其他增强的用户体验功能。 如果您不熟悉这些工具,我认为是开始使用Python和Jupyter的最简单方法。 它使安装和设置Python以及公共库变得非常容易,尤其是在Windows上。

玩数据

有了这些刮取给定页面HTML并将其传递给Natural Language API的函数,我可以对723个URL进行一些分析。 首先,我将通过查看所有页面中返回的顶级类别的数量来查看与网站相关的类别。

分类目录

Categories data from example site

这似乎是该特定站点关键主题的相当准确的表示。 通过查看性能最高的页面之一进行排名的单个查询,我可以比较同一查询在Google结果中的其他排名页面。

  • 网址1 | 最高分类:/法律与政府/法律(0.5099999904632568)共1个分类。
  • 没有归类。
  • 网址3 | 最高分类:/ Internet和电信/移动和无线(0.6100000143051147),共有1个总分类。
  • 网址4 | 最高类别:/计算机与电子产品/软件(0.5799999833106995),共有2个类别。
  • 网址5 | 最高分类:/ Internet和电信/移动和无线/移动应用和附加组件(0.75),共有1个类别。
  • 没有归类。
  • 网址7 | 最高分类:/计算机与电子产品/软件/商业与生产力软件(0.7099999785423279)总共有2个类别。
  • 网址8 | 最高类别:/法律与政府/法律(0.8999999761581421),共有3个类别。
  • 网址9 | 最高分类:/ Reference / General Reference /表单指南和模板(0.6399999856948853),共有1个类别。
  • 没有归类。

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

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

Plot of average confidence by ranking position

这两种方法都可以对网站进行大规模审查,以确保内容类别看起来合适,并且样板或销售内容不会使您的页面与您的主要专业知识领域无关。 考虑一下您是否出售工业用品,但是您的页面将“ 营销”作为主要类别。 似乎没有强烈的建议,即类别相关性至少与您在页面级别上的排名无关。

情绪

我不会花很多时间在情绪上。 在所有从API返回情感的页面上,它们分为两个区域:0.1和0.2,这几乎是中立的。 根据直方图,很容易看出情绪没有太大价值。 对于新闻或舆论网站而言,测量特定页面的情绪与排名中位数之间的相关性将是一个更加有趣的指标。

Histogram of sentiment for unique pages

实体

我认为,实体是API中最有趣的部分。 这是根据显着性(或与页面的相关性)在所有页面上选择的顶级实体。 请注意,Google针对相同的条款(销售清单)推断出不同的类型,这可能是错误的。 这是由于这些术语出现在内容的不同上下文中引起的。

Top entities for example site

然后,我分别查看了每种实体类型,并一起查看了该实体的显着性与页面的最佳排名位置之间是否存在任何关联。 对于每种类型,我都将匹配按显着性排序(降序)的该类型的顶部实体的显着性(与页面的整体相关性)相匹配。

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

Correlation between salience and best ranking position

Consumer Good实体类型具有最高的正相关,与Pearson相关为0.15854,尽管由于编号较低的排名更好,所以Person实体的最佳结果具有-0.15483的相关性。 这是一个非常小的样本集,尤其是对于单个实体类型,因此我不能处理太多数据。 我没有发现任何具有强相关性的值,但是Person实体最有意义。 网站通常都有关于其首席执行官和其他主要雇员的页面,这些页面很可能在这些查询的搜索结果中表现出色。

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

Themes based on entity name and entity type

我模糊了一些看起来过于具体而无法掩盖网站身份的结果。 从主题上讲,名称信息是在您的(或竞争对手的)网站上局部查看其核心主题的一种好方法。 这样做仅基于示例网站的排名网址,而不是基于所有网站的可能网址(因为Search Console数据仅报告在Google中获得展示次数的页面上的报告),但是结果会很有趣,尤其是当您要拉动网站的主网址时使用类的工具对网址进行排名,该工具可以跟踪许多查询以及这些查询的Google结果。

实体数据中另一个有趣的部分是,标记为CONSUMER_GOOD的实体倾向于“看起来”像我在“知识结果”中看到的结果,即页面右侧的Google搜索结果。

Google search results

在我们的数据集中具有三个或三个以上单词的Consumer Good实体名称中,有5.8%的知识结果与Google对该实体名称的结果相同。 这意味着,如果您在Google中搜索术语或短语,则右侧的框(例如,上面显示Linux的Knowledge Results)将显示在搜索结果页面中。 由于Google会“挑选”代表实体的示例网页,因此这是一个很好的机会,可以识别出在搜索结果中唯一显示的机会。 同样有趣的是,在Google中显示这些知识结果的5.8%名称中,没有一个实体具有从Natural Language API返回的Wikipedia URL。 这足够有趣,可以进行其他分析。 这将是非常有用的,特别是对于像Ahrefs这样的传统全球排名跟踪工具在其数据库中没有的更深奥的话题。

如前所述,知识结果对于希望在Google中展示其内容的网站所有者而言非常重要,因为它们在桌面搜索中会被突出显示。 假设它们还很可能与Google 知识库主题保持一致,后者是针对Android和iOS的产品,可根据用户感兴趣但未明确搜索的主题为用户显示内容。

结语

本文介绍了Google的自然语言API,共享了一些代码,并研究了该API对网站所有者可能有用的方式。 关键要点是:

  • 学习使用Python和Jupyter Notebooks将使您的数据收集任务通向一个由难以置信的聪明才华组成的令人难以置信的API和开源项目(如Pandas和NumPy)的世界。
  • Python使我可以快速提取和测试关于API的价值的特定假设假设。
  • 通过Google的分类API传递网站页面可能是一个很好的检查,以确保其内容属于正确的主题类别。 在竞争对手的网站上执行此操作还可以提供有关在哪里调优或创建内容的指导。
  • 对于该示例网站,Google的情感评分似乎并不是一个有趣的指标,但对于新闻或基于意见的网站而言,它可能是一个有趣的指标。
  • Google的发现实体从整体上为网站提供了更为细化的主题级别视图,并且与分类一样,在竞争性内容分析中使用也会非常有趣。
  • 实体可以帮助定义机会,使您的内容可以与搜索结果或Google Discover结果中的Google Knowledge块对齐。 如果我们将结果的5.8%设置为更长(字数)的消费品实体,则显示这些结果,对于某些站点来说,可能有机会更好地优化这些实体的页面显着性得分,从而有更好的机会捕获此有特色的展示位置在Google搜索结果或Google发现建议中。

翻译自:

python的c语言api

转载地址:http://ipbzd.baihongyu.com/

你可能感兴趣的文章
(转)在分层架构下寻找java web漏洞
查看>>
mac下多线程实现处理
查看>>
C++ ifstream ofstream
查看>>
跟初学者学习IbatisNet第四篇
查看>>
seL4环境配置
查看>>
Git报错:insufficient permission for adding an object to repository database .git/objects
查看>>
ajax跨域,携带cookie
查看>>
BZOJ 1600: [Usaco2008 Oct]建造栅栏( dp )
查看>>
洛谷 CF937A Olympiad
查看>>
Codeforces Round #445 C. Petya and Catacombs【思维/题意】
查看>>
用MATLAB同时作多幅图
查看>>
python中map的排序以及取出map中取最大最小值
查看>>
ROR 第一章 从零到部署--第一个程序
查看>>
<form>标签
查看>>
vue去掉地址栏# 方法
查看>>
Lambda03 方法引用、类型判断、变量引用
查看>>
was集群下基于接口分布式架构和开发经验谈
查看>>
MySQL学习——MySQL数据库概述与基础
查看>>
ES索引模板
查看>>
HDU2112 HDU Today 最短路+字符串哈希
查看>>