NLP 與 Google Cloud 自然語言 API
已發表: 2022-03-11自然語言處理(NLP)是機器學習和語言學的結合,已經成為人工智能領域研究最多的學科之一。 在過去的幾年裡,已經達到了許多新的里程碑,最新的是 OpenAI 的 GPT-2 模型,它能夠從簡短的輸入中生成關於任何主題的現實和連貫的文章。
這種興趣是由近年來推向市場的許多商業應用驅動的。 我們與使用 NLP 轉錄音頻數據並理解我們的問題和命令的家庭助理交談。 越來越多的公司將很大一部分客戶溝通工作轉移到自動化聊天機器人上。 在線市場使用它來識別虛假評論,媒體公司依靠 NLP 撰寫新聞文章,招聘公司將簡歷與職位匹配,社交媒體巨頭自動過濾仇恨內容,法律公司使用 NLP 分析合同。
過去,為此類任務訓練和部署機器學習模型一直是一個複雜的過程,需要專家團隊和昂貴的基礎設施。 但對此類應用程序的高需求推動了大型供應商開發與 NLP 相關的服務,從而大大降低了工作量和基礎設施成本。 雲服務的平均成本多年來一直在下降,預計這一趨勢將持續下去。
我將在本文中介紹的產品是 Google Cloud Services 的一部分,被稱為“Google Natural Language API”和“Google AutoML Natural Language”。
谷歌自然語言 API
Google Natural Language API 是一組功能強大的 NLP 模型的易於使用的接口,這些模型已由 Google 預先訓練以執行各種任務。 由於這些模型已經在非常大的文檔語料庫上進行了訓練,因此只要它們用於不使用非常特殊語言的數據集,它們的性能通常會非常好。
通過 API 使用這些預訓練模型的最大優勢是不需要訓練數據集。 API 允許用戶立即開始進行預測,這在標記數據很少可用的情況下非常有價值。
自然語言 API 包含五種不同的服務:
- 語法分析
- 情緒分析
- 實體分析
- 實體情緒分析
- 文本分類
語法分析
對於給定的文本,Google 的語法分析將返回所有單詞的細分,並為每個標記提供一組豐富的語言信息。 信息可以分為兩部分:
詞性:這部分包含有關每個標記的形態的信息。 對於每個單詞,都會返回一個細粒度的分析,其中包含其類型(名詞、動詞等)、性別、語法大小寫、時態、語法情緒、語法聲音等等。
例如,對於輸入句子“一台計算機曾經在國際象棋上打敗了我,但在跆拳道上卻比不上我”。 (Emo Philips) 詞性分析是:
一種 | 標籤: DET |
'計算機' | 標籤:名詞編號:單數 |
'一次' | 標籤: ADV |
'打' | 標籤:動詞情緒:指示時態:過去 |
'我' | 標籤:PRON 案例:賓語編號:單人:FIRST |
在 | 標籤: ADP |
'棋' | 標籤:名詞編號:單數 |
',' | 標籤: PUNCT |
'但' | 標籤: CONJ |
'它' | 標籤:PRON 案例:主格 性別:NEUTER 編號:SINGULAR 人:THIRD |
'曾是' | 標籤:動詞情緒:指示數:單人:第三時態:過去 |
'不' | 標籤: DET |
'匹配' | 標籤:名詞編號:單數 |
'為了' | 標籤: ADP |
'踢' | 標籤:名詞編號:單數 |
'拳擊' | 標籤:名詞編號:單數 |
'。' | 標籤: PUNCT |
依賴樹:返回的第二部分稱為依賴樹,它描述了每個句子的句法結構。 下面的肯尼迪名言圖表顯示了這樣的依賴樹。 對於每個單詞,箭頭表示它修改了哪些單詞。
常用的 Python 庫 nltk 和 spaCy 包含類似的功能。 所有三個選項的分析質量始終很高,但 Google Natural Language API 更易於使用。 上面的分析可以用很少的代碼行來獲得(參見下面的例子)。 然而,雖然 spaCy 和 nltk 是開源的,因此是免費的,但在一定數量的免費請求之後,使用 Google Natural Language API 需要付費(請參閱費用部分)。
除英語外,句法分析還支持十種其他語言:中文(簡體)、中文(繁體)、法語、德語、意大利語、日語、韓語、葡萄牙語、俄語和西班牙語。
情緒分析
語法分析服務主要用於在管道的早期創建特徵,然後將這些特徵輸入到機器學習模型中。 相反,情緒分析服務可以開箱即用。
Google 的情緒分析將在提供的文本中提供普遍的情緒意見。 API 返回兩個值:“分數”描述文本的情感傾向,從 -1(負面)到 +1(正面),0 表示中性。
“大小”衡量情緒的強度。
讓我們看一些例子:
輸入句子 | 情緒結果 | 解釋 |
去倫敦的火車四點出發 | 得分:0.0 幅度:0.0 | 完全中性的陳述,完全不包含任何情緒。 |
這篇博文不錯。 | 分數:0.7 量級:0.7 | 一種積極的情緒,但表達得不是很強烈。 |
這篇博文不錯。 這很有幫助。 作者很了不起。 | 得分:0.7 量級:2.3 | 相同的情緒,但表達得更強烈。 |
這篇博文非常好。 這個作者通常是一個糟糕的作家,但在這裡他很幸運。 | 得分:0.0 幅度:1.6 | 幅度向我們表明,本文中表達了情緒,但情緒表明它們是混合的,沒有明確的正面或負面。 |
谷歌的情緒分析模型是在一個非常大的數據集上訓練的。 不幸的是,沒有關於其詳細結構的信息。 我對它的真實性能很好奇,所以我在大型電影評論數據集的一部分上對其進行了測試,該數據集由斯坦福大學的科學家於 2011 年創建。
我從測試集中隨機選擇了 500 條正面和 500 條負面電影評論,並將預測的情緒與實際評論標籤進行了比較。 混淆矩陣如下所示:
積極情緒 | 負面情緒 | |
好評 | 470 | 30 |
差評 | 29 | 471 |
如表所示,該模型在大約 94% 的情況下對好電影和壞電影評論都是正確的。 對於沒有對給定問題進行任何微調的開箱即用解決方案,這並不是一個糟糕的性能。
注意:情感分析可用於與語法分析相同的語言,但俄語除外。
實體分析
實體分析是從給定文本中檢測已知實體(如公眾人物或地標)的過程。 實體檢測對於各種分類和主題建模任務非常有幫助。
Google Natural Language API 提供有關每個檢測到的實體的一些基本信息,甚至提供指向相應 Wikipedia 文章(如果存在)的鏈接。 此外,計算顯著性分數。 實體的此分數提供了有關該實體對整個文檔文本的重要性或中心性的信息。 接近 0 的分數不太顯著,而接近 1.0 的分數非常顯著。
當我們使用這個例句向 API 發送請求時: “Robert DeNiro 在 2011 年 12 月的聖誕節前夕在好萊塢與 Martin Scorsese 進行了交談。” 我們收到以下結果:
檢測到的實體 | 附加信息 |
羅伯特·德尼羅 | 類型:人物顯著性:0.5869118 wikipedia_url:https://en.wikipedia.org/wiki/Robert_De_Niro |
好萊塢 | 類型:位置顯著性:0.17918482 wikipedia_url:https://en.wikipedia.org/wiki/Hollywood |
馬丁斯科塞斯 | 類型:位置顯著性:0.17712952 wikipedia_url:https://en.wikipedia.org/wiki/Martin_Scorsese |
平安夜 | 類型:人物顯著性:0.056773853 wikipedia_url:https://en.wikipedia.org/wiki/Christmas |
2011 年 12 月 | 類型:日期年份:2011 月份:12 顯著性:0.0 wikipedia_url:- |
2011 | 類型:NUMBER 顯著性:0.0 wikipedia_url:- |
如您所見,所有實體都被正確識別和分類,除了 2011 出現了兩次。 除了示例輸出中的字段之外,實體分析 API 還將檢測組織、藝術品、消費品、電話號碼、地址和價格。
實體情緒分析
如果有用於實體檢測和情感分析的模型,自然會更進一步,將它們結合起來檢測文本中對不同實體的普遍情感。
情感分析 API 查找文檔中的所有情感顯示並聚合它們,而實體情感分析嘗試查找文檔的不同部分與已識別實體之間的依賴關係,然後將這些文本段中的情感歸因於相應的實體。
例如自以為是的文字: “作者是一個可怕的作家。 另一方面,讀者非常聰明。” 導致結果:
實體 | 情緒 |
作者 | 顯著性:0.8773350715637207 情緒:幅度:1.899999976158142 得分:-0.8999999761581421 |
讀者 | 顯著性:0.08653714507818222 情緒:幅度:0.8999999761581421 得分:0.8999999761581421 |
到目前為止,實體情緒分析僅適用於英語、日語和西班牙語。
文本分類
最後,Google 自然語言 API 帶有一個即插即用的文本分類模型。
該模型經過訓練,可以將輸入文檔分類為一大組類別。 類別是結構化的層次結構,例如“愛好與休閒”類別有幾個子類別,其中之一是“愛好與休閒/戶外” ,它本身俱有“愛好與休閒/戶外/釣魚”等子類別。

