使用SVM进行评论情感分析

import pandas as pd

from sklearn.model_selection import train_test_split

from sklearn.feature_extraction.text import TfidfVectorizer

from sklearn.svm import SVC

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

import joblib

data = pd.read_csv("IMDB Dataset.csv", delimiter=",", names=['review', 'sentiment'], skiprows=1)

X = data["review"].values

y = data["sentiment"].apply(lambda x: 0 if x == "positive" else 1).values  #

tfidf_vectorizer = TfidfVectorizer()

X = tfidf_vectorizer.fit_transform(X)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

svm_model = SVC(kernel='linear')

svm_model.fit(X_train, y_train)

joblib.dump(svm_model, 'svm_model.pkl')

joblib.dump(tfidf_vectorizer, 'tfidf_vectorizer.pkl')

y_pred = svm_model.predict(X_test)

accuracy = accuracy_score(y_test, y_pred)

precision = precision_score(y_test, y_pred)

recall = recall_score(y_test, y_pred)

f1 = f1_score(y_test, y_pred)

print("准确率:", accuracy)

print("精确率:", precision)

print("召回率:", recall)

print("F1:", f1)

这段代码实现了一个简单的文本分类任务,具体步骤如下:

  1. 导入所需的库:
    • pandas: 用于数据处理。
    • train_test_split:用于将数据集划分为训练集和测试集。
    • TfidfVectorizer:用于将文本数据转换为 TF-IDF 特征向量。
    • SVC:支持向量机分类器。
    • accuracy_score, precision_score, recall_score, f1_score:用于评估分类器性能的指标。
    • joblib:用于保存训练好的模型和向量化器。
  1. 加载数据集:
    • 通过 pd.read_csv 函数加载名为 "train.csv" CSV 文件,设定分隔符为逗号,并为数据集的列指定了一些特征名,例如 "review" "star"。同时使用 skiprows 参数跳过了第一行,可能是标题行。
  1. 数据预处理和特征工程:
    • 提取出评论内容("review" 列)作为特征 X
    • 将星级评分("star" 列)进行二元化,将大于等于 3 的评分标记为 0,表示积极的评论;将小于 3 的评分标记为 1,表示消极的评论。
    • 使用 TfidfVectorizer 将文本数据转换为 TF-IDF 特征向量,这样可以将文本数据表示为数值特征。
  1. 划分数据集:
    • 使用 train_test_split 将数据集划分为训练集(80%)和测试集(20%),以便进行模型的训练和评估。
  1. 训练模型:
    • 使用支持向量机(SVM)模型,选择线性核函数,通过调用 SVC 并传入 kernel='linear' 来创建模型。
    • 使用训练集(X_train y_train)来拟合模型。
  1. 保存模型和 TF-IDF 向量化器:
    • 使用 joblib.dump 将训练好的 SVM 模型和 TF-IDF 向量化器保存为文件,以便后续的使用。
  1. 模型评估:
    • 使用测试集数据对训练好的模型进行评估,通过预测测试集的标签并与真实标签进行比较来计算评估指标,包括准确率、精确率、召回率和 F1 值。
    • 分别计算了这些指标,并打印输出。

这段代码的主要目的是训练一个支持向量机模型来对文本评论进行情感分类,并使用 TF-IDF 向量化器将文本数据转换为特征向量,以便模型进行学习。最后,评估模型在测试集上的性能。

TF-IDFTerm Frequency-Inverse Document Frequency)是一种常用于文本特征提取的技术。它将文本数据转换为向量形式,以便机器学习模型能够理解和处理。在这个项目中,使用TF-IDF特征向量的原因如下:

  1. 反映词的重要性TF-IDF考虑了一个词在文档中的频率(TF)以及在整个语料库中的出现频率(IDF)。通过这种方式,TF-IDF可以衡量一个词对于某个文档的重要性,高频出现在文档中但同时在整个语料库中出现较少的词将被赋予更高的权重,这有助于捕捉词语的语义信息。
  2. 过滤常用词TF-IDF能够自动过滤掉一些在语料库中出现频率较高的常用词,如“is”“the”等,这些词对于区分文档的内容没有太大帮助,因此不应该对它们赋予太高的权重。
  3. 解决稀疏性:在文本数据中,每个文档可能包含的词汇是不同的,导致特征空间非常庞大且稀疏。TF-IDF可以将文档表示为一个稠密的向量,其中只有词汇表中的词被表示,从而解决了稀疏性问题,减少了特征维度。
  4. 适用于文本分类:在文本分类任务中,词汇的重要性对于确定文档的类别非常关键。TF-IDF特征向量能够有效地捕捉到文档中重要的词汇信息,因此非常适合用于文本分类任务。

