自学内容网 自学内容网

NLP_情感分类_机器学习(w2v)方案


项目背景

项目的目的,是为了对情感评论数据集进行预测打标。在训练之前,需要对数据进行数据清洗环节,前面已对数据进行清洗,详情可移步至NLP_情感分类_数据清洗

下面对已清洗的数据集,用机器学习方案(w2v)进行处理

数据清洗

导包

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from tqdm import tqdm
import pickle
import numpy as np
import gc
#import swifter
from sklearn.neural_network import MLPClassifier
import os
from sklearn.metrics import accuracy_score,f1_score,recall_score,precision_score
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import MultinomialNB
from sklearn.tree import DecisionTreeClassifier
from lightgbm import LGBMClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn import svm

导入数据

df = pd.read_csv('data/sentiment_analysis_clean.csv')
df = df.dropna()

切分评论及标签

X_tfidf = df['text']
y_tfidf = df['label']

Word2Vec

可参考:NLP_词的向量表示Word2Vec 和 Embedding

Word2Vec是一个用于生成词向量(word vectors)的模型,它由谷歌在2013年开发。Word2Vec模型通过神经网络将词语转换为数值向量,这些向量捕捉了词语的语义信息,使得语义上相似的词在向量空间中的距离也相近。

Word2Vec主要有两种训练模型:

  1. CBOW(Continuous Bag of Words):这是一个预测单词的工具,给定一个单词前后文的单词,预测当前单词。CBOW模型不考虑单词在句子中的顺序。

  2. Skip-Gram:与CBOW相反,Skip-Gram模型给定一个单词,预测它前后文的单词。Skip-Gram通常比CBOW能更好地捕捉词语之间的关系,但是计算量更大。

Word2Vec模型的训练包括以下步骤:

  1. 初始化:随机初始化词向量和上下文向量。

  2. 训练:通过大量文本数据训练模型,使用梯度下降等优化算法不断更新词向量,以减少预测单词的误差。

  3. 优化:通过不断迭代,优化词向量,使得语义相似的词在向量空间中更接近。

训练完成后,Word2Vec可以用于各种自然语言处理任务,如词义消歧、句子相似度计算、机器翻译等。词向量可以作为输入特征,用于训练其他深度学习模型。

Word2Vec的词向量可以捕捉到一些语义规律,例如:

  • 国王 - 男人 + 女人 = 女王
  • 巴黎 - 法国 + 英国 = 伦敦

这些规律表明Word2Vec能够理解和表达词语之间的相对关系。

Word2Vec模型的优点包括:

  • 能够捕捉词语的语义信息。
  • 生成的词向量可以用于多种下游任务。
  • 模型相对简单,训练效率高。

缺点包括:

  • 无法捕捉词语的语法信息。
  • 无法处理一词多义的情况。
  • 需要大量的文本数据进行训练。

Word2Vec是词嵌入(word embedding)领域的一个重要里程碑,它启发了后续许多其他词嵌入模型的发展,如GloVe(Global Vectors for Word Representation)和FastText。

Word2Vec模型在训练时有多个参数可以设置,以下是一些常见的参数及其意义:

  1. vector_size (或 size):这是生成的词向量的维度。较小的维度可能无法捕捉足够的细节,而较大的维度可能会增加计算成本并且导致过拟合。常见的维度设置有100、200、300等。

  2. window (或 windowSize):上下文窗口的大小,即在当前单词的前后考虑多少个单词。较大的窗口可以捕捉更远的依赖关系,但也可能包含更多噪声。

  3. min_count:忽略出现次数低于此值的单词。这可以用来过滤掉一些出现频率非常低的单词,以提高训练效率。

  4. negative (或 negativeSize):在训练中使用负采样的词汇数量。负采样是一种优化技术,用于提高模型的训练效率。

  5. iter (或 epochs):训练数据集的迭代次数。较大的迭代次数可以提高模型的性能,但也需要更多的计算资源。

  6. batch_size:每次模型更新时处理的单词数量。较大的批量大小可以提高内存的使用效率,但也可能影响模型的收敛速度。

  7. alpha:学习率。较高的学习率可以加快训练速度,但可能导致模型无法收敛。

  8. min_alpha:学习率的下限。在训练过程中,学习率会逐渐减小到这个值。

  9. sg:训练模式,0 表示使用CBOW模型,1 表示使用Skip-Gram模型。

  10. hs (或 hierarchicalSampling):如果设置为1,则使用分层采样。分层采样是一种考虑单词频率的采样方法,对高频词进行下采样,以提高模型对低频词的学习效率。

  11. negative_sampling:如果设置为1,则使用负采样。负采样是一种优化技术,通过只采样一部分负例来提高训练效率。

  12. cbow_mean:当使用CBOW模型时,如果设置为1,则对上下文的词向量取平均,而不是单独考虑每个词。

  13. hashfx:如果设置为1,则使用固定的hash函数来初始化词向量。

  14. epoch:训练周期的数量。

  15. threads:训练过程中使用的线程数。

  16. total_words:训练过程中处理的总单词数。

  17. model:保存模型的文件名。

  18. input:训练数据的输入文件。

