为自然语言处理寻找数据

本文是使用 Python 和开源自然语言工具包的情感分析系列的第二篇文章。在本文中,我们将研究 NLTK 提供的数据集,以及捕获您自己的文本语料库进行分析的示例。

自然语言处理需要源数据来处理。我们将查看一些示例,然后下载一些相关数据集以用于教程练习。

本系列情感分析的目标是使用 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,您需要完成几个步骤。

  1. 创建一个帐户
  2. 注册 Reddit API 访问
  3. 创建一个 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_idclient_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 简介。

发表评论

邮箱地址不会被公开。 必填项已用*标注