利用 Python 探究 Google 的自然語言 API
Google API 可以凸顯出有關(guān) Google 如何對網(wǎng)站進(jìn)行分類的線索,以及如何調(diào)整內(nèi)容以改進(jìn)搜索結(jié)果的方法。
作為一名技術(shù)性的搜索引擎優(yōu)化人員,我一直在尋找以新穎的方式使用數(shù)據(jù)的方法,以更好地了解 Google 如何對網(wǎng)站進(jìn)行排名。我最近研究了 Google 的 自然語言 API 能否更好地揭示 Google 是如何分類網(wǎng)站內(nèi)容的。
盡管有 開源 NLP 工具,但我想探索谷歌的工具,前提是它可能在其他產(chǎn)品中使用同樣的技術(shù),比如搜索。本文介紹了 Google 的自然語言 API,并探究了常見的自然語言處理(NLP)任務(wù),以及如何使用它們來為網(wǎng)站內(nèi)容創(chuàng)建提供信息。
了解數(shù)據(jù)類型
首先,了解 Google 自然語言 API 返回的數(shù)據(jù)類型非常重要。
實(shí)體
實(shí)體是可以與物理世界中的某些事物聯(lián)系在一起的文本短語。命名實(shí)體識(shí)別(NER)是 NLP 的難點(diǎn),因?yàn)楣ぞ咄ǔP枰榭搓P(guān)鍵字的完整上下文才能理解其用法。例如,同形異義字拼寫相同,但是具有多種含義。句子中的 “lead” 是指一種金屬:“鉛”(名詞),使某人移動(dòng):“牽領(lǐng)”(動(dòng)詞),還可能是劇本中的主要角色(也是名詞)?Google 有 12 種不同類型的實(shí)體,還有第 13 個(gè)名為 “UNKNOWN”(未知)的統(tǒng)稱類別。一些實(shí)體與維基百科的文章相關(guān),這表明 知識(shí)圖譜 對數(shù)據(jù)的影響。每個(gè)實(shí)體都會(huì)返回一個(gè)顯著性分?jǐn)?shù),即其與所提供文本的整體相關(guān)性。
實(shí)體
情感
情感,即對某事的看法或態(tài)度,是在文件和句子層面以及文件中發(fā)現(xiàn)的單個(gè)實(shí)體上進(jìn)行衡量。情感的得分范圍從 -1.0(消極)到 1.0(積極)。幅度代表情感的非歸一化強(qiáng)度;它的范圍是 0.0 到無窮大。
情感
語法
語法解析包含了大多數(shù)在較好的庫中常見的 NLP 活動(dòng),例如 詞形演變、詞性標(biāo)記 和 依賴樹解析。NLP 主要處理幫助機(jī)器理解文本和關(guān)鍵字之間的關(guān)系。語法解析是大多數(shù)語言處理或理解任務(wù)的基礎(chǔ)部分。
語法
分類
分類是將整個(gè)給定內(nèi)容分配給特定行業(yè)或主題類別,其置信度得分從 0.0 到 1.0。這些分類似乎與其他 Google 工具使用的受眾群體和網(wǎng)站類別相同,如 AdWords。
分類
提取數(shù)據(jù)
現(xiàn)在,我將提取一些示例數(shù)據(jù)進(jìn)行處理。我使用 Google 的 搜索控制臺(tái) API 收集了一些搜索查詢及其相應(yīng)的網(wǎng)址。Google 搜索控制臺(tái)是一個(gè)報(bào)告人們使用 Google Search 查找網(wǎng)站頁面的術(shù)語的工具。這個(gè) 開源的 Jupyter 筆記本 可以讓你提取有關(guān)網(wǎng)站的類似數(shù)據(jù)。在此示例中,我在 2019 年 1 月 1 日至 6 月 1 日期間生成的一個(gè)網(wǎng)站(我沒有提及名字)上提取了 Google 搜索控制臺(tái)數(shù)據(jù),并將其限制為至少獲得一次點(diǎn)擊(而不只是曝光)的查詢。
該數(shù)據(jù)集包含 2969 個(gè)頁面和在 Google Search 的結(jié)果中顯示了該網(wǎng)站網(wǎng)頁的 7144 條查詢的信息。下表顯示,絕大多數(shù)頁面獲得的點(diǎn)擊很少,因?yàn)樵摼W(wǎng)站側(cè)重于所謂的長尾(越特殊通常就更長尾)而不是短尾(非?;\統(tǒng),搜索量更大)搜索查詢。
所有頁面的點(diǎn)擊次數(shù)柱狀圖
為了減少數(shù)據(jù)集的大小并僅獲得效果最好的頁面,我將數(shù)據(jù)集限制為在此期間至少獲得 20 次曝光的頁面。這是精煉數(shù)據(jù)集的按頁點(diǎn)擊的柱狀圖,其中包括 723 個(gè)頁面:
部分網(wǎng)頁的點(diǎn)擊次數(shù)柱狀圖
在 Python 中使用 Google 自然語言 API 庫
要測試 API,在 Python 中創(chuàng)建一個(gè)利用 google-cloud-language 庫的小腳本。以下代碼基于 Python 3.5+。
首先,激活一個(gè)新的虛擬環(huán)境并安裝庫。用環(huán)境的唯一名稱替換 <your-env>
。
virtualenv <your-env>
source <your-env>/bin/activate
pip install --upgrade google-cloud-language
pip install --upgrade requests
該腳本從 URL 提取 HTML,并將 HTML 提供給自然語言 API。返回一個(gè)包含 sentiment
、 entities
和 categories
的字典,其中這些鍵的值都是列表。我使用 Jupyter 筆記本運(yùn)行此代碼,因?yàn)槭褂猛粌?nèi)核注釋和重試代碼更加容易。
# 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 云主控臺(tái)中創(chuàng)建一個(gè)項(xiàng)目,啟用該 API 并下載服務(wù)帳戶密鑰。之后,你應(yīng)該擁有一個(gè)類似于以下內(nèi)容的 JSON 文件:
services.json 文件
命名為 services.json
,并上傳到項(xiàng)目文件夾。
然后,你可以通過運(yùn)行以下程序來提取任何 URL(例如 Opensource.com)的 API 數(shù)據(jù):
url = "https://opensource.com/article/19/6/how-ssh-running-container"
pull_googlenlp(client,url)
如果設(shè)置正確,你將看到以下輸出:
拉取 API 數(shù)據(jù)的輸出
為了使入門更加容易,我創(chuàng)建了一個(gè) Jupyter 筆記本,你可以下載并使用它來測試提取網(wǎng)頁的實(shí)體、類別和情感。我更喜歡使用 JupyterLab,它是 Jupyter 筆記本的擴(kuò)展,其中包括文件查看器和其他增強(qiáng)的用戶體驗(yàn)功能。如果你不熟悉這些工具,我認(rèn)為利用 Anaconda 是開始使用 Python 和 Jupyter 的最簡單途徑。它使安裝和設(shè)置 Python 以及常用庫變得非常容易,尤其是在 Windows 上。
處理數(shù)據(jù)
使用這些函數(shù),可抓取給定頁面的 HTML 并將其傳遞給自然語言 API,我可以對 723 個(gè) URL 進(jìn)行一些分析。首先,我將通過查看所有頁面中返回的頂級(jí)分類的數(shù)量來查看與網(wǎng)站相關(guān)的分類。
分類
來自示例站點(diǎn)的分類數(shù)據(jù)
這似乎是該特定站點(diǎn)的關(guān)鍵主題的相當(dāng)準(zhǔn)確的代表。通過查看一個(gè)效果最好的頁面進(jìn)行排名的單個(gè)查詢,我可以比較同一查詢在 Google 搜索結(jié)果中的其他排名頁面。
- URL 1 |頂級(jí)類別:/法律和政府/與法律相關(guān)的(0.5099999904632568)共 1 個(gè)類別。
- 未返回任何類別。
- URL 3 |頂級(jí)類別:/互聯(lián)網(wǎng)與電信/移動(dòng)與無線(0.6100000143051147)共 1 個(gè)類別。
- URL 4 |頂級(jí)類別:/計(jì)算機(jī)與電子產(chǎn)品/軟件(0.5799999833106995)共有 2 個(gè)類別。
- URL 5 |頂級(jí)類別:/互聯(lián)網(wǎng)與電信/移動(dòng)與無線/移動(dòng)應(yīng)用程序和附件(0.75)共有 1 個(gè)類別。
- 未返回任何類別。
- URL 7 |頂級(jí)類別:/計(jì)算機(jī)與電子/軟件/商業(yè)與生產(chǎn)力軟件(0.7099999785423279)共 2 個(gè)類別。
- URL 8 |頂級(jí)類別:/法律和政府/與法律相關(guān)的(0.8999999761581421)共 3 個(gè)類別。
- URL 9 |頂級(jí)類別:/參考/一般參考/類型指南和模板(0.6399999856948853)共有 1 個(gè)類別。
- 未返回任何類別。
上方括號(hào)中的數(shù)字表示 Google 對頁面內(nèi)容與該分類相關(guān)的置信度。對于相同分類,第八個(gè)結(jié)果比第一個(gè)結(jié)果具有更高的置信度,因此,這似乎不是定義排名相關(guān)性的靈丹妙藥。此外,分類太寬泛導(dǎo)致無法滿足特定搜索主題的需要。
通過排名查看平均置信度,這兩個(gè)指標(biāo)之間似乎沒有相關(guān)性,至少對于此數(shù)據(jù)集而言如此:
平均置信度排名分布圖
這兩種方法對網(wǎng)站進(jìn)行規(guī)模審查是有意義的,以確保內(nèi)容類別易于理解,并且樣板或銷售內(nèi)容不會(huì)使你的頁面與你的主要專業(yè)知識(shí)領(lǐng)域無關(guān)。想一想,如果你出售工業(yè)用品,但是你的頁面返回 “Marketing(銷售)” 作為主要分類。似乎沒有一個(gè)強(qiáng)烈的跡象表明,分類相關(guān)性與你的排名有什么關(guān)系,至少在頁面級(jí)別如此。
情感
我不會(huì)在情感上花很多時(shí)間。在所有從 API 返回情感的頁面中,它們分為兩個(gè)區(qū)間:0.1 和 0.2,這幾乎是中立的情感。根據(jù)直方圖,很容易看出情感沒有太大價(jià)值。對于新聞或輿論網(wǎng)站而言,測量特定頁面的情感到中位數(shù)排名之間的相關(guān)性將是一個(gè)更加有趣的指標(biāo)。
獨(dú)特頁面的情感柱狀圖
實(shí)體
在我看來,實(shí)體是 API 中最有趣的部分。這是在所有頁面中按顯著性(或與頁面的相關(guān)性)選擇的頂級(jí)實(shí)體。請注意,對于相同的術(shù)語(銷售清單),Google 會(huì)推斷出不同的類型,可能是錯(cuò)誤的。這是由于這些術(shù)語出現(xiàn)在內(nèi)容中的不同上下文中引起的。
示例網(wǎng)站的頂級(jí)實(shí)體
然后,我分別查看了每個(gè)實(shí)體類型,并一起查看了該實(shí)體的顯著性與頁面的最佳排名位置之間是否存在任何關(guān)聯(lián)。對于每種類型,我匹配了與該類型匹配的頂級(jí)實(shí)體的顯著性(與頁面的整體相關(guān)性),按顯著性排序(降序)。
有些實(shí)體類型在所有示例中返回的顯著性為零,因此我從下面的圖表中省略了這些結(jié)果。
顯著性與最佳排名位置的相關(guān)性
“Consumer Good(消費(fèi)性商品)” 實(shí)體類型具有最高的正相關(guān)性,皮爾森相關(guān)度為 0.15854,盡管由于較低編號(hào)的排名更好,所以 “Person” 實(shí)體的結(jié)果最好,相關(guān)度為 -0.15483。這是一個(gè)非常小的樣本集,尤其是對于單個(gè)實(shí)體類型,我不能對數(shù)據(jù)做太多的判斷。我沒有發(fā)現(xiàn)任何具有強(qiáng)相關(guān)性的值,但是 “Person” 實(shí)體最有意義。網(wǎng)站通常都有關(guān)于其首席執(zhí)行官和其他主要雇員的頁面,這些頁面很可能在這些查詢的搜索結(jié)果方面做得好。
繼續(xù),當(dāng)從整體上看站點(diǎn),根據(jù)實(shí)體名稱和實(shí)體類型,出現(xiàn)了以下主題。
基于實(shí)體名稱和實(shí)體類型的主題
我模糊了幾個(gè)看起來過于具體的結(jié)果,以掩蓋網(wǎng)站的身份。從主題上講,名稱信息是在你(或競爭對手)的網(wǎng)站上局部查看其核心主題的一種好方法。這樣做僅基于示例網(wǎng)站的排名網(wǎng)址,而不是基于所有網(wǎng)站的可能網(wǎng)址(因?yàn)? Search Console 數(shù)據(jù)僅記錄 Google 中展示的頁面),但是結(jié)果會(huì)很有趣,尤其是當(dāng)你使用像 Ahrefs 之類的工具提取一個(gè)網(wǎng)站的主要排名 URL,該工具會(huì)跟蹤許多查詢以及這些查詢的 Google 搜索結(jié)果。
實(shí)體數(shù)據(jù)中另一個(gè)有趣的部分是標(biāo)記為 “CONSUMER_GOOD” 的實(shí)體傾向于 “看起來” 像我在看到 “知識(shí)結(jié)果”的結(jié)果,即頁面右側(cè)的 Google 搜索結(jié)果。
Google 搜索結(jié)果
在我們的數(shù)據(jù)集中具有三個(gè)或三個(gè)以上關(guān)鍵字的 “Consumer Good(消費(fèi)性商品)” 實(shí)體名稱中,有 5.8% 的知識(shí)結(jié)果與 Google 對該實(shí)體命名的結(jié)果相同。這意味著,如果你在 Google 中搜索術(shù)語或短語,則右側(cè)的框(例如,上面顯示 Linux 的知識(shí)結(jié)果)將顯示在搜索結(jié)果頁面中。由于 Google 會(huì) “挑選” 代表實(shí)體的示例網(wǎng)頁,因此這是一個(gè)很好的機(jī)會(huì),可以在搜索結(jié)果中識(shí)別出具有唯一特征的機(jī)會(huì)。同樣有趣的是,5.8% 的在 Google 中顯示這些知識(shí)結(jié)果名稱中,沒有一個(gè)實(shí)體的維基百科 URL 從自然語言 API 中返回。這很有趣,值得進(jìn)行額外的分析。這將是非常有用的,特別是對于傳統(tǒng)的全球排名跟蹤工具(如 Ahrefs)數(shù)據(jù)庫中沒有的更深?yuàn)W的主題。
如前所述,知識(shí)結(jié)果對于那些希望自己的內(nèi)容在 Google 中被收錄的網(wǎng)站所有者來說是非常重要的,因?yàn)樗鼈冊谧烂嫠阉髦屑訌?qiáng)高亮顯示。假設(shè),它們也很可能與 Google Discover 的知識(shí)庫主題保持一致,這是一款適用于 Android 和 iOS 的產(chǎn)品,它試圖根據(jù)用戶感興趣但沒有明確搜索的主題為用戶浮現(xiàn)內(nèi)容。
總結(jié)
本文介紹了 Google 的自然語言 API,分享了一些代碼,并研究了此 API 對網(wǎng)站所有者可能有用的方式。關(guān)鍵要點(diǎn)是:
- 學(xué)習(xí)使用 Python 和 Jupyter 筆記本可以為你的數(shù)據(jù)收集任務(wù)打開到一個(gè)由令人難以置信的聰明和有才華的人建立的不可思議的 API 和開源項(xiàng)目(如 Pandas 和 NumPy)的世界。
- Python 允許我為了一個(gè)特定目的快速提取和測試有關(guān) API 值的假設(shè)。
- 通過 Google 的分類 API 傳遞網(wǎng)站頁面可能是一項(xiàng)很好的檢查,以確保其內(nèi)容分解成正確的主題分類。對于競爭對手的網(wǎng)站執(zhí)行此操作還可以提供有關(guān)在何處進(jìn)行調(diào)整或創(chuàng)建內(nèi)容的指導(dǎo)。
- 對于示例網(wǎng)站,Google 的情感評(píng)分似乎并不是一個(gè)有趣的指標(biāo),但是對于新聞或基于意見的網(wǎng)站,它可能是一個(gè)有趣的指標(biāo)。
- Google 發(fā)現(xiàn)的實(shí)體從整體上提供了更細(xì)化的網(wǎng)站的主題級(jí)別視圖,并且像分類一樣,在競爭性內(nèi)容分析中使用將非常有趣。
- 實(shí)體可以幫助定義機(jī)會(huì),使你的內(nèi)容可以與搜索結(jié)果或 Google Discover 結(jié)果中的 Google 知識(shí)塊保持一致。我們將 5.8% 的結(jié)果設(shè)置為更長的(字計(jì)數(shù))“Consumer Goods(消費(fèi)商品)” 實(shí)體,顯示這些結(jié)果,對于某些網(wǎng)站來說,可能有機(jī)會(huì)更好地優(yōu)化這些實(shí)體的頁面顯著性分?jǐn)?shù),從而有更好的機(jī)會(huì)在 Google 搜索結(jié)果或 Google Discovers 建議中抓住這個(gè)重要作用的位置。