自然语言处理需要源数据来处理。我们将查看一些示例,然后下载一些相关数据集以用于教程练习。
本系列情感分析的目标是使用 Python 和开源自然语言工具包 (NLTK) 构建一个库,用于扫描对 Reddit 帖子的回复并检测发帖者是否使用负面、敌对或其他不友好的语言。
要开始使用自然语言工具包 (NLTK) 之类的库进行自然语言处理 (NLP),我们需要一些文本数据来开始探索。我们将查看 NLTK 提供的数据集,以及捕获您自己的文本语料库进行分析的示例。
作为奖励,我们还将探索如何使用 Reddit API 来捕获有趣的评论数据以进行 NLP 分析。
如果您尚未安装 NLTK,请参阅使用 Python 进行自然语言处理的 NLTK 简介以获取快速入门和设置说明。
探索 NLTK 数据集
NLTK 带来的一个便利是与工具包集成的丰富的数据语料库。您可以使用 NLTK 直接下载许多其他数据集。
让我们看一个包含在 NLTK 语料库中的数据集的示例,nltk.corpus.movie_reviews
看看它们的样子。movie_reviews
是来自 IMDB 的 2,000 条电影评论的集合,这些评论被标记为正面或负面评论。
如果您要使用这些评论,您首先要下载movie_reviews
语料库。Python复制代码
import nltk nltk.download('movie_reviews') from nltk.corpus import movie_reviews
它会因您的操作系统和安装设置而异,但如果您检查nltk.data.path
,您可以确定语料库在文件系统上的安装位置并探索数据本身。它只是包含最初在评论中写的单词的文本文件的集合。
~/nltk_data/corpora/movie_reviews ├── README ├── neg │ ├── cv000_29416.txt │ ├── cv001_19502.txt │ ... │ ├── cv997_5152.txt │ ├── cv998_15691.txt │ └── cv999_14636.txt └── pos ├── cv000_29590.txt ├── cv001_18431.txt ├── cv002_15918.txt ├── ...
此标记数据集可用于机器学习应用程序。正面或负面评论中最常用的词可用于监督训练,以便您可以基于从该分析构建的模型探索新数据集。我们将在第二部分回到这个想法。NLTK 网站上有数据集,例如亚马逊产品评论、Twitter 社交媒体帖子等。
如果您想使用 NLTK 语料库中的数据集以外的数据集怎么办?
NLTK 不附带 Reddit 语料库,所以让我们用它作为如何自己组装一些 NLP 数据的示例。
从 Reddit 收集 NLP 数据
假设我们想要执行 NLP 情绪分析。我们需要一个包含用户或客户之间公共对话文本的数据集。
NLTK 没有用于此类分析的现有数据集,因此我们需要为自己收集类似的数据。在本练习中,我们将使用来自 Reddit 讨论的公开数据
为什么是 Reddit?
Reddit,如果你不熟悉的话,它是一个用户生成的内容聚合器,包含来自一个非常大的不同兴趣社区的文章、照片、视频和基于文本的帖子。该网站拥有超过 4 亿用户和 138,000 个活跃的兴趣区域,称为“subreddits”,因此该网站一直位居 Internet 上访问量最大的 10 个网站之列也就不足为奇了。
它也是人们就技术、工艺、新产品、书籍和许多其他话题讨论和提问的地方。它在许多营销人员追捧的 18-35 岁人群中特别受欢迎。
不管你的业务是做什么的,Reddit 上的某个人很有可能有兴趣讨论它,你可以了解一些关于你的粉丝和批评者的信息。
数据通过 Reddit API 向公众开放,因此我们需要做一些设置来访问 API。
Reddit API 入门
要开始使用 Reddit API,您需要完成几个步骤。
- 创建一个帐户
- 注册 Reddit API 访问
- 创建一个 Reddit 应用程序
创建帐户应该很简单。转到https://reddit.com并单击“注册”,如果您已经有帐户,请登录。
接下来,注册 Reddit API 访问权限。您可以在此处找到有关如何访问的详细信息:https ://www.reddit.com/wiki/api 。
出于生产目的,请务必通读这些使用条款并接受 API 访问。
注册后,您将登陆一个用于创建 Reddit 应用程序的 URL:https ://www.reddit.com/prefs/apps/ 。
您可以选择任何适合您需要的值,但至少需要输入名称(我使用的是“情感分析”)、类型(“脚本”)和重定向 url(“http://localhost. com”)。

单击create app后,您将能够检索应用程序的一些详细信息。
要了解有关 Reddit API 的更多信息,您可以查看REST 文档或r/redditdev subreddit 社区。
安装 Reddit API 客户端
您可以利用一个非常适合 Python 应用程序的客户端库,而不是使用 REST 端点或直接进行 API 调用,称为Python Reddit API Wrapper (PRAW)。
在终端或命令提示符下使用 Python pip 包管理器安装 Python API 客户端:
pip install praw
要初始化客户端,您需要按照 Reddit 使用条款的建议传递您的client_id
、client_secret
和 auser_agent
或标识您的应用程序。我喜欢将这些凭据设置为环境变量,这样它们就不会意外地包含在代码库中。os
您可以使用标准 Python库中的函数读取这些值。os
这是初始化和praw
客户端库的示例:
import os import praw reddit = praw.Reddit( client_id = os.environ['REDDIT_CLIENT_ID'], client_secret = os.environ['REDDIT_CLIENT_SECRET'], user_agent = "script:sentiment-analysis:v0.0.1 (by {})".format(os.environ['REDDIT_USERNAME']) )
初始化 Reddit API 后,我们将研究一些有用的方法来获取用于情绪分析的数据。
从 Subreddit 检索提交
向多年来一直使用该网站的狂热 Redditor 道歉,但让我们介绍一些基本知识。如果您有感兴趣的产品、技术、活动或社区,您可以找到并订阅讨论它的子版块。例如,下图的r/learnpython subreddit 允许用户发布其他用户可以投票(向上或向下)的提交(讨论主题),并发布他们自己关于该主题的评论或问题。

有几种方法可以根据您的喜好对这些帖子进行排序或排序:
- 新 – 提交的最新帖子。
- 顶部 – 在 reddit 投票系统中获得最多支持的帖子。
- 上升 – 最近点赞和评论增加的帖子。
- 热门 – 最近获得好评/评论的帖子。
- 有争议的 – 帖子和评论获得赞成票和反对票。
这些中的每一个在 Reddit API 中都有对应的方法。这里有一些例子:
# Query for a subreddit by name sub = reddit.subreddit('learnpython') # Can query for top posts for a time period, the top 20 posts, or the # 10 most controversial posts of the past month top_posts_of_the_day = sub.top('day') hot_posts = sub.hot(limit=20) controversial_posts = sub.controversial('month', limit=10) # Can also search for use of a keyword nltk_posts = sub.search(‘nltk’) # Sample of some of the more interesting data about a # submission that could make for interesting analysis for submission in controversial_posts: print("TITLE: {}".format(submission.title)) print("AUTHOR: {}".format(submission.author)) print("CREATED: {}".format(submission.created)) print("COMMENTS: {}".format(submission.num_comments)) print("UPS: {}".format(submission.ups)) print("DOWNS: {}".format(submission.downs)) print("URL: {}".format(submission.url))
Reddit 上的每个提交都有一个 URL。因此,无论我们是使用搜索、按日期或受欢迎程度过滤,还是仅使用直接链接,我们都可以开始查看提交内容以获取用户评论。
如何获得对帖子的评论
当“Redditor”(注册 Reddit 用户)对帖子发表评论时,其他用户可以回复。如果我们想了解我们的受众如何回应提及我们的产品、服务或内容的帖子,我们需要的主要数据是用户生成的评论,以便我们可以对它们进行情绪分析。
如果您知道某个有趣的特定帖子的 URL,则可以直接从该链接检索提交,而不是查询 subreddit:
post = "https://www.reddit.com/r/learnpython/comments/fwhcas/whats_the_difference_between_and_is_not" # Instead of getting submissions by querying a subreddit, this time # we go directly to a url for the post. submission = reddit.submission(url=post) submission.comments.replace_more(limit=None) # We can get the comments which the API returns as a generator, but # we can turn it into a list. comments = submission.comments.list():
的使用replace_more
是一个 API 怪癖,因为它反映了 Web 界面的行为。如果您正在查看该网站,您只会看到高于特定阈值的评论。您需要单击一个按钮来加载更多评论。通过在查询评论之前取消限制,我们排除了那些嵌套的占位符,只获取我们情绪分析所需的用户评论。
下一步
您已经了解了一些用于访问 NLP 的预配置数据集以及从 Reddit API 和 Reddit 评论构建您自己的数据集的技术。
NLP 分析的下一步将在文章Using Pre-trained VADER Models for NLTK Sentiment Analysis中介绍。
如果您需要备份并了解有关使用 NLTK 进行自然语言处理的更多信息,请参阅使用 Python 进行自然语言处理的 NLTK 简介。