使用 Python 和机器学习掌握爬虫和情感分析

news2024/12/23 9:50:16

在本教程中,我们将抓取一个网站并使用自然语言处理来分析文本数据。

最终结果将是对网站内容的情感分析。以下是我们将遵循的步骤:

  1. 项目范围
  2. 所需的库
  3. 了解网页抓取
  4. 抓取网站
  5. 文本清理和预处理
  6. 使用机器学习进行情感分析
  7. 最后结果

一、项目范围

该项目的目标是抓取网站,执行文本预处理,然后应用机器学习算法对网站内容进行情感分析。

换句话说,我们想要确定网站上的文本内容是否具有积极、消极或中性的情绪。

为了实现这一目标,我们将使用 Python 和一些库来执行网络抓取和机器学习。

2. 所需的库

该项目需要以下库:

  • requests:向网站发出 HTTP 请求
  • BeautifulSoup:解析 HTML 和 XML 文档
  • pandas:使用数据框
  • nltk:执行自然语言处理
  • scikit-learn:训练机器学习模型

您可以使用 pip 安装这些库:

pip install requests beautifulsoup4 pandas nltk scikit-learn

3. 了解网页抓取

网络抓取是从网站提取数据的过程。这可以手动完成,但对于大量数据来说并不实用。

因此,我们使用软件来自动化该过程。在 Python 中,我们使用requests 和 BeautifulSoup 等库来抓取网站。

网页抓取有两种类型:

  • 静态抓取:我们抓取具有固定内容的网站
  • 动态抓取:我们抓取内容经常更改或动态生成的网站

对于这个项目,我们将执行静态抓取。

4. 抓取网站

首先,我们需要找到一个要抓取的网站。在本教程中,我们将从BBC 新闻中抓取新闻文章。我们将删除网站的“技术”部分。

这是抓取网站的代码:

import requests
from bs4 import BeautifulSoup

url = "https://www.bbc.com/news/technology"
response = requests.get(url)

soup = BeautifulSoup(response.text, "html.parser")
articles = soup.find_all("article")

for article in articles:
    headline = article.find("h3").text.strip()
    summary = article.find("p").text.strip()
    print(headline)
    print(summary)
    print()

让我们分解一下这段代码:

  • 我们首先导入 requests 和 BeautifulSoup 库
  • 我们定义要抓取的网站的 URL
  • 我们使用requests.get()向网站发出HTTP请求并获取HTML内容
  • 我们从 HTML 内容创建一个 BeautifulSoup 对象
  • 我们使用find_all()来获取页面上的所有文章
  • 我们循环浏览每篇文章并提取标题和摘要
  • 我们打印每篇文章的标题和摘要

当我们运行这段代码时,我们应该看到控制台中打印的文章的标题和摘要。

5. 文本清理和预处理

在进行情感分析之前,我们需要清理和预处理文本数据。这涉及以下步骤:

  • 删除 HTML 标签
  • 将所有文本转换为小写
  • 删除标点符号
  • 删除停用词(常见词,如“the”、“a”、“an”等)
  • 对文本进行词干化或词形还原(将单词还原为其词根形式)

这是执行文本清理和预处理的代码:

import re
from nltk.corpus import stopwords
from nltk.stem import SnowballStemmer
from nltk.tokenize import word_tokenize

stemmer = SnowballStemmer("english")
stop_words = set(stopwords.words("english"))

def clean_text(text):
    # Remove HTML tags
    text = re.sub(r"<.*?>", "", text)
    # Convert to lowercase
    text = text.lower()
    # Remove punctuation
    text = re.sub(r"[^\w\s]", "", text)
    # Remove stopwords and stem words
    tokens = word_tokenize(text)
    tokens = [stemmer.stem(word) for word in tokens if word not in stop_words]
    # Join tokens back into a string
    text = " ".join(tokens)
    return text

让我们分解一下这段代码:

  • 我们首先导入正则表达式库 (re)、NLTK 库中的停用词语料库和 SnowballStemmer,以及 nltk.tokenize 模块中的 word_tokenize 函数。
  • 我们定义一个 SnowballStemmer 对象,并将语言设置为“english”,该对象将用于词干
  • 我们定义一组要从文本数据中删除的停用词
  • 我们定义一个名为 clean_text() 的函数,它接受文本字符串
  • 在函数内部,我们使用正则表达式来删除任何 HTML 标签
  • 我们使用 lower() 方法将文本转换为小写
  • 我们使用正则表达式删除标点符号
  • 我们使用 nltk.tokenize 模块中的 word_tokenize() 方法将文本标记为单个单词。
  • 我们使用 SnowballStemmer 对象对每个单词进行词干分析并删除停用词。
  • 最后,我们使用 join() 方法将词干词重新连接回字符串。

6. 使用机器学习进行情感分析

现在我们已经清理并预处理了文本数据,我们可以使用机器学习进行情感分析。

我们将使用scikit-learn 库来执行情感分析。

首先,我们需要将数据分为训练集和测试集。我们将使用80% 的数据进行训练,20% 的数据进行测试

这是分割数据的代码:

from sklearn.model_selection import train_test_split

# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(df["text"], df["sentiment"], test_size=0.2, random_state=42)

让我们分解一下这段代码:

  • 我们从 scikit-learn 导入 train_test_split() 函数
  • 我们使用 train_test_split() 函数将文本数据(存储在数据框的“text”列中)和情感数据(存储在数据框的“sentiment”列中)分成训练集和测试集。
  • 我们使用 test_size 为 0.2,这意味着 20% 的数据将用于测试,并使用 random_state 为 42 以实现可重复性。

接下来,我们需要将文本数据转换为可用作机器学习算法的输入的数值向量。

我们将使用TF-IDF 矢量器来执行此操作。

这是转换文本数据的代码:

from sklearn.feature_extraction.text import TfidfVectorizer

vectorizer = TfidfVectorizer(ngram_range=(1,2))
X_train_vec = vectorizer.fit_transform(X_train)
X_test_vec = vectorizer.transform(X_test)

让我们分解一下这段代码:

  • 我们从 scikit-learn 导入 TfidfVectorizer 类
  • 我们创建一个 TfidfVectorizer 对象并将 ngram_range 设置为 (1,2),这意味着我们要考虑文本数据中的一元组(单个单词)和二元组(相邻单词对)。
  • 我们使用 fit_transform() 方法在训练数据上拟合向量化器,该方法计算语料库中每个单词的 TF-IDF 分数,并将文本数据转换为数值特征的稀疏矩阵。
  • 我们使用transform()方法转换测试数据,该方法使用从训练数据中学习的词汇对测试数据应用相同的转换。

现在我们已经将文本数据转换为数字特征,我们可以训练机器学习模型来预测文本的情感。

我们将使用逻辑回归算法,这是文本分类任务的流行算法。

这是训练模型的代码:

from sklearn.linear_model import LogisticRegression

clf = LogisticRegression(max_iter=1000)
clf.fit(X_train_vec, y_train)

让我们分解一下这段代码:

  • 我们从 scikit-learn 导入 LogisticRegression 类
  • 我们创建一个 LogisticRegression 对象并将 max_iter 设置为 1000,这意味着我们允许算法运行最多 1000 次迭代来收敛。
  • 我们使用 fit() 方法在训练数据上训练模型,该方法学习可用于预测新文本数据的情绪的模型参数。

最后,我们可以通过计算准确率得分、精确率、召回率和 F1 得分来评估模型在测试数据上的性能。

这是评估模型的代码:

from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score

y_pred = clf.predict(X_test_vec)
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred, average="macro")
recall = recall_score(y_test, y_pred, average="macro")
f1 = f1_score(y_test, y_pred, average="macro")

print("Accuracy:", accuracy)
print("Precision:", precision)
print("Recall:", recall)
print("F1 score:", f1)

让我们分解一下这段代码:

  • 我们从 scikit-learn 导入 precision_score、 precision_score、recall_score 和 f1_score 函数
  • 我们使用LogisticRegression对象的predict()方法来预测测试数据的情绪
  • 我们使用 scikit-learn 中的相应函数计算模型的准确率、精确率、召回率和 F1 分数
  • 我们打印性能指标。

就是这样!我们已经使用 Python 中的机器学习成功地执行了网页抓取、文本清理、预处理和情感分析。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1012738.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Bean的管理

配置优先级 Bean管理 获取bean 默认情况下&#xff0c;Spring项目启动时&#xff0c;会把bean多创建好放在IOC容器中&#xff0c;如果想要主动获取这些bean&#xff0c;可以通过如下方式&#xff1a; bean作用域 Spring支持五种作用域&#xff0c;后三种在Web环境才生效&…

十、MySql的索引(重点)

文章目录 一、定义二、常见分类&#xff08;一&#xff09;案例 三、 认识磁盘&#xff08;一&#xff09;MySQL与存储&#xff08;二&#xff09;扇区&#xff08;三&#xff09;定位扇区&#xff08;四&#xff09;结论&#xff08;五&#xff09;磁盘随机访问(Random Access…

EasyX图形化界面

这里写目录标题 EasyX绘制简单的图形化窗口窗口坐标设置窗口属性实现基本绘图功能贴图原样贴图透明贴图认识素材 代码步骤 按键交互阻塞按键 鼠标交互 EasyX 绘制简单的图形化窗口 代码示例&#xff1a; while&#xff08;1&#xff09;&#xff1b; 可以防止闪屏 窗口坐标 …

初见QT,控件的基本应用,实现简单登录窗口

窗口实现代码 #include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {//窗口设置this->setFixedSize(538, 373); //固定窗口大小this->setWindowIcon(QIcon("G:\\QT_Icon\\windos_icon2.png"))…

JDK8特性——Stream API

文章目录 集合处理数据的弊端Steam流式思想概述Stream流的获取方式根据Collection获取通过Stream的of方法 Stream常用方法介绍forEachcountfilterlimitskipmapsorteddistinctmatchfindmax和minreducemap和reduce的组合mapToIntconcat Stream结果收集结果收集到集合结果收集到数…

[C++基础]-stack和queue

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。 目录 一、st…

setInterval倒计时切换页面后不准

背景 最近在做一个倒计时时&#xff0c;发现当切换浏览器tab后&#xff0c;再切回倒计时页面&#xff0c;倒计时的数据不准&#xff0c;比真正的剩余时间多&#xff0c;短时间还好&#xff0c;时间长了&#xff0c;计时器的误差会很大。 原因 倒计时是用setInterval每1000毫…

盘点:人工智能发展趋势下的4大常见AI算法以及应用场景

近年来&#xff0c;人工智能的发展速度十分惊人&#xff0c;在安防监控、工业制造、农业、教育、金融、医疗等领域中的应用越来越广泛&#xff0c;并且未来几年也将继续保持高速的发展趋势。通过人工智能技术提高自动化程度、减少人工干预、提高监管效率&#xff0c;已经成为当…

在QML中如何使用首字母小写(蛇形)命名法

前言 最近在学习研究QML&#xff0c;想要自定义组件、信号、属性等&#xff0c;但如何对.qml文件、变量命名却是个问题。习惯了蛇形命名规范后&#xff0c;再让我回到驼峰命名规范&#xff0c;多少是不愿意的。 为了坚守信仰&#xff0c;我翻遍了各大技术网站&#xff0c;然而…

里氏替换原则~

里氏替换原则&#xff08;Liskov Substitution Principle&#xff09;是面向对象设计中的一个基本原则&#xff0c;它是由Barbara Liskov提出的。 如果对于每一个类型为Apple的对象1&#xff0c;都有类型为fruit的对象2&#xff0c;使得以fruit定义的所有程序 P 在所有的对象1都…

Web服务器解析:从基础到高级的全面指南

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 引言 Web服务器是现代互…

竞赛选题 基于机器视觉的车道线检测

文章目录 1 前言2 先上成果3 车道线4 问题抽象(建立模型)5 帧掩码(Frame Mask)6 车道检测的图像预处理7 图像阈值化8 霍夫线变换9 实现车道检测9.1 帧掩码创建9.2 图像预处理9.2.1 图像阈值化9.2.2 霍夫线变换 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分…

el-calendar日历 简易排班

公司物流部要个简易的排班功能&#xff0c;由主管去设置线路&#xff0c;线路绑定上负责人。然后直接往日历里添加。 1、隐藏了自带的切换月份&#xff0c;改用了日期选择器。 2、禁用了非本月的点击事件&#xff0c;防止点击自动跳转到其他月份。 3、添加了点击多选&…

C# 流Stream详解(3)——FileStream源码

【FileStream】 构造函数 如果创建一个FileStream&#xff0c;常见的参数例如路径Path、操作方式FileMode、权限FileAccess。 这里说下FileShare和SafeFileHandle。 我们知道在读取文件时&#xff0c;通常会有两个诉求&#xff1a;一是如何更快的读取文件内容&#xff1b;二…

ATECLOUD二极管测试系统可以解决反向电流测试哪些痛点?

二极管具有单向导电性&#xff0c;但是有时候也会出现反向电流的情况。当反向电流变得很大时&#xff0c;二极管性能和寿命会受到很大影响。通过二极管测试系统对反向电流进行测试可以评估其性能和稳定性。 反向电流测试的重要性 理想情况下反向电流非常小&#xff0c;甚至可以…

2021年电工杯数学建模A题高铁牵引供电系统运行数据分析及等值建模求解全过程论文及程序

2021年电工杯数学建模 A题 高铁牵引供电系统运行数据分析及等值建模 原题再现&#xff1a; 我国是世界上电气化铁路运营里程最长、服役电力机车型号最多、运营最繁忙的国家。截至 2020 年底&#xff0c;我国铁路年消耗电量约 800 亿千瓦时&#xff0c;约占三峡年总发电量的 8…

Java实现添加文字水印、图片水印功能实战

java实现给图片添加水印实现步骤&#xff1a; 获取原图片对象信息&#xff08;本地图片或网络图片&#xff09; 添加水印&#xff08;设置水印颜色、字体、坐标等&#xff09; 处理输出目标图片 java实现给图片添加文字水印 获取原图片对象信息 第一步&#xff1a;获取需要…

人工智能安全-6-SQL注入检测

0 提纲 概述SQL注入方法SQL注入的检测方法SQL语句的特征提取天池AI上的实践 1 概述 SQLIA&#xff1a;SQL injection attack SQL 注入攻击是一个简单且被广泛理解的技术&#xff0c;它把 SQL 查询片段插入到 GET 或 POST 参数里提交到网络应用。 由于SQL数据库在Web应用中的…

【微服务实战之Docker容器】第四章-【微服务实战之Docker容器】第三章-镜像仓库

系列文章目录 【微服务实战之Docker容器】第一章-下载及安装 文章目录 系列文章目录坑&#xff1a;容器卷记得加入以下命令配置是个啥&#xff1f;能干啥&#xff1f;基本的命令读写规则映射添加说明卷的继承和共享 坑&#xff1a;容器卷记得加入以下命令配置 --privilegedtr…

van-calendar 实现移动端日历效果

<!--移动端端展示日历--><divv-if"isMobile &&tabActiveName true &&(formName 值班日历 || formName 值班编排)"><template v-if"Array.isArray(listData) && listData.length"><van-calendar:poppable&…