這是尼康相機廣告中的示例文字:
“D3500 的大型 24.2 MP DX 格式傳感器可以捕捉到細節豐富的照片和全高清電影——即使在光線不足的情況下也能拍攝。 結合尼克爾鏡頭的渲染能力,您可以開始創作具有平滑背景模糊的藝術肖像。 輕鬆。”
Google API 返回結果:
類別 | 信心 |
藝術與娛樂/視覺藝術與設計/攝影與數字藝術 | 0.95 |
愛好與休閒 | 0.94 |
計算機與電子產品/消費類電子產品/相機與攝影設備 | 0.85 |
所有這三個類別都是有意義的,即使我們直觀地將第三個條目排名高於第二個條目。 但是,必須考慮到這個輸入段只是完整相機廣告文檔的一小部分,並且分類模型的性能隨著文本長度的增加而提高。
經過大量的文檔嘗試後,我發現分類模型的結果在大多數情況下都是有意義的。 儘管如此,與來自 Google Natural Language API 的所有其他模型一樣,分類器作為黑盒解決方案提供,API 用戶無法修改甚至微調。 特別是在文本分類的情況下,絕大多數公司都會有自己的文本類別,不同於谷歌模型的類別,因此,自然語言 API 文本分類服務可能不適用於大多數用戶。
分類模型的另一個限制是它只適用於英語文本。
如何使用自然語言 API
Google 自然語言 API 的主要優勢在於其易用性。 不需要機器學習技能,幾乎不需要編碼技能。 在 Google Cloud 網站上,您可以找到用於調用多種語言的 API 的代碼片段。
例如,調用情感分析 API 的 Python 代碼如下:
from google.cloud import language_v1 from google.cloud.language_v1 import enums import six def sample_analyze_sentiment(content): client = language_v1.LanguageServiceClient() if isinstance(content, six.binary_type): content = content.decode('utf-8') type_ = enums.Document.Type.PLAIN_TEXT document = {'type': type_, 'content': content} response = client.analyze_sentiment(document) sentiment = response.document_sentiment print('Score: {}'.format(sentiment.score)) print('Magnitude: {}'.format(sentiment.magnitude))
其他 API 功能以類似的方式調用,只需將client.analyze_sentiment
更改為適當的函數即可。
谷歌自然語言 API 的總成本
Google 按請求向其用戶收取自然語言 API 的所有服務的費用。 這樣做的好處是任何部署服務器都沒有固定成本。 缺點是它對於非常大的數據集可能會變得昂貴。
此表顯示價格(每 1,000 個請求)取決於每月請求的數量:
如果文檔的字符數超過 1,000 個,則將其計為多次請求。 例如,如果您要分析 10,000 個文檔(每個文檔有 1,500 個字符)的情緒,您需要支付 20,000 個請求的費用。 由於前 5,000 個是免費的,因此總成本將達到 15 美元。 分析一百萬份相同大小的文檔將花費 1,995 美元。
方便,但不靈活
Google Natural Language API 是一個非常方便的快速、開箱即用解決方案的選項。 需要很少的技術知識,也不需要了解底層的機器學習模型。
主要缺點是其不靈活和無法訪問模型。 模型無法針對特定任務或數據集進行調整。
在現實環境中,大多數任務可能需要比標準化自然語言 API 函數提供的更量身定制的解決方案。
對於這種場景,Google AutoML Natural Language 更適合。
谷歌 AutoML 自然語言
如果 Natural Language API 對於您的業務目的不夠靈活,那麼 AutoML Natural Language 可能是正確的服務。 AutoML 是一種新的谷歌云服務(仍處於測試階段),使用戶能夠創建定制的機器學習模型。 與 Natural Language API 相比,AutoML 模型將根據用戶數據進行訓練,因此適合特定任務。
當自然語言 API 中可用的預定義類別過於通用或不適用於您的特定用例或知識領域時,用於對內容進行分類的自定義機器學習模型非常有用。
AutoML 服務需要用戶付出更多努力,主要是因為您必須提供數據集來訓練模型。 但是,模型的訓練和評估是完全自動化的,不需要機器學習知識。 使用 Google Cloud 控制台,無需編寫任何代碼即可完成整個過程。 當然,如果您想自動執行這些步驟,則支持所有常見的編程語言。
Google AutoML 自然語言可以做什麼?
AutoML 服務涵蓋三個用例。 所有這些用例目前僅支持英語。
1. AutoML 文本分類
雖然 Natural Language API 的文本分類器是預訓練的,因此具有一組固定的文本類別,但 AutoML 文本分類使用您在訓練數據集中提供的類別構建定制的機器學習模型。
2. AutoML 情感分析
正如我們所見,Natural Language API 的情感分析在電影評論等一般用例中效果很好。 因為情感模型是在非常通用的語料庫上訓練的,所以對於使用大量特定領域語言的文檔,性能可能會下降。 在這些情況下,AutoML 情感分析允許您訓練針對您的域定制的情感模型。
3. AutoML 實體提取
在許多業務環境中,存在自然語言 API 無法識別的特定領域實體(法律合同、醫療文檔)。 如果您有標記實體的數據集,則可以使用 AutoML 訓練自定義模型實體提取器。 如果數據集足夠大,經過訓練的實體提取模型也將能夠檢測到以前看不見的實體。
如何使用 AutoML 自然語言
使用三個 AutoML 是一個四步過程,並且對於所有三種方法都非常相似:
數據集準備
數據集必須採用特定格式(CSV 或 JSON),並且需要存儲在存儲桶中。 對於分類和情感模型,數據集僅包含兩列,文本和標籤。 對於實體提取模型,數據集需要文本以及文本中所有實體的位置。模型訓練
模型訓練是完全自動的。 如果沒有另外給出說明,那麼 AutoML 會自動將訓練集拆分為訓練集、測試集和驗證集。 這種分割也可以由用戶決定,但這是影響模型訓練的唯一方法。 其餘的培訓以黑盒方式完全自動化。評估
訓練完成後,AutoML 將顯示精度和召回分數以及混淆矩陣。 不幸的是,完全沒有關於模型本身的信息,因此很難確定模型性能不佳的原因。預言
一旦您對模型的性能感到滿意,只需單擊幾下即可方便地部署模型。 部署過程只需幾分鐘。
AutoML 模型性能
訓練過程相當緩慢,可能是因為底層模型非常大。 我訓練了一個包含 15,000 個樣本和 10 個類別的小型測試分類任務,訓練耗時數小時。 一個具有更大數據集的真實示例花了我幾天時間。
雖然谷歌沒有公佈所用模型的任何細節,但我猜測谷歌的 BERT 模型用於對每項任務進行小幅調整。 微調像 BERT 這樣的大型模型是一個計算成本很高的過程,尤其是在執行大量交叉驗證時。
我在一個真實示例中針對我自己開發的基於 BERT 的模型測試了 AutoML 分類模型。 令人驚訝的是,當使用相同的數據進行訓練時,AutoML 模型的表現明顯比我自己的模型差。 AutoML 達到了 84% 的準確率,而我的模型達到了 89%。
這意味著雖然使用 AutoML 可能非常方便,但對於性能關鍵任務來說,花時間自己開發模型是有意義的。
AutoML 定價
每 1,000 條文本記錄 5 美元的預測 AutoML 定價比自然語言 API 貴得多。 此外,對於模型訓練,AutoML 每小時收費 3 美元。 雖然這在開始時可以忽略不計,但對於需要頻繁再培訓的用例,這可能會增加很多,尤其是因為培訓似乎很慢。
讓我們使用與自然語言 API 相同的示例:
您想分析 10,000 個文檔的情緒,每個文檔有 1,500 個字符,因此您需要支付 20,000 個請求的費用。 假設訓練模型需要 20 個小時,花費 48 美元。 預測不會花費您任何費用,因為前 30,000 個請求是免費的。 對於像這樣的小型數據集,AutoML 非常經濟。
但是,如果您的數據集更大,並且您需要預測一百萬個相同大小的情緒,則將花費 9,850 美元,這相當昂貴。 對於像這樣的大型數據集,開發自己的模型而不使用 AutoML 自行部署是有意義的。
Google 自然語言 API 與 AutoML 自然語言
Google AutoML 自然語言比自然語言 API 更強大,因為它允許用戶訓練為其特定數據集和域定制的模型。
它易於使用,不需要機器學習知識。 兩個缺點是更高的成本和提供高質量數據集的必要性,該數據集需要訓練表現良好的模型。
AutoML beta 目前僅支持三個 NLP 任務(分類、情感分析、實體提取)並且僅支持英語文檔。 當這項服務完全發佈時,我希望隨著時間的推移會添加其他語言和 NLP 任務。