5.1 使用 Pocket 应用程序,创建一个监督训练的集合
在我们可以创建自己对新闻稿的喜好模型之前,需要用于训练的数据。这些训练数据将被输入到我们的模型中,以教导该模型区分我们感兴趣的和不感兴趣的文章。为了构建这个语料库,我们需要标注大量与这些兴趣相关的文章。对于每篇文章,我们将其标记为“y”或“n”。这将指示该文章是否应该出现在发送给我们的每日摘要中。
为了简化这个过程,我们将使用Pocket应用程序。Pocket是一个允许你保存故事以供稍后阅读的应用程序。你只需安装浏览器扩展插件,然后当希望保存故事的时候,单击浏览器工具栏中的Pocket图标。这篇文章就被保存到了你的个人资料库。对于我们的目的而言,Pocket一个强大的功能是它还能够保存你所选择的标签。我们将使用此功能,将感兴趣的文章标记为“y”,而不感兴趣的文章标记为“n”。
5.1.1 安装Pocket的Chrome扩展程序
我们在这里使用Google Chrome,其他浏览器应该类似。对于Chrome,进入Google App Store,然后查找Extensions部分,如图5-1所示。
图5-1
单击蓝色的Add to Chrome按钮。如果你已经有一个Pocket账户了,那么请登录,如果你还没有账户,请继续注册(免费)。一旦完成,你应该可以看到浏览器右上角的Pocket图标。图标将变灰,不过一旦有你想要保存的文章,就可以单击它。文章保存之后,它就会变成红色。
如图5-2所示,在右上角可以看到灰色的图标。当图标被单击时,它变为红色,表示文章已经被保存。
图5-2
现在有趣的部分开始了!开始保存所有你看到的文章。对于有趣的那些打上“y”的标签,对于无趣的那些打上“n”的标签。这需要一点工作量。监督学习最终结果的好坏取决于你的训练集,所以你需要标记数百篇文章来获得好的效果。如果在保存某篇文章时你忘记给它打标签了,那么你可以去这个网站对其进行标记:http://www.get.pocket.com。
5.1.2 使用Pocket API来检索故事
现在你已经很勤奋地将文章都保存到了Pocket,下一步是检索它们。为了实现这一点,我们将使用Pocket API。你可以在https://getpocket.com/developer/apps/new注册一个新账户[1]。如图5-3所示,单击左上角的Create New App并填写详细信息以获取你的API密钥。请务必选择所有的权限,这样你才可以添加、更改和检索文章。
图5-3
一旦填写完毕并提交,你将收到CONSUMER KEY。你可以在左上角的My Apps下到它。看上去就如图5-4的截屏所示,不过显然你会得到一个真正的密钥。
图5-4
一旦设置完毕,你就可以进入到下一步,进行授权的设置。我们现在就开始。它要求你输入用户密钥和重定向的网址。重定向网址可以是任何链接。这里我使用自己的Twitter账户。
import requests auth_params = {'consumer_key': 'MY_CONSUMER_KEY', 'redirect_uri': 'https://www.twitter.com/acombs'} tkn = requests.post('https://getpocket.com/v3/oauth/request', data=auth_params) tkn.content
这将产生如图5-5的输出。
图5-5
该输出将包含你下一步所需的编码[2]。将以下内容放在浏览器的地址栏中。
https://getpocket.com/auth/authorize?request_token=some_long_code&redirect_uri=https%3A//www.twitter.com/acombs[3]
如果你将重定向的URL更改为你自己的网址,请务必对其进行编码。对于此有一些可用的资源。一个选择是使用Python的urllib库,另一个选择是使用免费的在线资源。
此时,你应该会看到一个授权屏幕。继续并批准授权,然后我们就可以进入下一步。
usr_params = {'consumer_key':'my_consumer_key', 'code': 'some_long_code'} usr = requests.post('https://getpocket.com/v3/oauth/authorize', data= usr_params) usr.content
这里我们将使用图5-6的输出编码[4]进入检索故事的环节。
图5-6
首先,我们检索标记为“n”的故事。
no_params = {'consumer_key':'my_consumer_key', 'access_token': 'some_super_long_code', 'tag': 'n'} no_result = requests.post('https://getpocket.com/v3/get', data=no_params) no_result.text
上述代码生成图5-7的输出。
图5-7
注意在这里,我们通过所有标记为“n”的文章获得了一个很长的JSON字符串。其中有若干个主键,不过现在我们只对URL感兴趣。我们将依据此,继续创建一个URL的列表。
no_jf = json.loads(no_result.text) no_jd = no_jf['list'] no_urls=[] for i in no_jd.values(): no_urls.append(i.get('resolved_url')) no_urls
上述代码生成图5-8的输出。
图5-8
这个列表包含所有我们不感兴趣的故事的URL。现在,让我们将它放入一个DataFrame对象并将其如此标记。
import pandas no_uf = pd.DataFrame(no_urls, columns=['urls']) no_uf = no_uf.assign(wanted = lambda x: 'n') no_uf
上述代码生成图5-9的输出。
图5-9
现在,不想要的故事已经就绪了。让我们对感兴趣的故事进行同样的处理。
ye_params = {'consumer_key': 'my_consumer_key', 'access_token': 'some_super_long_token', 'tag': 'y'} yes_result = requests.post('https://getpocket.com/v3/get', data=yes_params) yes_jf = json.loads(yes_result.text) yes_jd = yes_jf['list'] yes_urls=[] for i in yes_jd.values(): yes_urls.append(i.get('resolved_url')) yes_uf = pd.DataFrame(yes_urls, columns=['urls']) yes_uf = yes_uf.assign(wanted = lambda x: 'y') yes_uf
上述代码生成图5-10的输出。
图5-10
现在我们有两种类型的故事作为训练的数据,将它们连接到同一个DataFrame。
df = pd.concat([yes_uf, no_uf]) df.dropna(inplace=1) df
上述代码生成图5-11的输出。
图5-11
现在,我们已经将所有的网址和相应的标签都放入同一个数据框中,接下来要下载每篇文章的HTML内容。我们将使用另一个称为embed.ly的免费服务。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论