運用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搜索結果中。


分享到:


相關文章: