在本教程中,我们将抓取一个网站并使用自然语言处理来分析文本数据。
最终结果将是对网站内容的情感分析。以下是我们将遵循的步骤:
该项目的目标是抓取网站,执行文本预处理,然后应用机器学习算法对网站内容进行情感分析。
换句话说,我们想要确定网站上的文本内容是否具有积极、消极或中性的情绪。
为了实现这一目标,我们将使用 Python 和一些库来执行网络抓取和机器学习。
该项目需要以下库:
您可以使用 pip 安装这些库:
pip install requests beautifulsoup4 pandas nltk scikit-learn
网络抓取是从网站提取数据的过程。这可以手动完成,但对于大量数据来说并不实用。
因此,我们使用软件来自动化该过程。在 Python 中,我们使用requests 和 BeautifulSoup 等库来抓取网站。
网页抓取有两种类型:
对于这个项目,我们将执行静态抓取。
首先,我们需要找到一个要抓取的网站。在本教程中,我们将从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()
让我们分解一下这段代码:
当我们运行这段代码时,我们应该看到控制台中打印的文章的标题和摘要。
在进行情感分析之前,我们需要清理和预处理文本数据。这涉及以下步骤:
这是执行文本清理和预处理的代码:
- 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
让我们分解一下这段代码:
现在我们已经清理并预处理了文本数据,我们可以使用机器学习进行情感分析。
我们将使用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)
让我们分解一下这段代码:
接下来,我们需要将文本数据转换为可用作机器学习算法的输入的数值向量。
我们将使用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)
让我们分解一下这段代码:
现在我们已经将文本数据转换为数字特征,我们可以训练机器学习模型来预测文本的情感。
我们将使用逻辑回归算法,这是文本分类任务的流行算法。
这是训练模型的代码:
- from sklearn.linear_model import LogisticRegression
-
- clf = LogisticRegression(max_iter=1000)
- clf.fit(X_train_vec, y_train)
让我们分解一下这段代码:
最后,我们可以通过计算准确率得分、精确率、召回率和 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)
让我们分解一下这段代码:
就是这样!我们已经使用 Python 中的机器学习成功地执行了网页抓取、文本清理、预处理和情感分析。