如何自動產生高質量的標題和元描述

[ad_1]

如何自動產生高質量的標題和元描述

在這些困難時期,以更少的時間和更少的資源完成更有效的工作比以往任何時候都更加重要。

一個經常被忽略的無聊且耗時的SEO任務是大規模編寫引人注目的標題和元描述。

特別是當站點有數千或數百萬個頁面時。

當您不知道獎勵是否值得時,很難付出努力。

在本專欄中,您將學習如何使用自然語言理解和生成的最新進展來自動生成高質量的標題和元描述。

我們將從Google表格中方便地訪問這一令人興奮的生成功能。我們將學習以最少的Python和JavaScript代碼實現該功能。

如何製作質量標題&自動的元描述「 width =」 2426「 height =」 1294「 Size =」(最大寬度:2426px)100vw,2426px「 srcset =」 https://cdn.searchenginejournal.com/wp-content/uploads/2020/04 /summary-example-5e8e602a1a8b7.png 2426w,https://cdn.searchenginejournal.com/wp-content/uploads/2020/04/summary-example-5e8e602a1a8b7-480x256.png 480w,https://cdn.searchenginejournal.com /wp-content/uploads/2020/04/summary-example-5e8e602a1a8b7-680x363.png 680w,https://cdn.searchenginejournal.com/wp-content/uploads/2020/04/summary-example-5e8e602a1a8b7-768x410。 png 768w,https://cdn.searchenginejournal.com/wp-content/uploads/2020/04/summary-example-5e8e602a1a8b7-1024x546.png 1024w,https://cdn.searchenginejournal.com/wp-content/uploads/ 2020/04 / summary-example-5e8e602a1a8b7-1600x853.png 1600w「 src =」 https://cdn.searchenginejournal.com/wp-content/uploads/2020/04/summary-example-5e8e602a1a8b7.png

這是我們的技術計劃:

  • 我們將在中實施和評估幾個最新的文本匯總模型 Google Colab
  • 我們將提供Google Cloud Function中的一種模型,可以從Apps Script和Google Sheets輕鬆調用這些模型
  • 我們將直接從Google表格中抓取頁面內容,並使用我們的自定義功能對其進行匯總
  • 我們將使用RankSense將生成的標題和元描述部署為Cloudflare中的實驗
  • 我們將創建另一個Google Cloud Function來觸發Bing中的自動索引

介紹擁抱面部變壓器

擁抱臉部變形金剛 是AI研究人員和從業者中的熱門圖書館。

它為最新的自然語言研究提供了統一且易於使用的界面。

研究是否使用以下代碼進行編碼都沒關係 張量流 (Google的深度學習框架)或 火炬 (Facebook的框架)。兩者都是最廣泛採用的。

儘管轉換器庫提供了更簡單的代碼,但對於最終用戶而言,它還不夠簡單 路德維希 (我已經將路德維希 以前的深度學習文章)。

隨著引入 變壓器管道

管道使用最少的代碼封裝了許多常見的自然語言處理用例。

它們還為基礎模型的使用提供了很大的靈活性。

我們將使用轉換器管道評估幾種最新的文本匯總選項。

我們將從以下示例中借用一些代碼 這個筆記本

Facebook的BART

在宣布BART時,Facebook研究員Mike Lewis分享了他們論文中一些非常令人印象深刻的抽象總結。

現在,讓我們來看看使用變壓器管道重現其工作結果有多麼容易。

首先,讓我們將庫安裝在新的Google Colab筆記本中。

確保選擇GPU運行時。

!pip安裝變壓器

接下來,讓我們添加管道代碼。

從變壓器進口管道

#在pytorch中使用bart
bart_summarizer =管道(「摘要」)

這是我們將總結的示例文本。

