利用 Python 探究 Google 的自然語言 API
作為一名技術性的搜索引擎優化人員,我一直在尋找以新穎的方式使用數據的方法,以更好地了解 Google 如何對網站進行排名。我最近研究了 Google 的 自然語言 API 能否更好地揭示 Google 是如何分類網站內容的。
儘管有 開源 NLP 工具,但我想探索谷歌的工具,前提是它可能在其他產品中使用同樣的技術,比如搜索。本文介紹了 Google 的自然語言 API,並探究了常見的自然語言處理(NLP)任務,以及如何使用它們來為網站內容創建提供信息。
了解數據類型
首先,了解 Google 自然語言 API 返回的數據類型非常重要。
實體
實體 是可以與物理世界中的某些事物聯繫在一起的文本短語。 命名實體識別 (NER)是 NLP 的難點,因為工具通常需要查看關鍵字的完整上下文才能理解其用法。例如, 同形異義字 拼寫相同,但是具有多種含義。句子中的 「lead」 是指一種金屬:「鉛」(名詞),使某人移動:「牽領」(動詞),還可能是劇本中的主要角色(也是名詞)?Google 有 12 種不同類型的實體,還有第 13 個名為 「UNKNOWN」(未知)的統稱類別。一些實體與維基百科的文章相關,這表明 知識圖譜 對數據的影響。每個實體都會返回一個顯著性分數,即其與所提供文本的整體相關性。
![實體](/data/attachment/album/202103/24/232133yn9fxn48z9nq9wd4.png "Entities")
情感
情感 ,即對某事的看法或態度,是在文件和句子層面以及文件中發現的單個實體上進行衡量。情感的 得分 範圍從 -1.0(消極)到 1.0(積極)。 幅度 代表情感的 非歸一化 強度;它的範圍是 0.0 到無窮大。
![情感](/data/attachment/album/202103/24/232134u49cg3zk9yp2q023.png "Sentiment")
語法
語法 解析包含了大多數在較好的庫中常見的 NLP 活動,例如 詞形演變 、 詞性標記 和 依賴樹解析 。NLP 主要處理幫助機器理解文本和關鍵字之間的關係。語法解析是大多數語言處理或理解任務的基礎部分。
![語法](/data/attachment/album/202103/24/232134l5q5rjdwdszzdszj.png "Syntax")
分類
分類 是將整個給定內容分配給特定行業或主題類別,其 置信度 得分從 0.0 到 1.0。這些分類似乎與其他 Google 工具使用的受眾群體和網站類別相同,如 AdWords。
![分類](/data/attachment/album/202103/24/232134loa7cb69a8bnbapl.png "Categories")
提取數據
現在,我將提取一些示例數據進行處理。我使用 Google 的 搜索控制台 API 收集了一些搜索查詢及其相應的網址。Google 搜索控制台是一個報告人們使用 Google Search 查找網站頁面的術語的工具。這個 開源的 Jupyter 筆記本 可以讓你提取有關網站的類似數據。在此示例中,我在 2019 年 1 月 1 日至 6 月 1 日期間生成的一個網站(我沒有提及名字)上提取了 Google 搜索控制台數據,並將其限制為至少獲得一次點擊(而不只是 曝光 )的查詢。
該數據集包含 2969 個頁面和在 Google Search 的結果中顯示了該網站網頁的 7144 條查詢的信息。下表顯示,絕大多數頁面獲得的點擊很少,因為該網站側重於所謂的長尾(越特殊通常就更長尾)而不是短尾(非常籠統,搜索量更大)搜索查詢。
![所有頁面的點擊次數柱狀圖](/data/attachment/album/202103/24/232134obtqt33t7qwbqd7d.png "Histogram of clicks for all pages")
為了減少數據集的大小並僅獲得效果最好的頁面,我將數據集限制為在此期間至少獲得 20 次曝光的頁面。這是精鍊數據集的按頁點擊的柱狀圖,其中包括 723 個頁面:
![部分網頁的點擊次數柱狀圖](/data/attachment/album/202103/24/232135xtqtlen7s7ydstoo.png "Histogram of clicks for subset of pages")
在 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。返回一個包含 sentiment
、 entities
和 categories
的字典,其中這些鍵的值都是列表。我使用 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 雲主控台中創建一個項目,啟用該 API 並下載服務帳戶密鑰。之後,你應該擁有一個類似於以下內容的 JSON 文件:
![services.json 文件](/data/attachment/album/202103/24/232135eszdngayasad36cs.png "services.json file")
命名為 services.json
,並上傳到項目文件夾。
然後,你可以通過運行以下程序來提取任何 URL(例如 Opensource.com)的 API 數據:
url = "https://opensource.com/article/19/6/how-ssh-running-container"
pull_googlenlp(client,url)
如果設置正確,你將看到以下輸出:
![拉取 API 數據的輸出](/data/attachment/album/202103/24/232135i2ne05ob5fe5feje.png "Output from pulling API data")
為了使入門更加容易,我創建了一個 Jupyter 筆記本,你可以下載並使用它來測試提取網頁的實體、類別和情感。我更喜歡使用 JupyterLab,它是 Jupyter 筆記本的擴展,其中包括文件查看器和其他增強的用戶體驗功能。如果你不熟悉這些工具,我認為利用 Anaconda 是開始使用 Python 和 Jupyter 的最簡單途徑。它使安裝和設置 Python 以及常用庫變得非常容易,尤其是在 Windows 上。
處理數據
使用這些函數,可抓取給定頁面的 HTML 並將其傳遞給自然語言 API,我可以對 723 個 URL 進行一些分析。首先,我將通過查看所有頁面中返回的頂級分類的數量來查看與網站相關的分類。
分類
![來自示例站點的分類數據](/data/attachment/album/202103/24/232136g27pgut772zk27z9.png "Categories data from example site")
這似乎是該特定站點的關鍵主題的相當準確的代表。通過查看一個效果最好的頁面進行排名的單個查詢,我可以比較同一查詢在 Google 搜索結果中的其他排名頁面。
- URL 1 |頂級類別:/法律和政府/與法律相關的(0.5099999904632568)共 1 個類別。
- 未返回任何類別。
- URL 3 |頂級類別:/互聯網與電信/移動與無線(0.6100000143051147)共 1 個類別。
- URL 4 |頂級類別:/計算機與電子產品/軟體(0.5799999833106995)共有 2 個類別。
- URL 5 |頂級類別:/互聯網與電信/移動與無線/移動應用程序和附件(0.75)共有 1 個類別。
- 未返回任何類別。
- URL 7 |頂級類別:/計算機與電子/軟體/商業與生產力軟體(0.7099999785423279)共 2 個類別。
- URL 8 |頂級類別:/法律和政府/與法律相關的(0.8999999761581421)共 3 個類別。
- URL 9 |頂級類別:/參考/一般參考/類型指南和模板(0.6399999856948853)共有 1 個類別。
- 未返回任何類別。
上方括弧中的數字表示 Google 對頁面內容與該分類相關的置信度。對於相同分類,第八個結果比第一個結果具有更高的置信度,因此,這似乎不是定義排名相關性的靈丹妙藥。此外,分類太寬泛導致無法滿足特定搜索主題的需要。
通過排名查看平均置信度,這兩個指標之間似乎沒有相關性,至少對於此數據集而言如此:
![平均置信度排名分布圖](/data/attachment/album/202103/24/232136ic4s5ou4cgsycisu.png "Plot of average confidence by ranking position ")
這兩種方法對網站進行規模審查是有意義的,以確保內容類別易於理解,並且樣板或銷售內容不會使你的頁面與你的主要專業知識領域無關。想一想,如果你出售工業用品,但是你的頁面返回 「Marketing(銷售)」 作為主要分類。似乎沒有一個強烈的跡象表明,分類相關性與你的排名有什麼關係,至少在頁面級別如此。
情感
我不會在情感上花很多時間。在所有從 API 返回情感的頁面中,它們分為兩個區間:0.1 和 0.2,這幾乎是中立的情感。根據直方圖,很容易看出情感沒有太大價值。對於新聞或輿論網站而言,測量特定頁面的情感到中位數排名之間的相關性將是一個更加有趣的指標。
![獨特頁面的情感柱狀圖](/data/attachment/album/202103/24/232136wzorqo9d9ooypmo3.png "Histogram of sentiment for unique pages")
實體
在我看來,實體是 API 中最有趣的部分。這是在所有頁面中按 顯著性 (或與頁面的相關性)選擇的頂級實體。請注意,對於相同的術語(銷售清單),Google 會推斷出不同的類型,可能是錯誤的。這是由於這些術語出現在內容中的不同上下文中引起的。
![示例網站的頂級實體](/data/attachment/album/202103/24/232136d1ppkvn8vfkpdqqa.png "Top entities for example site")
然後,我分別查看了每個實體類型,並一起查看了該實體的顯著性與頁面的最佳排名位置之間是否存在任何關聯。對於每種類型,我匹配了與該類型匹配的頂級實體的顯著性(與頁面的整體相關性),按顯著性排序(降序)。
有些實體類型在所有示例中返回的顯著性為零,因此我從下面的圖表中省略了這些結果。
![顯著性與最佳排名位置的相關性](/data/attachment/album/202103/24/232137bz34u2478b6b7ctz.png "Correlation between salience and best ranking position")
「Consumer Good(消費性商品)」 實體類型具有最高的正相關性, 皮爾森相關度 為 0.15854,儘管由於較低編號的排名更好,所以 「Person」 實體的結果最好,相關度為 -0.15483。這是一個非常小的樣本集,尤其是對於單個實體類型,我不能對數據做太多的判斷。我沒有發現任何具有強相關性的值,但是 「Person」 實體最有意義。網站通常都有關於其首席執行官和其他主要僱員的頁面,這些頁面很可能在這些查詢的搜索結果方面做得好。
繼續,當從整體上看站點,根據實體名稱和實體類型,出現了以下主題。
![基於實體名稱和實體類型的主題](/data/attachment/album/202103/24/232137fpa2olp874ohavha.png "Themes based on entity name and entity type")
我模糊了幾個看起來過於具體的結果,以掩蓋網站的身份。從主題上講,名稱信息是在你(或競爭對手)的網站上局部查看其核心主題的一種好方法。這樣做僅基於示例網站的排名網址,而不是基於所有網站的可能網址(因為 Search Console 數據僅記錄 Google 中展示的頁面),但是結果會很有趣,尤其是當你使用像 Ahrefs 之類的工具提取一個網站的主要排名 URL,該工具會跟蹤許多查詢以及這些查詢的 Google 搜索結果。
實體數據中另一個有趣的部分是標記為 「CONSUMER_GOOD」 的實體傾向於 「看起來」 像我在看到 「 知識結果 」的結果,即頁面右側的 Google 搜索結果。
![Google 搜索結果](/data/attachment/album/202103/24/232137zhh0mh1d3y11dh5l.png "Google search results")
在我們的數據集中具有三個或三個以上關鍵字的 「Consumer Good(消費性商品)」 實體名稱中,有 5.8% 的知識結果與 Google 對該實體命名的結果相同。這意味著,如果你在 Google 中搜索術語或短語,則右側的框(例如,上面顯示 Linux 的知識結果)將顯示在搜索結果頁面中。由於 Google 會 「挑選」 代表實體的示例網頁,因此這是一個很好的機會,可以在搜索結果中識別出具有唯一特徵的機會。同樣有趣的是,5.8% 的在 Google 中顯示這些知識結果名稱中,沒有一個實體的維基百科 URL 從自然語言 API 中返回。這很有趣,值得進行額外的分析。這將是非常有用的,特別是對於傳統的全球排名跟蹤工具(如 Ahrefs)資料庫中沒有的更深奧的主題。
如前所述,知識結果對於那些希望自己的內容在 Google 中被收錄的網站所有者來說是非常重要的,因為它們在桌面搜索中加強高亮顯示。假設,它們也很可能與 Google Discover 的知識庫主題保持一致,這是一款適用於 Android 和 iOS 的產品,它試圖根據用戶感興趣但沒有明確搜索的主題為用戶浮現內容。
總結
本文介紹了 Google 的自然語言 API,分享了一些代碼,並研究了此 API 對網站所有者可能有用的方式。關鍵要點是:
- 學習使用 Python 和 Jupyter 筆記本可以為你的數據收集任務打開到一個由令人難以置信的聰明和有才華的人建立的不可思議的 API 和開源項目(如 Pandas 和 NumPy)的世界。
- Python 允許我為了一個特定目的快速提取和測試有關 API 值的假設。
- 通過 Google 的分類 API 傳遞網站頁面可能是一項很好的檢查,以確保其內容分解成正確的主題分類。對於競爭對手的網站執行此操作還可以提供有關在何處進行調整或創建內容的指導。
- 對於示例網站,Google 的情感評分似乎並不是一個有趣的指標,但是對於新聞或基於意見的網站,它可能是一個有趣的指標。
- Google 發現的實體從整體上提供了更細化的網站的主題級別視圖,並且像分類一樣,在競爭性內容分析中使用將非常有趣。
- 實體可以幫助定義機會,使你的內容可以與搜索結果或 Google Discover 結果中的 Google 知識塊保持一致。我們將 5.8% 的結果設置為更長的(字計數)「Consumer Goods(消費商品)」 實體,顯示這些結果,對於某些網站來說,可能有機會更好地優化這些實體的頁面顯著性分數,從而有更好的機會在 Google 搜索結果或 Google Discovers 建議中抓住這個重要作用的位置。
via: https://opensource.com/article/19/7/python-google-natural-language-api
作者:JR Oakes 選題:lujun9972 譯者:stevenzdg988 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive