返回介绍

5.5 IFTTT 与文章源、Google 表单和电子邮件的集成

发布于 2024-01-26 22:17:32 字数 6788 浏览 0 评论 0 收藏 0

我们使用Pocket来构建训练集,可是现在需要一个流式的文章源来运行训练后的模型。为了完成这项任务,我们将再次使用IFTT、Google表单,以及一个允许我们使用Google表单的Python库。

通过IFTTT设置新闻源和Google表单

希望此时你已经有一个IFTTT账户,如果没有请现在去申请。更多详细信息,请参阅第 3 章——构建应用程序,发现低价的机票。一旦完成此操作后,你需要设置它与文章源和Google表单的集成。

在图5-18中,首先单击Channels,搜索feed,然后单击它进行设置。

在图5-19中,你只需要单击Connect。

图5-18

图5-19

接下来,再次单击右上角的Channels。这次搜索Google Drive,如图5-20所示。

图5-20

单击Google Drive。它会带你到选择Google账户进行连接的页面。选择账户,然后单击Allow允许IFTT访问你的Google Drive账户。完成后,你应该看到图5-21的内容。

图5-21

现在,我们的频道已连接,可以设置自己的文章源了。单击My Recipes,然后单击Create a Recipe。这将让你来到这一步,如图5-22所示。

图5-22 

单击this。搜索feed,然后单击它。你会来到这一步,如图5-23所示。

图5-23

在图5-23中,单击New feed item,你应该看到图5-24的内容。

图5-24

然后,将URL添加到输入框中,并单击Create Trigger。一旦这步完成,你会回到添加that的动作,如图5-25所示。

图5-25

单击that,搜索Google Drive,然后单击其图标。一旦完成这步,你会来到这个界面,如图5-26所示。

图5-26

我们希望新闻项目能够流入Google Drive的电子表单,因此请单击Add row to spreadsheet。然后,你可以自定义电子表单,如图5-27所示。

图5-27 

我将这个电子表单命名为NewStories,并将其放在名为IFTTT的Google Drive文件夹中。单击Create Action来完成这个Recipe,很快你就会看到新闻项目不断地流入Google Drive的电子表单。注意,它只会添加新进入的新闻项目,而不会添加在创建Google工作表时就已经存在的新闻项目。我建议增加一定数量的信息源。你需要为每个源头创建单独的Recipe。最好为训练集中的网站添加信息源,例如,你使用Pocket保存的那些网站。

让新闻故事在表单中累积一两天。很快,它们就应该看起来像图5-28那样。

图5-28

幸运的是,其中包括了全文的HTML内容。这意味着我们不必再使用embed.ly为每篇文章下载其内容。我们仍然需要从Google表单中下载文章,然后处理其中的文本以删除HTML标记,但这一切都可以相当容易地完成。

为了拉取表单中的文章,我们将使用一个名为gspread的Python库。它可以通过pip安装。完成后,你需要按照指示设置oauth2。可以在http://gspread.readthedocs. org/en/latest/oauth2.html找到如何设置。完成后,你会下载一个JSON格式的凭据文件。一旦你有了这个文件,就能使用client_email键找到电子邮件地址。然后,你需要向该电子邮件共享正在接受新闻故事的NewStories电子表单。只需单击表单右上角的蓝色Share按钮,然后在其中粘贴电子邮件地址就行了。如果运行下列代码,最终你会在Gmail账户中收到未能发送的邮件,但这是预期的结果。请确保在以下的代码中换入你自己的文件路径以及文件名称。

import gspread 
from oauth2client.client import SignedJwtAssertionCredentials 
json_key = json.load(open(r'/PATH_TO_KEY/KEY.json')) 
scope = ['https://spreadsheets.google.com/feeds'] 
credentials = SignedJwtAssertionCredentials(json_key['client_email'], 
json_key['private_key'].encode(), scope) 
gc = gspread.authorize(credentials)

现在,如果一切顺利,运行应该没有错误。接下来,你可以下载新闻故事了。

ws = gc.open("NewStories") 
sh = ws.sheet1 
zd = list(zip(sh.col_values(2),sh.col_values(3), sh.col_values(4))) 
zf = pd.DataFrame(zd, columns=['title','urls','html']) 
zf.replace('', pd.np.nan, inplace=True) 
zf.dropna(inplace=True) 
zf

上述代码生成图5-29的输出。

图5-29

如此一来,我们从信息源中下载了所有的文章,并将它们放入了DataFrame对象。现在需要去掉HTML标签。可以使用之前用过的函数来获取文本。然后我们将使用tf-idf向量转换器转变它。

zf.loc[:,'text'] = zf['html'].map(get_text) zf.reset_index(drop=True, 
inplace=True) 
test_matrix = vect.transform(zf['text']) 
test_matrix

上述代码生成图5-30的输出。

图5-30

这里,我们看到向量化是成功的。现在将这个传递给模型,以获取结果。

results = pd.DataFrame(model.predict(test_matrix), 
columns = ['wanted'])

上述代码生成图5-31的输出。

图5-31

可以看到,每个故事都有一个预测的结果。让我们来查阅故事的内容,以此来评估结果的准确性。

rez = pd.merge(results,zf, left_index=True, right_index=True)
rez

上述代码生成图5-32的输出。

图5-32

图5-32中两篇文章的预测肯定是对的,因为我的兴趣不在High School Musical和Full House。

此时,我们可以通过查看结果和纠正错误来改进模型。你需要根据自己的判断来决定每个预测准确与否,这里列出我的判断和修改结果。

change_to_no = [130, 145, 148, 163, 178, 199, 219, 222, 223, 226, 235, 279, 
348, 357, 427, 440, 542, 544, 546, 568, 614, 619, 660, 668, 679, 686, 740, 
829] 
change_to_yes = [0, 9, 29, 35, 42, 71, 110, 190, 319, 335, 344, 371, 385, 
399, 408, 409, 422, 472, 520, 534, 672] 
for i in rez.iloc[change_to_yes].index: 
     rez.iloc[i]['wanted'] = 'y' 
for i in rez.iloc[change_to_no].index: 
     rez.iloc[i]['wanted'] = 'n' 
rez

上述代码生成图5-33的输出。

图5-33

看上去好像有修正了很多错误,但对于超过900篇文章的评价而言,可以说改得非常少了。通过这些更正,我们现在可以将其反馈到模型中进一步提升它。将这些结果添加到之前的训练数据中,然后重建模型。

combined = pd.concat([df[['wanted', 'text']], rez[['wanted', 
'text']]]) 
combined 

上述代码生成图5-34的输出。

图5-34

现在我们重建模型。

tvcomb = vect.fit_transform(combined['text'], combined['wanted']) 
model = clf.fit(tvcomb, combined['wanted'])

我们通过所有可用的数据重新训练了模型。随着时间的推移你将获得更多的结果,因此可以进行多次这样的操作。你添加的训练数据越多,预测的结果会越好。

我们假设此时你已经有一个训练有素的模型了,并准备开始使用它。下面看看如何部署它来建立个性化的新闻源。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文