具有品牌的廣州做網(wǎng)站360免費建站系統(tǒng)
文章目錄
- 項目背景
- 數(shù)據(jù)清洗
- 導(dǎo)包
- 導(dǎo)入數(shù)據(jù)
- 切分評論及標(biāo)簽
- Word2Vec
- 構(gòu)造w2v
- 數(shù)據(jù)切分
- 模型訓(xùn)練
- 查看結(jié)果
- 同類型項目
項目背景
項目的目的,是為了對情感評論數(shù)據(jù)集進行預(yù)測打標(biāo)。在訓(xùn)練之前,需要對數(shù)據(jù)進行數(shù)據(jù)清洗環(huán)節(jié),前面已對數(shù)據(jù)進行清洗,詳情可移步至NLP_情感分類_數(shù)據(jù)清洗
下面對已清洗的數(shù)據(jù)集,用機器學(xué)習(xí)方案(w2v)進行處理
數(shù)據(jù)清洗
導(dǎo)包
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
導(dǎo)入數(shù)據(jù)
df = pd.read_csv('data/sentiment_analysis_clean.csv')
df = df.dropna()
切分評論及標(biāo)簽
X_tfidf = df['text']
y_tfidf = df['label']
Word2Vec
可參考:NLP_詞的向量表示W(wǎng)ord2Vec 和 Embedding
Word2Vec是一個用于生成詞向量(word vectors)的模型,它由谷歌在2013年開發(fā)。Word2Vec模型通過神經(jīng)網(wǎng)絡(luò)將詞語轉(zhuǎn)換為數(shù)值向量,這些向量捕捉了詞語的語義信息,使得語義上相似的詞在向量空間中的距離也相近。
Word2Vec主要有兩種訓(xùn)練模型:
-
CBOW(Continuous Bag of Words):這是一個預(yù)測單詞的工具,給定一個單詞前后文的單詞,預(yù)測當(dāng)前單詞。CBOW模型不考慮單詞在句子中的順序。
-
Skip-Gram:與CBOW相反,Skip-Gram模型給定一個單詞,預(yù)測它前后文的單詞。Skip-Gram通常比CBOW能更好地捕捉詞語之間的關(guān)系,但是計算量更大。
Word2Vec模型的訓(xùn)練包括以下步驟:
-
初始化:隨機初始化詞向量和上下文向量。
-
訓(xùn)練:通過大量文本數(shù)據(jù)訓(xùn)練模型,使用梯度下降等優(yōu)化算法不斷更新詞向量,以減少預(yù)測單詞的誤差。
-
優(yōu)化:通過不斷迭代,優(yōu)化詞向量,使得語義相似的詞在向量空間中更接近。
訓(xùn)練完成后,Word2Vec可以用于各種自然語言處理任務(wù),如詞義消歧、句子相似度計算、機器翻譯等。詞向量可以作為輸入特征,用于訓(xùn)練其他深度學(xué)習(xí)模型。
Word2Vec的詞向量可以捕捉到一些語義規(guī)律,例如:
- 國王 - 男人 + 女人 = 女王
- 巴黎 - 法國 + 英國 = 倫敦
這些規(guī)律表明Word2Vec能夠理解和表達詞語之間的相對關(guān)系。
Word2Vec模型的優(yōu)點包括:
- 能夠捕捉詞語的語義信息。
- 生成的詞向量可以用于多種下游任務(wù)。
- 模型相對簡單,訓(xùn)練效率高。
缺點包括:
- 無法捕捉詞語的語法信息。
- 無法處理一詞多義的情況。
- 需要大量的文本數(shù)據(jù)進行訓(xùn)練。
Word2Vec是詞嵌入(word embedding)領(lǐng)域的一個重要里程碑,它啟發(fā)了后續(xù)許多其他詞嵌入模型的發(fā)展,如GloVe(Global Vectors for Word Representation)和FastText。
Word2Vec模型在訓(xùn)練時有多個參數(shù)可以設(shè)置,以下是一些常見的參數(shù)及其意義:
-
vector_size (或
size
):這是生成的詞向量的維度。較小的維度可能無法捕捉足夠的細(xì)節(jié),而較大的維度可能會增加計算成本并且導(dǎo)致過擬合。常見的維度設(shè)置有100、200、300等。 -
window (或
windowSize
):上下文窗口的大小,即在當(dāng)前單詞的前后考慮多少個單詞。較大的窗口可以捕捉更遠(yuǎn)的依賴關(guān)系,但也可能包含更多噪聲。 -
min_count:忽略出現(xiàn)次數(shù)低于此值的單詞。這可以用來過濾掉一些出現(xiàn)頻率非常低的單詞,以提高訓(xùn)練效率。
-
negative (或
negativeSize
):在訓(xùn)練中使用負(fù)采樣的詞匯數(shù)量。負(fù)采樣是一種優(yōu)化技術(shù),用于提高模型的訓(xùn)練效率。 -
iter (或
epochs
):訓(xùn)練數(shù)據(jù)集的迭代次數(shù)。較大的迭代次數(shù)可以提高模型的性能,但也需要更多的計算資源。 -
batch_size:每次模型更新時處理的單詞數(shù)量。較大的批量大小可以提高內(nèi)存的使用效率,但也可能影響模型的收斂速度。
-
alpha:學(xué)習(xí)率。較高的學(xué)習(xí)率可以加快訓(xùn)練速度,但可能導(dǎo)致模型無法收斂。
-
min_alpha:學(xué)習(xí)率的下限。在訓(xùn)練過程中,學(xué)習(xí)率會逐漸減小到這個值。
-
sg:訓(xùn)練模式,
0
表示使用CBOW模型,1
表示使用Skip-Gram模型。 -
hs (或
hierarchicalSampling
):如果設(shè)置為1
,則使用分層采樣。分層采樣是一種考慮單詞頻率的采樣方法,對高頻詞進行下采樣,以提高模型對低頻詞的學(xué)習(xí)效率。 -
negative_sampling:如果設(shè)置為
1
,則使用負(fù)采樣。負(fù)采樣是一種優(yōu)化技術(shù),通過只采樣一部分負(fù)例來提高訓(xùn)練效率。 -
cbow_mean:當(dāng)使用CBOW模型時,如果設(shè)置為
1
,則對上下文的詞向量取平均,而不是單獨考慮每個詞。 -
hashfx:如果設(shè)置為
1
,則使用固定的hash函數(shù)來初始化詞向量。 -
epoch:訓(xùn)練周期的數(shù)量。
-
threads:訓(xùn)練過程中使用的線程數(shù)。
-
total_words:訓(xùn)練過程中處理的總單詞數(shù)。
-
model:保存模型的文件名。
-
input:訓(xùn)練數(shù)據(jù)的輸入文件。
這些參數(shù)可以根據(jù)具體的應(yīng)用場景和計算資源進行調(diào)整,以達到最佳的訓(xùn)練效果。
構(gòu)造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]# 構(gòu)建文檔向量
def text_to_vec(text):words_in_text = text.split() # 假設(shè)文本是通過空格分詞的text_vec = np.zeros(vector_size)word_count = 0for word in words_in_text:if word in word2vec_model.wv:text_vec += word2vec_model.wv[word]word_count += 1if word_count > 0:text_vec /= word_countreturn text_vec# 將所有文本數(shù)據(jù)轉(zhuǎn)化為向量
text_vectors = np.array([text_to_vec(text) for text in X_tfidf])
數(shù)據(jù)切分
from sklearn.model_selection import train_test_split, StratifiedKFold
# 這里指定了random_state是為了保證每次切分?jǐn)?shù)據(jù)集的結(jié)果都是一樣的
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()
模型訓(xùn)練
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 datatrain_pred = clf.predict(X_train)train_acc = accuracy_score(y_train, train_pred)# predict using test datatest_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}
查看結(jié)果
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轉(zhuǎn)換成一個DataFramemetric_df = pd.concat([metric_df, pd.DataFrame([metric])], ignore_index=True)
metric_df
同類型項目
阿里云-零基礎(chǔ)入門NLP【基于機器學(xué)習(xí)的文本分類】
阿里云-零基礎(chǔ)入門NLP【基于深度學(xué)習(xí)的文本分類3-BERT】
也可以參考進行學(xué)習(xí)
學(xué)習(xí)的參考資料:
B站