查找用于自然语言处理的数据





5.00/5 (4投票s)
本文是情感分析系列的第二篇,该系列文章使用 Python 和开源的自然语言工具包。在本文中,我们将探讨 NLTK 提供的数据集,以及捕获自己的文本语料库进行分析的示例。
本情感分析系列文章的目的是使用 Python 和开源自然语言工具包 (NLTK) 构建一个库,该库可以扫描 Reddit 帖子的回复,并检测发帖者是否使用了消极、敌对或其他不友好的语言。
- 第一部分 - 使用 Python 介绍用于自然语言处理的 NLTK
- 第二部分 - 寻找用于自然语言处理的数据
- 第三部分 - 使用预训练的 VADER 模型进行 NLTK 情感分析
- 第四部分 - 使用 VADER 进行 NLTK 情感分析的优缺点
- 第五部分 - NLTK 和机器学习在情感分析中的应用
- 第六部分 - 通过数据标注改进 NLTK 情感分析
- 第七部分 - 使用云 AI 进行情感分析
要开始使用像自然语言工具包 (NLTK) 这样的库进行自然语言处理 (NLP),我们需要一些文本数据来开始探索。我们将查看 NLTK 提供的数据集,以及捕获自己的文本语料库进行分析的示例。
作为额外福利,我们还将探讨如何使用 Reddit API 捕获有趣的评论数据进行 NLP 分析。
如果您尚未安装 NLTK,请参阅使用 Python 介绍 NLTK 进行自然语言处理,了解快速入门和设置说明。
探索 NLTK 数据集
NLTK 提供的一个便利之处是它集成了丰富的语料库数据。您可以直接使用 NLTK 下载许多额外的数据集。
让我们看一个 NLTK 语料库中包含的数据集示例,nltk.corpus.movie_reviews
,看看它们是什么样子。movie_reviews
是一个包含 2,000 条来自 IMDB 的电影评论的集合,它们被标记为正面或负面评论。
如果您要使用这些评论,您将从下载 movie_reviews
语料库开始。
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”,该网站始终位居互联网访问量最大的 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(“https://.com”)。
点击创建应用后,您将能够检索应用程序的一些详细信息。
要了解更多关于 Reddit API 的信息,您可以查阅REST 文档或r/redditdev subreddit 社区。
安装 Reddit API 客户端
您可以使用一个非常适合 Python 应用程序的客户端库,名为Python Reddit API Wrapper (PRAW),而不是使用 REST 端点或直接进行 API 调用。
在终端或命令提示符中,使用 Python 的 pip 包管理器安装 Python API 客户端。
pip install praw
要初始化客户端,您需要传递 client_id
、client_secret
和 user_agent
,如 Reddit 使用条款或您的应用程序标识所建议。我喜欢将这些凭据设置为环境变量,这样它们就不会意外地包含在代码库中。您可以使用标准 Python os
库中的函数读取这些值。以下是初始化 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 检索提交
对于多年来一直在使用该网站的狂热 Reddit 用户,请原谅,但让我们介绍一些基础知识。如果您对某个产品、技术、活动或社区感兴趣,您可以找到并订阅一个讨论它的 subreddit。例如,下图所示的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 怪癖,因为它反映了网络界面的行为。如果您正在查看网站,您只会看到达到特定阈值以上的评论。您需要点击一个按钮才能加载更多评论。通过在查询评论之前取消设置限制,我们排除了这些嵌套占位符,只获取了我们情感分析所需的用户评论。
后续步骤
您已经了解了一些访问预配置的 NLP 数据集以及从 Reddit API 和 Reddit 评论构建自己的数据集的技术。
NLP 分析的下一步将在文章使用预训练的 VADER 模型进行 NLTK 情感分析中介绍。
如果您需要回顾并了解更多关于使用 NLTK 进行自然语言处理的信息,请参阅使用 Python 介绍 NLTK 进行自然语言处理。