TEXT_TO_SUMMARIZE =「」「
紐約(CNN)莉安娜·巴里恩托斯(Liana Barrientos)23歲時,她在紐約州威徹斯特縣結婚。
一年後,她在威徹斯特郡再次結婚,但嫁給了另一個男人,沒有與第一任丈夫離婚。
結婚後僅18天,她又被綁住了。然後,Barrientos再聲明五次「我願意」,有時彼此之間只有兩周。
2010年,她再次結婚,這次是在布朗克斯。在一份結婚證申請中,她說這是她的「第一次也是唯一的」婚姻。
現年39歲的巴里恩托斯(Barrientos)面臨兩項刑事指控:「提供一級學位的虛假文書」,指稱她對律師的虛假陳述。
根據法院文件,2010年結婚許可證申請書。
檢察官說,婚姻是移民騙局的一部分。
根據她的律師克里斯托弗·賴特(Christopher Wright)的說法,周五,她在布朗克斯州最高法院認罪,她拒絕進一步置評。
偵探說,出庭後,Barrientos因涉嫌通過緊急出口潛入紐約地鐵而被捕,並被指控盜竊服務和犯罪侵入罪。
警方發言人安妮特·馬可夫斯基(Annette Markowski)。 Barrientos總共結婚了10次,其中9次結婚發生在1999年至2002年之間。
所有這些都發生在新澤西州長島的威徹斯特縣或布朗克斯區。檢察官說,據信她仍然與四名男子結婚,一次她與八名男子結婚。
檢察官說,移民騙局涉及她的一些丈夫,這些丈夫在結婚後不久就申請了永久居留權。
只有在此類申請獲得批准後,才會發生離婚。目前尚不清楚是否有任何人將受到起訴。
該案已由移民和海關執法局和國土安全部轉交給布朗克斯地區檢察官辦公室。
調查科。其中有七人來自所謂的「紅旗」國家,包括埃及,土耳其,喬治亞,巴基斯坦和馬里。
她的第八任丈夫拉希德·拉傑普特(Rashid Rajput)在受到聯合恐怖主義特別工作組的調查後於2006年被驅逐回他的家鄉巴基斯坦。
如果被定罪,Barrientos將面臨最高四年的監禁。她的下一次演出定於5月18日。
「」

這是摘要代碼和結果摘要:

摘要= bart_summarizer(TEXT_TO_SUMMARIZE,最小長度= 50,最大長度= 250)

print(summary)#輸出: [{‘summary_text’: ‘Liana Barrientos has been married 10 times, sometimes within two weeks of each other. Prosecutors say the marriages were part of an immigration scam. She is believed to still be married to four men, and at one time, she was married to eight at once.’}]

我指定了生成的摘要不應少於50個字元,最多不超過250個字元。

這對於控制生成類型非常有用:標題或元描述。

現在,看看生成的摘要的質量,我們只鍵入了幾行Python代碼。

超酷!

莉安娜·巴里恩托斯(Liana Barrientos)已結婚10次,有時甚至是兩周之內。檢察官說,婚姻是移民騙局的一部分。據信她仍然嫁給了四個男人,一次又嫁給了八個男人。」

列印(len(摘要[0][“summary_text”]))
#輸出:249

Google的T5

最新的模型是文本到文本傳輸變壓器,即T5。

該模型的一項令人印象深刻的成就是,它的性能確實接近於人類的基線水平。 SuperGLUE排行榜

這是值得注意的,因為它在SuperGLUE中的NLP任務被設計為對人類來說很容易,但對機器來說卻很難。

Google最近發布了 摘要文章 人們對模型的所有細節都不願從 研究論文

他們的核心思想是嘗試在一個稱為C4的新的大規模培訓數據集上嘗試所有流行的NLP思想(巨大的清潔爬行語料庫)。

我知道,人工智慧研究人員喜歡為自己的發明命名帶來樂趣。

讓我們使用另一個轉換器管道來總結相同的文本,但是這次使用T5作為基礎模型。

t5_summarizer =管道(「摘要」,model =「 t5-base」,tokenizer =「 t5-base」)

摘要= t5_summarizer(TEXT_TO_SUMMARIZE,min_length = 50,max_length = 250)

這是摘要文本。

[{‘summary_text’: ‘in total, barrientos has been married 10 times, with nine of her marriages occurring between 1999 and 2002 . she is believed to still be married to four men, and at one time, she was married to eight men at once .’}]

此摘要質量也很高。

但是我決定嘗試更大的T5模型,該模型也可以作為管道使用,以查看質量是否可以提高。

t5_summarizer_larger =管道(「摘要」,模型=「 t5-large」,令牌生成器=「 t5-large」)

我一點也不失望。

真是令人印象深刻的總結!

[{‘summary_text’: ‘Liana barrientos has been married 10 times . nine of her marriages occurred between 1999 and 2002 . she is believed to still be married to four men, and at one time, she was married to eight men at once .’}]

介紹雲功能

現在,我們有了可以有效總結頁面內容的代碼,我們需要一種簡單的方法將其公開為API。

在我的 上一篇文章, 我用了 路德維希發球 為此,但是由於我們此處未使用Ludwig,因此我們將採用另一種方法: 雲功能