综上所述,TF-IDF特征向量在这个项目中被使用,是为了将文本数据转换为数值特征,提取文本中的重要信息,并为机器学习模型提供有意义的输入,以便进行情感分类的训练和预测。

TF-IDFTerm Frequency-Inverse Document Frequency)是一种用于文本特征提取的技术,它通过考虑单词在文档中的频率以及在整个语料库中的出现频率来表示文本数据。其运行原理如下:

  1. 词频(Term FrequencyTF
    • TF 衡量了一个词在文档中的出现频率。它是指在一个文档中某个词出现的次数除以该文档的总词数。即,对于文档 D 中的词 w,其 TF 计算如下:
  1. 逆文档频率(Inverse Document FrequencyIDF
    • IDF 衡量了一个词的普遍重要性。它是指语料库中文档总数与包含该词的文档数的比值的对数的倒数。即,对于语料库中的词 w,其 IDF 计算如下:
  1. TF-IDF 计算
    • TF-IDF 是将词频(TF)和逆文档频率(IDF)相乘得到的值。它反映了一个词在文档中的重要程度,即一个词在当前文档中出现的频率高,同时在语料库中出现的频率低,就越可能是对文档有较大贡献的词。
  1. 特征向量表示
    • 将文档表示为由 TF-IDF 值构成的向量。每个文档对应一个向量,向量的维度等于语料库中的词汇量,每个维度上的值为对应词汇的 TF-IDF 值。这样,每个文档都被表示为一个稠密的数值向量,可以作为机器学习模型的输入。

通过上述步骤,TF-IDF 可以将文本数据转换为数值特征向量,同时考虑了词在文档中的频率和在整个语料库中的重要性,从而提取了文本的关键信息,为后续的机器学习任务提供了有意义的输入。

在文本分类任务中,我们需要将文本数据转换为可以被机器学习模型处理的数值形式。TF-IDF 可以实现这一目的。下面是一个例子来说明特征向量表示:

假设我们有一个包含两个文档的简单语料库:

  1. 文档1 "This is a document about machine learning."
  2. 文档2 "Machine learning is a subset of artificial intelligence."

首先,我们需要构建一个词汇表,该词汇表包含语料库中所有文档中出现的唯一单词。在这个例子中,我们的词汇表可能包含以下单词:["this", "is", "a", "document", "about", "machine", "learning", "subset", "of", "artificial", "intelligence"]

接下来,我们使用 TF-IDF 来计算每个单词在每个文档中的 TF-IDF 值。例如,假设我们计算了每个单词在每个文档中的 TF-IDF 如下所示:

单词

文档1的 TF-IDF 值

文档2的 TF-IDF 值

this

0.1

0

is

0.1

0

a

0.1

0

document

0.1

0

about

0.1

0

machine

0.1

0.15

learning

0.1

0.15

subset

0

0.1

of

0

0.1

artificial

0

0.1

intelligence

0

0.1

然后,我们将每个文档表示为一个向量,向量的维度等于词汇表中的单词数量。每个维度上的值对应于该单词在文档中的 TF-IDF 值。例如,文档1可以表示为以下向量:

[0.1,0.1,0.1,0.1,0.1,0.1,0.1,0,0,0,0][0.1,0.1,0.1,0.1,0.1,0.1,0.1,0,0,0,0]

文档2可以表示为以下向量:

[0,0,0,0,0,0.15,0.15,0.1,0.1,0.1,0.1][0,0,0,0,0,0.15,0.15,0.1,0.1,0.1,0.1]

这样,每个文档都被表示为一个稠密的数值向量,其中每个维度对应于词汇表中的一个单词,并且每个维度上的值是该单词在文档中的 TF-IDF 值。这些向量可以作为机器学习模型的输入,用于训练和预测。

在这段代码中,SVC 支持向量分类器(Support Vector Classification 的缩写。让我解释一下它的作用和原理:

作用:

SVC 是一种机器学习算法,用于二元分类问题。

它基于支持向量机(SVM)的思想,通过寻找一个最优超平面来将不同类别的样本分开。

在训练阶段,SVC 将训练数据映射到一个叫做决策空间的多维空间,并创建一个叫做决策边界的分离面,将决策空间分为两个区域。

原理:

SVC 的目标是匹配您提供的数据,返回一个“最佳匹配”的超平面,用于划分或分类您的数据。

决策边界可以是平面(3D)或直线(2D)。

正则化参数 C 控制着模型的复杂度,较小的 C 值表示计算间隔时考虑所有数据点,而较大的 C 值表示只考虑分界线附近的数据点。

支持向量是决策边界上的数据点,它们对模型的构建和预测起到关键作用。

总之,SVC 是一种强大的分类器,适用于许多不同类型的数据集。它的原理基于数学和几何概念,通过优化超平面来实现数据的分类。

你可能感兴趣的:(支持向量机,机器学习,人工智能)