[ad_1]
在这些困难时期,以更少的时间和更少的资源完成更有效的工作比以往任何时候都更加重要。
一个经常被忽略的无聊且耗时的SEO任务是大规模编写引人注目的标题和元描述。
特别是当站点有数千或数百万个页面时。
当您不知道奖励是否值得时,很难付出努力。
在本专栏中,您将学习如何使用自然语言理解和生成的最新进展来自动生成高质量的标题和元描述。
我们将从Google表格中方便地访问这一令人兴奋的生成功能。我们将学习以最少的Python和JavaScript代码实现该功能。
这是我们的技术计划:
- 我们将在中实施和评估几个最新的文本汇总模型 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分享了他们论文中一些非常令人印象深刻的抽象总结。
我发现摘要性能出奇地好– BART确实能够将整个文档中的信息与背景知识相结合,以生成高度抽象的摘要。以下是一些典型示例: pic.twitter.com/EENDPgTqrl
-Mike Lewis(@ml_perception) 十月31,2019
现在,让我们来看看使用变压器管道重现其工作结果有多么容易。
首先,让我们将库安装在新的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排行榜。
Google的T5(文本到文本传输转换器)语言模型创造了新记录,并且在SuperGLUE基准测试中与人类非常接近。https://t.co/kBOqWxFmEK
纸: https://t.co/mI6BqAgj0e
码: https://t.co/01qZWrxbqS pic.twitter.com/8SRJmoiaw6-董(@yoquankara) 十月25,2019
这是值得注意的,因为它在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功能
我们无需离开Google 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表格中抓取页面内容
以下是表格中完整工作代码的一些示例。
现在,我们已经可以汇总文本内容了,让我们看看如何直接从公共网页中提取文本内容。
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和其他搜索引擎也可能会发生同样的情况。
值得考虑的一项服务是允许发布者获得在Bing中立即建立索引的URL,并实际上在几分钟之内就开始排名的服务。这就像免费的钱,为什么有人不接受呢?@sejournal @bing @BingWMC https://t.co/a5HkIpbxHI
-罗杰·蒙蒂(@martinibuster) 2020年3月20日
我必须同意罗杰。这是执行此操作的代码。
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表格中,然后将其导入该工具即可。
发布实验时,您可以选择安排更改时间并指定一个 网络挂钩 网址。
Webhook URL允许应用程序和服务在自动化的工作流程中相互通信。
复制并粘贴Bing索引云功能的URL。在Cloudflare中传播更改后15分钟,RankSense将自动调用它。
了解更多的资源
这里是一些链接的链接,这些链接在本文的研究过程中非常有用。
- 拥抱面部变形金刚教程
- 汇总管道
- Google Cloud Functions快速入门
- 使用Cloud Functions服务模型
- 必应提交API
- Bing提交API教程
- RankSense Webhook API
图片积分
作者的所有屏幕截图,2020年4月