这些参数可以根据具体的应用场景和计算资源进行调整,以达到最佳的训练效果。

构造w2v

from gensim.models import Word2Vec 
word2vec_model = Word2Vec(X_tfidf,  vector_size=16, sg=1, window=5, seed=2020, workers=24, min_count=1, epochs=1) 
words = list(word2vec_model.wv.index_to_key)
vector_size = word2vec_model.wv.vector_size
word_vectors = np.zeros((len(words), vector_size))
for i, word in enumerate(words):
    word_vectors[i, :] = word2vec_model.wv[word]

# 构建文档向量
def text_to_vec(text):
    words_in_text = text.split()  # 假设文本是通过空格分词的
    text_vec = np.zeros(vector_size)
    word_count = 0
    for word in words_in_text:
        if word in word2vec_model.wv:
            text_vec += word2vec_model.wv[word]
            word_count += 1
    if word_count > 0:
        text_vec /= word_count
    return text_vec

# 将所有文本数据转化为向量
text_vectors = np.array([text_to_vec(text) for text in X_tfidf])

数据切分

from sklearn.model_selection import train_test_split, StratifiedKFold
# 这里指定了random_state是为了保证每次切分数据集的结果都是一样的
Xidf_train, Xidf_test, yidf_train, yidf_test = train_test_split(text_vectors, y_tfidf,test_size=0.2,random_state=2024)



del df,array_TFIDF
gc.collect()

模型训练

def train_model(model, X_train, X_test, y_train, y_test):
    
    dic = {'lr':'Logistic Regression',
          'nb':'Naive Bayes',
          'svm':'Support Vector Machine',
          'dt':'Decision Tree',
          'rf':'Random Forest',
          'lgb':'LightGBM'}
    
    train_acc, test_acc = [], []
    
    if model == 'lr':
        clf = LogisticRegression(C=0.01, solver='liblinear')
    elif model == 'nb':
        clf = MultinomialNB(alpha=100)
    elif model == 'svm':
        clf = svm.LinearSVC(C=0.01)
    elif model == 'dt':
        clf = DecisionTreeClassifier(max_depth=100, min_samples_split= 2)
    elif model == 'rf':
        clf = RandomForestClassifier(max_depth=100,min_samples_split=5)
    elif model == 'lgb':
        clf = LGBMClassifier(learning_rate=1.0)
    else:
        print('Model doesn\'t exist')

    clf.fit(X_train, y_train)

    # predict using train data
    train_pred = clf.predict(X_train)
    train_acc = accuracy_score(y_train, train_pred)
    
    # predict using test data
    test_pred = clf.predict(X_test)
    test_acc = accuracy_score(y_test, test_pred)   

    print()
    print("Model: ", dic[model])
    print("Training accuracy: {}".format(train_acc))
    print("Test accuracy: {}".format(test_acc))
    print()

    return {
        'model_name':dic[model],
        'Train Accuracy':train_acc,
        'Test Accuracy':test_acc
    }

查看结果

metric_df = pd.DataFrame(columns=['model_name','Train Accuracy','Test Accuracy'])
for model in ['lr', 'nb', 'svm', 'dt', 'rf', 'lgb']:
    metric = train_model(model ,Xidf_train, Xidf_test, yidf_train, yidf_test)
    # 将metric转换成一个DataFrame
    metric_df = pd.concat([metric_df, pd.DataFrame([metric])], ignore_index=True)

在这里插入图片描述

metric_df

在这里插入图片描述

同类型项目

阿里云-零基础入门NLP【基于机器学习的文本分类】

阿里云-零基础入门NLP【基于深度学习的文本分类3-BERT】
也可以参考进行学习


学习的参考资料:
B站


原文地址:https://blog.csdn.net/weixin_42504788/article/details/142616361

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!