当前位置:   article > 正文

python的c语言api_使用Python探索Google的自然语言API

googlenlp接口

python的c语言api

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

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

了解数据类型

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

实体

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

Entities

情绪

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

Sentiment

句法

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

Syntax

分类目录

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

Categories

拉一些数据

Search Console API 。 Google Search Console是一种工具,可以报告人们使用Google Search查找网站页面所用的术语。 此开源Jupyter笔记本可让您提取有关您网站的类似数据。 在此示例中,我将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中的google-cloud-language库的小脚本。 以下代码是Python 3.5+。

首先,激活新的虚拟环境并安装库。 将<your-env>替换为环境的唯一名称。

  1. virtualenv
  2. < your-env
  3. >
  4. source
  5. < your-env
  6. > /bin/activate
  7. pip install --upgrade google-cloud-language
  8. pip install --upgrade requests

该脚本从URL提取HTML,并将HTML馈送到自然语言API。 它返回一个感言实体类别的字典,其中这些键的值都是列表。 我使用Jupyter笔记本来运行此代码,因为它使使用同一内核的批注和重试代码更加容易。

  1. # Import needed libraries
  2. import requests
  3. import json
  4. from google.
  5. cloud
  6. import language
  7. from google.
  8. oauth2
  9. import service_account
  10. from google.
  11. cloud .
  12. language
  13. import enums
  14. from google.
  15. cloud .
  16. language
  17. import
  18. types
  19. # Build language API client (requires service account key)
  20. client
  21. = language.
  22. LanguageServiceClient .
  23. from_service_account_json
  24. (
  25. 'services.json'
  26. )
  27. # Define functions
  28. def pull_googlenlp
  29. ( client
  30. , url
  31. , invalid_types
  32. =
  33. [
  34. 'OTHER'
  35. ]
  36. , **data
  37. ) :
  38.    
  39.         html
  40. = load_text_from_url
  41. ( url
  42. , **data
  43. )
  44.    
  45.        
  46. if
  47. not html:
  48.        
  49. return
  50. None
  51.    
  52.         document
  53. =
  54. types .
  55. Document
  56. (
  57.         content
  58. = html
  59. ,
  60.        
  61. type
  62. = language.
  63. enums .
  64. Document .
  65. Type .
  66. HTML
  67. )
  68.         features
  69. =
  70. {
  71. 'extract_syntax' :
  72. True
  73. ,
  74.                
  75. 'extract_entities' :
  76. True
  77. ,
  78.                
  79. 'extract_document_sentiment' :
  80. True
  81. ,
  82.                
  83. 'extract_entity_sentiment' :
  84. True
  85. ,
  86.                
  87. 'classify_text' :
  88. False
  89.                
  90. }
  91.    
  92.         response
  93. = client.
  94. annotate_text
  95. ( document
  96. = document
  97. , features
  98. = features
  99. )
  100.         sentiment
  101. = response.
  102. document_sentiment
  103.         entities
  104. = response.
  105. entities
  106.    
  107.         response
  108. = client.
  109. classify_text
  110. ( document
  111. )
  112.         categories
  113. = response.
  114. categories
  115.          
  116.        
  117. def get_type
  118. (
  119. type
  120. ) :
  121.        
  122. return client.
  123. enums .
  124. Entity .
  125. Type
  126. ( entity.
  127. type
  128. ) .
  129. name
  130.    
  131.         result
  132. =
  133. {
  134. }
  135.    
  136.         result
  137. [
  138. 'sentiment'
  139. ]
  140. =
  141. [
  142. ]    
  143.         result
  144. [
  145. 'entities'
  146. ]
  147. =
  148. [
  149. ]
  150.         result
  151. [
  152. 'categories'
  153. ]
  154. =
  155. [
  156. ]
  157.        
  158. if sentiment:
  159.         result
  160. [
  161. 'sentiment'
  162. ]
  163. =
  164. [
  165. {
  166. 'magnitude' : sentiment.
  167. magnitude
  168. ,
  169. 'score' :sentiment.
  170. score
  171. }
  172. ]
  173.          
  174.        
  175. for entity
  176. in entities:
  177.        
  178. if get_type
  179. ( entity.
  180. type
  181. )
  182. not
  183. in invalid_types:
  184.                 result
  185. [
  186. 'entities'
  187. ] .
  188. append
  189. (
  190. {
  191. 'name' : entity.
  192. name
  193. ,
  194. 'type' : get_type
  195. ( entity.
  196. type
  197. )
  198. ,
  199. 'salience' : entity.
  200. salience
  201. ,
  202. 'wikipedia_url' : entity.
  203. metadata .
  204. get
  205. (
  206. 'wikipedia_url'
  207. ,
  208. '-'
  209. )  
  210. }
  211. )
  212.          
  213.        
  214. for category
  215. in categories:
  216.         result
  217. [
  218. 'categories'
  219. ] .
  220. append
  221. (
  222. {
  223. 'name' :category.
  224. name
  225. ,
  226. 'confidence' : category.
  227. confidence
  228. }
  229. )
  230.          
  231.          
  232.        
  233. return result
  234. def load_text_from_url
  235. ( url
  236. , **data
  237. ) :
  238.         timeout
  239. = data.
  240. get
  241. (
  242. 'timeout'
  243. ,
  244. 20
  245. )
  246.    
  247.         results
  248. =
  249. [
  250. ]
  251.    
  252.        
  253. try :
  254.          
  255.        
  256. print
  257. (
  258. "Extracting text from: {}" .
  259. format
  260. ( url
  261. )
  262. )
  263.         response
  264. = requests.
  265. get
  266. ( url
  267. , timeout
  268. = timeout
  269. )
  270.         text
  271. = response.
  272. text
  273.         status
  274. = response.
  275. status_code
  276.        
  277. if status
  278. ==
  279. 200
  280. and
  281. len
  282. ( text
  283. )
  284. >
  285. 0 :
  286.                
  287. return text
  288.          
  289.        
  290. return
  291. None
  292.          
  293.        
  294. except
  295. Exception
  296. as e:
  297.        
  298. print
  299. (
  300. 'Problem with url: {0}.' .
  301. format
  302. ( url
  303. )
  304. )
  305.        
  306. return
  307. None

要访问API,请按照Google的快速入门说明在Google Cloud Console中创建项目,启用API并下载服务帐户密钥。 之后,您应该拥有一个类似于以下内容的JSON文件:

services.json file

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

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

  1. url
  2. =
  3. "https://opensource.com/article/19/6/how-ssh-running-container"
  4. pull_googlenlp
  5. ( client
  6. , url
  7. )

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

Output from pulling API data

为了使入门更加容易,我创建了一个Jupyter笔记本 ,您可以下载该笔记本并用于测试提取网页的实体,类别和情感。 我更喜欢使用JupyterLab ,它是Jupyter Notebook的扩展,其中包括文件查看器和其他增强的用户体验功能。 如果您不熟悉这些工具,我认为Anaconda是开始使用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中获得展示次数的页面上的报告),但是结果会很有趣,尤其是当您要拉动网站的主网址时使用Ahrefs之类的工具对网址进行排名,该工具可以跟踪许多查询以及这些查询的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 Discover的知识库主题保持一致,后者是针对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发现建议中。

翻译自: https://opensource.com/article/19/7/python-google-natural-language-api

python的c语言api

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/212072
推荐阅读
相关标签
  

闽ICP备14008679号