雲功能和等效「無伺服器技術可以說是獲取伺服器端代碼以供生產使用的最簡單方法。

它們被稱為無伺服器,因為您不需要在託管服務提供商中配置Web伺服器或虛擬機。

我們將看到,它們極大地簡化了部署體驗。

部署Hello World Cloud功能

我們無需離開Goog​​le Colab即可部署我們的第一個測試Cloud Function。

首先,登錄到您的Google Compute帳戶。

!gcloud auth登錄-無啟動瀏覽器

然後,設置一個默認項目。

!gcloud config設置項目項目名稱

接下來,我們將測試函數寫入名為main.py的文件中

%% writefile main.py
def hello_get(要求):

    「」「 HTTP雲功能。

    精氨酸:

        request(flask.Request):請求對象。

        

    返回值:

        響應文本,或可以轉換為

        使用`make_response`的響應對象

        。

    「」

    返回「 Hello World!」

我們可以使用此命令部署此功能。

!gcloud函數部署hello_get –runtime python37 –trigger-http –allow-unauthenticated

幾分鐘後,我們將獲得新API服務的詳細信息。

availableMemoryMb:256
entryPoint:hello_get
httpsTrigger:
網址:https://xxx.cloudfunctions.net/hello_get
ingressSettings:ALLOW_ALL
標籤:
部署工具:cli-gcloud
名稱:projects / xxx / locations / us-central1 / functions / hello_get
運行時:python37
serviceAccount電子郵件:xxxx
sourceUploadUrl:xxxx
狀態:ACTIVE
超時:60秒
updateTime:’2020-04-06T16:33:03.951Z’
versionId:「 8」

而已!

我們不需要設置虛擬機,Web伺服器軟體等。

我們可以通過打開提供的URL和獲取文本「 Hello World!」來對其進行測試。作為瀏覽器中的響應。

部署我們的文本摘要雲功能

從理論上講,我們應該能夠將文本摘要管道包裝到一個函數中,並遵循相同的步驟來部署API服務。

但是,我必須克服一些挑戰才能使它起作用。

首先,我們面臨的第一個也是最具挑戰性的問題是安裝變壓器庫。

幸運的是,安裝第三方軟體包很容易 基於Python的雲功能

您只需要創建 一個標準的要求.txt 像這樣的文件:

%% writefile requirements.txt

變壓器== 2.0.7

不幸的是,這失敗了,因為變壓器需要使用Pytorch或Tensorflow。它們都默認安裝在Google Colab中,但需要為Cloud Functions環境指定。

默認情況下,變形金剛使用Pytorch,當我將其添加為要求時,它引發了一個錯誤,使我意識到了這一點 堆棧溢出線程

我已將其與此更新的require.txt文件一起使用。

%% writefile requirements.txt

https://download.pytorch.org/whl/cpu/torch-1.0.1.post2-cp37-cp37m-linux_x86_64.whl
變壓器== 2.0.7

下一個挑戰是模型的巨大內存需求和雲功能的局限性。

我首先使用更簡單的管道(如NER)測試了功能,NER代表 名稱實體識別

我首先在Colab筆記本中對其進行測試。

從變壓器進口管道

nlp_token_class =無

def ner_get(請求):

  全局nlp_token_class
  #運行一次
  如果nlp_token_class為None:
    nlp_token_class =管道(’ner’)

  result = nlp_token_class(「 Hugging Face是一家總部位於紐約的法國公司。」)

  返回結果

我得到了這個故障響應。

[{‘entity’: ‘I-ORG’, ‘score’: 0.9970937967300415, ‘word’: ‘Hu’},
{‘entity’: ‘I-ORG’, ‘score’: 0.9345749020576477, ‘word’: ‘##gging’},
{‘entity’: ‘I-ORG’, ‘score’: 0.9787060022354126, ‘word’: ‘Face’},
{‘entity’: ‘I-MISC’, ‘score’: 0.9981995820999146, ‘word’: ‘French’},
{‘entity’: ‘I-LOC’, ‘score’: 0.9983047246932983, ‘word’: ‘New’},
{‘entity’: ‘I-LOC’, ‘score’: 0.8913459181785583, ‘word’: ‘-‘},
{‘entity’: ‘I-LOC’, ‘score’: 0.9979523420333862, ‘word’: ‘York’}]

然後,我只需添加%% writefile main.py即可創建可用於部署該功能的Python文件。

當我 查看日誌 要了解API調用失敗的原因,我看到了內存需求是一個大問題。

但是,幸運的是,您可以使用此命令輕鬆覆蓋默認的250M限制和執行超時。

!gcloud函數部署ner_get-內存2GiB-超時540-運行時python37 –trigger-http –allow-unauthenticated

我基本上指定了2GB的最大內存和9分鐘的執行超時,以允許模型的初始下載(可以傳輸的千兆位元組)。

我用來加快後續對同一Cloud Function的調用的一個技巧是 緩存模型 使用全局變數將其下載到內存中,並在重新創建管道之前檢查它是否存在。

經過測試BART和T5功能並確定了一個T5小型模型,該模型非常適合Cloud Functions的內存和超時要求。

這是該功能的代碼。

%% writefile main.py

從變壓器進口管道

nlp_t5 =無

def t5_get(要求):

  全局nlp_t5

  #運行一次
  如果nlp_t5為None:
    nlp_t5 =管道(「摘要」,模型=「 t5-small」,令牌生成器=「 t5-small」)

  TEXT_TO_SUMMARIZE =「」「
  紐約(CNN)莉安娜·巴里恩托斯(Liana Barrientos)23歲時,她在紐約州威徹斯特縣結婚。
  「」

  結果= nlp_t5(TEXT_TO_SUMMARIZE)

  返回結果[0][“summary_text”]

這是部署它的代碼。

gcloud函數部署t5_get-內存2GiB-超時540-運行時python37 –trigger-http –allow-unauthenticated

該功能的一個問題是要總結的文本是硬編碼的。

但是我們可以通過以下更改輕鬆解決此問題。

%% writefile main.py

從變壓器進口管道

nlp_t5 =無

def t5_post(要求):

  全局nlp_t5

  #運行一次

  如果nlp_t5為None:

    #small模型可避免出現內存問題

    nlp_t5 =管道(「摘要」,模型=「 t5-small」,令牌生成器=「 t5-small」)

  #從POST請求中獲取摘要文本

  content_type = request.headers[‘content-type’]

如果content_type ==’application / x-www-form-urlencoded’:

      文字= request.form.get(’文字’)

      結果= nlp_t5(文本)

      返回結果[0][“summary_text”]

其他:

      引發ValueError(「未知內容類型:{}」。format(content_type))

  返回「失敗」

我只是確保內容類型是 網址編碼形式,然後從表單數據中讀取參數文本。

我可以使用以下代碼在Colab中輕鬆測試此功能。

匯入要求
url =「 https://us-central1-seo-sheets.cloudfunctions.net/hello_post」
數據= {「文本」:文本[:100]}

requests.post(URL,data).text

由於一切都按預期進行,因此我可以在Google表格中進行操作。

從Google表格調用我們的文本匯總服務

我在自己的應用中介紹了Apps腳本 上一欄 它確實賦予了Google表格超強的功能。

我能夠對我創建的功能進行較小的更改,以使其可用於文本摘要。

函數getSummary(text){
  
  有效載荷=`text = $ {text}`;
  
  有效負載= encodeURI(有效載荷);
  
  console.log(payload);
  
  var url =「 https://xxx.cloudfunctions.net/t5_post」;
  
   var options = {
    「 method」:「 POST」,
    「 contentType」:「 application / x-www-form-urlencoded」,
    「有效載荷」:有效載荷,
    ‘muteHttpExceptions’:是
  };
        
  var response = UrlFetchApp.fetch(url,options);
  
  var result = response.getContentText();
  
  console.log(result);
  
  返回結果;
  
}

就這樣。

我更改了輸入變數名稱和API URL。

其餘與我需要提交帶有表單數據的POST請求相同。

我們進行測試,並檢查 控制台日誌 確保一切正常。

是的

Apps腳本的一大限制是 自定義功能的運行時間不能超過30秒

實際上,這意味著我可以總結文本(如果字元少於1200個字元),而在Colab / Python中,我測試了具有10,000個字元以上的全文。

對於更長的文本,一種更好地工作的替代方法是像我所做的那樣,從Python代碼更新Google表格。 本文

從Google表格中抓取頁面內容

以下是表格中完整工作代碼的一些示例。

如何製作質量標題&自動的元描述「 width =」 2426「 height =」 1294「 Size =」(最大寬度:2426px)100vw,2426px「 srcset =」 https://cdn.searchenginejournal.com/wp-content/uploads/2020/04 /text-scraping-5e8e60b6ed737.png 2426w,https://cdn.searchenginejournal.com/wp-content/uploads/2020/04/text-scraping-5e8e60b6ed737-480x256.png 480w,https://cdn.searchenginejournal.com /wp-content/uploads/2020/04/text-scraping-5e8e60b6ed737-680x363.png 680w,https://cdn.searchenginejournal.com/wp-content/uploads/2020/04/text-scraping-5e8e60b6ed737-768x410。 png 768w,https://cdn.searchenginejournal.com/wp-content/uploads/2020/04/text-scraping-5e8e60b6ed737-1024x546.png 1024w,https://cdn.searchenginejournal.com/wp-content/uploads/ 2020/04 / text-scraping-5e8e60b6ed737-1600x853.png 1600w「 src =」 https://cdn.searchenginejournal.com/wp-content/uploads/2020/04/text-scraping-5e8e60b6ed737.png

現在,我們已經可以匯總文本內容了,讓我們看看如何直接從公共網頁中提取文本內容。

Google表格為此功能提供了強大的功能 導入XML

我們只需要提供網址和 XPath選擇器 標識我們要提取的內容。

這是從Wikipedia頁面提取內容的代碼。

= IMPORTXML(「 https://zh.wikipedia.org/wiki/Moon_landing」,「 // div / text()」)

我使用了通用選擇器來捕獲DIV中的所有文本。

隨意使用適合您目標頁面內容的不同選擇器。

雖然我們能夠獲取頁面內容,但它可以分為多行。我們可以用另一個功能來解決這個問題 文字加入

= TEXTJOIN(「」,TRUE,IMPORTXML(「 https://en.wikipedia.org/wiki/Moon_landing」,「 // div / text()」))
在Bing中快速索引我們的新元描述和標題

那麼,我們如何知道這些新的搜索片段比手動編寫的片段表現更好,還是根本沒有元數據?

確保學習的一種方法是運行實時測試。

在這種情況下,快速索引我們的更改至關重要。

我已經介紹了Google如何做到這一點 自動化URL檢查工具

這種方法將我們限制在幾百頁。

更好的選擇是使用真棒 必應快速索引API 因為我們可以要求為10,000個URL編製索引!

多麼酷啊?

由於我們主要對衡量點擊率感興趣,因此我們的假設是,如果我們在Bing中獲得更高的點擊率,那麼Google和其他搜索引擎也可能會發生同樣的情況。

我必須同意羅傑。這是執行此操作的代碼。

api_key =「 xxx」#從此URL獲取您自己的API密鑰https://www.bing.com/webmaster/home/api

匯入要求

def Submit_to_bing(請求):

  全局api_key

  api_url = f「 https://ssl.bing.com/webmaster/api.svc/json/SubmitUrlbatch?apikey={api_key}」

  列印(api_url)

  #替換您的網站

  url_list = [
“https://www.domain.com/page1.html”, “https://www.domain.com/page2.html”]

數據= {

    「 siteUrl」:「 http://www.domain.com」,

    「 urlList」:url_list

    }

  r = request.post(api_url,json = data)

  如果r.status_code == 200:

    返回r.json()

  其他:

    返回r.status_code

如果提交成功,您應該期待此響應。

{‘d’:無}

然後,我們可以通過將另一個Cloud Function添加到我們的main.py文件中並像以前一樣使用deploy命令來創建它。

在Cloudflare中測試我們生成的代碼片段

最後,如果您的網站使用 Cloudflare CDN,您可以使用 RankSense應用 您可以在網站上推廣這些更改之前將其作為實驗進行。

只需將URL和文本摘要列複製到新的Google表格中,然後將其導入該工具即可。

如何製作質量標題&元描述自動「 width =」 1400「 height =」 721「 size =」(最大寬度:1400px)100vw,1400px「 src =」 https://cdn.searchenginejournal.com/wp-content/uploads/2020/04 /publish-scheduler__1_-5e8e5d02d0a10.gif

發布實驗時,您可以選擇安排更改時間並指定一個 網路掛鉤 網址。

Webhook URL允許應用程序和服務在自動化的工作流程中相互通信。

如何製作質量標題&元描述自動「 width =」 414「 height =」 357「 srcset =」「 src =」 https://cdn.searchenginejournal.com/wp-content/uploads/2020/04/webook-publish-5e8e5d34d91a5.jpeg

複製並粘貼Bing索引雲功能的URL。在Cloudflare中傳播更改後15分鐘,RankSense將自動調用它。

了解更多的資源

這裡是一些鏈接的鏈接,這些鏈接在本文的研究過程中非常有用。

圖片積分

作者的所有屏幕截圖,2020年4月

相關文章