目錄
一、詞向量原理介紹
(1). 詞向量的核心概念
(2). 傳統文本表示的局限性
1. 獨熱編碼(One-Hot Encoding)
2. 詞袋模型(Bag of Words)
?3. TF-IDF
(3). 詞向量的核心原理
(4). 主流詞向量模型
1. Word2Vec(2013,Mikolov et al.)
(1)CBOW(Continuous Bag-of-Words)
(2)Skip-gram
Word2Vec 的優化技巧
2. GloVe(Global Vectors for Word Representation,2014)
3. FastText(2016,Facebook)
4. 上下文相關詞向量模型
(1)ELMo(Embeddings from Language Models,2018)
(2)BERT 及后續模型(2018 - 至今)
(5). 詞向量的訓練流程
(6). 詞向量的應用場景
(7). 詞向量的局限性與發展趨勢
局限性
發展趨勢
總結
二、代碼實現和實戰案例
1. 代碼API詳解
1. 核心參數(初始化時設置)
詞匯表相關參數
2. 核心方法
3. 注意事項
2. 實戰案例:好評差評判
我們分段解析一下該案例代碼流程:
(1) 導入庫
(2) 讀取數據并分詞
(3) 去除停用詞
(4) 樸素貝葉斯分類
4.1 給每個數據添加數字標簽
4.2 數據切分
4.3 將所有的詞轉換為詞向量
4.4 訓練樸素貝葉斯分類器并進行預測
4.5 交互式預測
三、總結(完整保留)
一、詞向量原理介紹
在自然語言處理(NLP)領域,詞向量(Word Embedding)是將文本中的詞語轉換為數值向量的技術,它解決了傳統文本表示方法的局限性,為機器學習模型理解語言語義提供了基礎。以下從概念、發展歷程、核心原理、主流模型、應用場景等方面詳細介紹詞向量。
(1). 詞向量的核心概念
詞向量是詞語的數值化表示,其核心思想是:將每個詞語映射到一個低維稠密的實數向量空間中,使得向量之間的距離(如余弦相似度)能夠反映詞語的語義關聯 ——語義相近的詞語,其向量表示也相近。
例如:
- "國王" 和 "女王" 的向量差異,可能與 "男人" 和 "女人" 的向量差異相似;
- "貓" 和 "狗" 的向量距離,會比 "貓" 和 "汽車" 的距離更近。
(2). 傳統文本表示的局限性
在詞向量出現之前,主流的文本表示方法存在明顯缺陷,這也凸顯了詞向量的必要性:
1. 獨熱編碼(One-Hot Encoding)
-
??原理??:為每個詞語分配一個唯一索引,向量中僅對應索引位置為 1,其余為 0。
-
??缺陷??:
-
維度災難:詞匯表大小為 N 時,向量維度為 N(十萬級),計算效率極低。
-
語義鴻溝:向量之間是正交關系(相似度為 0),無法體現詞語間的關聯(如 "蘋果" 和 "水果")。
-
2. 詞袋模型(Bag of Words)
-
??原理??:用詞語的出現頻率表示文本,忽略語序和語法。
-
??缺陷??:丟失語義和上下文信息,高頻無意義詞(如 "的""是")會干擾模型。
?3. TF-IDF
-
??原理??:通過詞頻(TF)和逆文檔頻率(IDF)加權,突出重要詞語。
-
??缺陷??:仍未解決語義表示問題,無法捕捉詞語的多義性(如銀行英文單詞 "bank" 可指金融機構或河岸)。
(3). 詞向量的核心原理
詞向量的本質是通過上下文學習詞語的語義表示,其理論基礎是分布式假設(Distributional Hypothesis):
"A word is characterized by the company it keeps"(詞語的語義由其上下文環境決定)。
例如,"蘋果" 常出現在 "吃""水果""甜" 等詞語附近,而 "華為" 常出現在 "手機""科技""品牌" 附近,通過學習這些上下文關聯,模型能區分兩者的語義。
(4). 主流詞向量模型
1. Word2Vec(2013,Mikolov et al.)
Word2Vec 是最經典的詞向量模型,通過簡化神經網絡結構實現高效訓練,包含兩種架構:
(1)CBOW(Continuous Bag-of-Words)
-
??原理??:用上下文詞語預測中心詞。例如,輸入 "[我] [愛] [吃] [水果]",預測中心詞 "蘋果"。
-
??優勢??:訓練速度快,適合大規模語料。
(2)Skip-gram
-
??原理??:用中心詞預測上下文詞語。例如,輸入 "蘋果",預測上下文 "我""愛""吃""水果"。
-
??優勢??:對低頻詞更友好,語義表示更精準。
Word2Vec 的優化技巧
-
??負采樣(Negative Sampling)??:通過抽樣負例(非上下文詞語)簡化損失計算,替代傳統的 softmax。
-
??層次 softmax(Hierarchical Softmax)??:用哈夫曼樹減少輸出層計算量,提升效率。
2. GloVe(Global Vectors for Word Representation,2014)
-
??原理??:結合全局詞共現統計和局部上下文預測,通過構建詞共現矩陣,用最小二乘損失優化向量表示。
-
??優勢??:同時利用全局統計信息和局部上下文,在語義相似度任務上表現優于 Word2Vec。
3. FastText(2016,Facebook)
-
??原理??:將詞語拆分為n-gram 子詞(Subword),例如 "apple" 拆分為 "<ap""app""ppl""ple""le>"(< 和 > 表示邊界)。
-
??優勢??:
-
解決未登錄詞(OOV,Out-of-Vocabulary)問題:通過子詞組合表示新詞。
-
對形態豐富的語言(如德語、法語)更友好。
-
4. 上下文相關詞向量模型
傳統模型(如 Word2Vec、GloVe)生成的是靜態詞向量(一個詞對應一個向量),無法處理多義詞。而上下文相關模型能根據語境動態生成向量:
(1)ELMo(Embeddings from Language Models,2018)
-
??原理??:基于雙向 LSTM 的預訓練語言模型,為每個詞語生成上下文相關向量(同一詞在不同句子中向量不同)。
-
??示例??:"他坐在銀行邊" 和 "他去銀行取錢" 中,"銀行" 的向量不同。
(2)BERT 及后續模型(2018 - 至今)
-
??原理??:基于 Transformer 架構的預訓練模型,通過 "掩碼語言模型(MLM)" 和 "下一句預測(NSP)" 任務學習深層語義。
-
??優勢??:能捕捉更復雜的上下文依賴和語義細微差別,是當前 NLP 任務的主流基礎模型。
(5). 詞向量的訓練流程
-
語料準備:收集大規模文本數據(如新聞、書籍、網頁),進行預處理(分詞、去停用詞、 lowercase 等)。
-
詞匯表構建:統計語料中出現的詞語,過濾低頻詞,建立詞匯表。
-
模型訓練:選擇 Word2Vec、GloVe 等模型,設置向量維度(通常 50-300)、窗口大小(上下文范圍)等超參數,用語料訓練模型。
-
向量應用:訓練完成后,每個詞語對應一個向量,可直接用于下游任務(如文本分類、相似度計算)。
(6). 詞向量的應用場景
-
語義相似度計算:通過向量余弦相似度衡量詞語 / 句子的語義關聯(如搜索引擎中的 "相關推薦")。
-
文本分類與聚類:將詞向量作為特征輸入分類模型(如情感分析:判斷 "這部電影很棒" 為正面情緒)。
-
機器翻譯:詞向量幫助模型對齊不同語言的語義(如 "狗" 和 "dog" 的向量在空間中接近)。
-
問答系統與對話機器人:通過詞向量理解用戶問題的語義,匹配最相關的答案。
-
推薦系統:基于用戶評論的詞向量分析偏好,實現個性化推薦(如 "喜歡科幻電影的用戶可能也喜歡科幻小說")。
(7). 詞向量的局限性與發展趨勢
局限性
-
靜態詞向量無法處理多義性(如 "蘋果" 既指水果也指公司)。
-
依賴大規模高質量語料,低資源語言(如小語種)表現較差。
-
難以捕捉復雜語義關系(如因果關系、隱喻)。
發展趨勢
-
上下文相關向量:BERT、GPT 等預訓練模型成為主流,動態生成詞語向量。
-
多模態詞向量:融合文本、圖像、語音等信息,提升語義表示的豐富性(如 "貓" 的向量同時關聯圖片特征)。
-
低資源語言優化:通過遷移學習(如用英語模型初始化小語種模型)提升效果。
總結
詞向量是自然語言處理的核心技術,它將離散的詞語轉換為連續的向量空間表示,使機器學習模型能夠 “理解” 語義。從早期的 Word2Vec 到如今的 BERT,詞向量的發展推動了 NLP 任務的性能飛躍。盡管存在局限性,但詞向量仍是連接文本與機器學習的重要橋梁,在各類實際應用中發揮著關鍵作用
?
二、代碼實現和實戰案例
1. 代碼API詳解
sklearn.feature_extraction.text.CountVectorizer
是 scikit-learn 庫中用于將文本數據轉換為詞頻矩陣(詞向量)的核心工具,它能將一系列文本文檔轉換為一個基于詞頻計數的數值特征矩陣,是文本分類、情感分析等自然語言處理任務的基礎預處理工具。
1. 核心參數(初始化時設置)
詞匯表相關參數
-
input
:指定輸入數據的類型,默認為'content'(直接處理文本內容),可選'filename'(處理文件路徑)或'file'(處理文件對象)。 -
encoding
:文本編碼格式,默認為'utf-8',用于讀取文本時解析字符。 -
decode_error
:處理編碼錯誤的方式,默認為'strict'(報錯),可選'ignore'(忽略錯誤)或'replace'(替換錯誤字符)。 -
strip_accents
:是否去除字符的重音符號,可選None(不處理)、'ascii'(僅對 ASCII 字符有效)或'unicode'(對所有 Unicode 字符有效)。 -
lowercase
:是否將所有文本轉換為小寫,默認為True,有助于統一詞匯格式(如 "Hello" 和 "hello" 視為同一詞)。 -
preprocessor
:自定義預處理函數,用于在分詞前對文本進行處理(如去除特殊符號),默認為None(使用內置處理)。 -
tokenizer
:自定義分詞函數,默認為None(使用內置的空格分詞),中文場景中常需替換為jieba.lcut
等分詞工具。 -
stop_words
:指定停用詞表,默認為None,可選'english'(使用內置英文停用詞),或傳入自定義停用詞列表(如中文停用詞)。 -
token_pattern
:分詞的正則表達式模式,默認為r"(?u)\b\w\w+\b"
(匹配至少 2 個字符的單詞),中文場景中通常需要修改或禁用。 -
ngram_range
:提取 n-gram 的范圍,默認為(1, 1)(僅提取單個詞),如(1, 2)表示同時提取 1-gram(單個詞)和 2-gram(連續兩個詞)。 -
analyzer
:指定分析單位,默認為'word'(按詞分析),可選'char'(按字符分析)或'char_wb'(按字符分析但不跨越詞邊界)。 -
max_df
:詞的最大文檔頻率閾值,默認為1.0(所有文檔),可設為浮點數(比例)或整數(絕對數量),過濾在過多文檔中出現的詞(如通用詞匯)。 -
min_df
:詞的最小文檔頻率閾值,默認為1,過濾在過少文檔中出現的詞(如稀有詞)。 -
max_features
:詞匯表的最大規模,默認為None(不限制),若設為整數 N,則只保留詞頻最高的前 N 個詞。 -
vocabulary
:自定義詞匯表,默認為None,若傳入字典({詞:索引}),則僅使用該詞匯表中的詞。 -
binary
:是否將詞頻轉換為二進制指示(1 表示出現,0 表示未出現),默認為False(保留實際計數)。 -
dtype
:輸出矩陣的數據類型,默認為numpy.int64
,可改為numpy.float32
等節省內存。
2. 核心方法
-
fit(raw_documents)
:根據輸入的文本數據(raw_documents)構建詞匯表,統計詞頻并確定最終保留的詞。 -
transform(raw_documents)
:使用已構建的詞匯表,將輸入文本轉換為詞頻矩陣(稀疏矩陣)。 -
fit_transform(raw_documents)
:合并fit和transform步驟,先構建詞匯表,再直接轉換文本,效率高于單獨調用。 -
get_feature_names_out()
:返回詞匯表中的所有詞(按索引順序),用于查看構建的詞匯表內容。 -
inverse_transform(X)
:將詞頻矩陣轉換回文本形式(僅保留出現的詞)。 -
get_params(deep=True)
:獲取當前CountVectorizer的所有參數配置。 -
set_params(**params)
:修改CountVectorizer的參數配置(如動態調整max_features)。
3. 注意事項
-
中文處理:CountVectorizer默認按空格分詞,中文需先使用
jieba
等工具分詞,再用空格連接(如"我 喜歡 機器學習"),并設置tokenizer=lambda x: x.split()
。 -
內存問題:文本量大時,詞頻矩陣可能非常稀疏,建議保留稀疏矩陣格式(避免用
toarray()
轉換為稠密矩陣)。 -
詞匯表規模:通過
max_df
、min_df
、max_features
控制詞匯表大小,避免維度災難。
2. 實戰案例:好差評判斷
案例背景需求和數據集:讀者可以通過代碼反推一下,如果可以找博主要一下源數據集,或者自己利用爬蟲知識自己去蘇寧易購的官網合法爬取也是可以的歐.
# -*- coding: utf-8 -*-
"""
蘇寧易購商品評價情感分析系統
功能:使用樸素貝葉斯分類器對商品評價進行好評/差評分類
"""# ==================== 第一部分:數據準備與預處理 ====================# (1) 導入必要的庫
import pandas as pd # 數據處理庫
import jieba # 中文分詞庫
from sklearn.feature_extraction.text import CountVectorizer # 文本向量化
from sklearn.naive_bayes import MultinomialNB # 樸素貝葉斯分類器
from sklearn.model_selection import train_test_split # 數據集劃分
from sklearn import metrics # 模型評估指標
from sklearn.metrics import accuracy_score # 準確率計算# (2) 讀取原始數據文件
# 注意:文件編碼為GBK,需與文件實際編碼一致
cp = pd.read_table("差評.txt", encoding='gbk') # 讀取差評數據
yzpj = pd.read_table("優質評價.txt", encoding='gbk') # 讀取好評數據# (3) 中文分詞處理
# 對差評數據進行分詞
cp_segments = []
contents = cp.content.values.tolist() # 將評價內容轉為列表
for content in contents:results = jieba.lcut(content) # 使用jieba進行中文分詞if len(results) > 1: # 過濾掉空內容和單字內容cp_segments.append(results)
# 將分詞結果保存為DataFrame并導出Excel
cp_fc_results = pd.DataFrame({'content': cp_segments})
cp_fc_results.to_excel('cp_fc_results.xlsx', index=False)# 對好評數據進行同樣的分詞處理
yzpj_segments = []
contents = yzpj.content.values.tolist()
for content in contents:results = jieba.lcut(content)if len(results) > 1:yzpj_segments.append(results)
yzpj_fc_results = pd.DataFrame({'content': yzpj_segments})
yzpj_fc_results.to_excel('yzpj_fc_results.xlsx', index=False)# (4) 去除停用詞
# 加載中文停用詞表(注意文件編碼為UTF-8)
stopwords = pd.read_csv('StopwordsCN.txt', encoding='utf-8', engine='python', sep='\t')def drop_stopwords(contents, stopwords):"""去除分詞結果中的停用詞參數:contents: 分詞后的內容列表stopwords: 停用詞列表返回:去除停用詞后的內容列表"""segments_clean = []for content in contents:line_clean = []for word in content:if word in stopwords.values: # 如果是停用詞則跳過continueline_clean.append(word)segments_clean.append(line_clean)return segments_clean# 處理差評數據
contents = cp_fc_results.content.values.tolist()
stopwords_list = stopwords.stopword.values.tolist()
cp_fc_content_clean_s = drop_stopwords(contents, stopwords_list)# 處理好評數據
contents = yzpj_fc_results.content.values.tolist()
yzpj_fc_content_clean_s = drop_stopwords(contents, stopwords_list)# ==================== 第二部分:模型訓練與評估 ====================# (5) 構建訓練數據集
# 給差評數據打標簽1,好評數據打標簽0
cp_train = pd.DataFrame({'segments_clean': cp_fc_content_clean_s, 'label': 1})
yzpj_train = pd.DataFrame({'segments_clean': yzpj_fc_content_clean_s, 'label': 0})
# 合并差評和好評數據
pj_train = pd.concat([cp_train, yzpj_train])
pj_train.to_excel('pj_train.xlsx', index=False) # 保存訓練數據# (6) 劃分訓練集和測試集
# 使用75%的數據訓練,25%的數據測試,random_state固定隨機種子保證可復現性
x_train, x_test, y_train, y_test = train_test_split(pj_train['segments_clean'].values, pj_train['label'].values, random_state=0
)# (7) 文本向量化
# 將分詞列表轉換為空格連接的字符串
words = []
for line_index in range(len(x_train)):words.append(' '.join(x_train[line_index]))# 初始化CountVectorizer
# max_features=10000: 只保留最常見的10000個詞
# lowercase=False: 不轉換為小寫(中文不需要)
# ngram_range=(1,3): 考慮1-3個詞的組合
vec = CountVectorizer(max_features=10000, lowercase=False, ngram_range=(1, 3))
vec.fit(words) # 擬合向量化器
x_train_vec = vec.transform(words) # 轉換訓練數據# (8) 訓練樸素貝葉斯分類器
# alpha=0.1: 平滑參數,防止零概率問題
classifier = MultinomialNB(alpha=0.1)
classifier.fit(x_train_vec, y_train) # 訓練模型# 在訓練集上預測(用于檢查過擬合)
train_pr = classifier.predict(x_train_vec)# (9) 測試集評估
# 準備測試數據
test_words = []
for line_index in range(len(x_test)):test_words.append(' '.join(x_test[line_index]))
x_test_vec = vec.transform(test_words) # 向量化測試數據# 預測并評估
test_pr = classifier.predict(x_test_vec)
print("測試集準確率:", accuracy_score(y_test, test_pr)) # 打印準確率
test_predicted = classifier.predict(x_test_vec)
print("測試集分類報告:")
print(metrics.classification_report(y_test, test_predicted, digits=4)) # 打印詳細分類報告# ==================== 第三部分:交互式預測 ====================# (10) 交互式情感分析
print("\n===== 交互式評價分類 =====")
print("輸入'exit'退出程序")
while True:text_something = input('請輸入一段評價(輸入exit退出):')if text_something == 'exit':break# 對新輸入進行同樣的預處理seg_list = jieba.lcut(text_something) # 分詞seg_clean = [word for word in seg_list if word not in stopwords_list] # 去停用詞text_processed = [' '.join(seg_clean)] # 組合為字符串# 向量化text_vec = vec.transform(text_processed)# 預測并輸出結果predict = classifier.predict(text_vec)if predict[0] == 1:print("預測結果:差評")else:print("預測結果:優質評價")
我們分段解析一下該案例代碼流程:
(1) 導入庫
import pandas as pd # 數據處理庫
import jieba # 中文分詞庫
from sklearn.feature_extraction.text import CountVectorizer # 文本向量化
from sklearn.naive_bayes import MultinomialNB # 樸素貝葉斯分類器
from sklearn.model_selection import train_test_split # 數據集劃分
from sklearn import metrics # 模型評估指標
from sklearn.metrics import accuracy_score # 準確率計算
這行代碼導入了pandas庫,并將其別名為pd。pandas是一個用于數據處理和分析的強大庫,在后續代碼中用于讀取文件、數據處理和構建數據框等操作。其他庫在下文中對應使用模塊也有詳細介紹,可以暫時跳過下面這幾段解釋到下一段代碼.
這行代碼導入了jieba
庫,并將其別名為jieba
。jieba
是一個優秀的中文分詞庫,在后續代碼中用于將中文文本切分成詞語序列,是中文自然語言處理的基礎工具。
這行代碼導入了CountVectorizer
類,來自sklearn.feature_extraction.text
模塊。CountVectorizer
是scikit-learn提供的文本特征提取工具,在后續代碼中用于將分詞后的文本轉換為詞頻矩陣(詞向量),是文本分類任務中的關鍵預處理步驟。
這行代碼導入了MultinomialNB
類,來自sklearn.naive_bayes
模塊。MultinomialNB
是多項式樸素貝葉斯分類器實現,在后續代碼中用于構建文本分類模型,特別適合處理離散特征(如詞頻)的分類任務。
這行代碼導入了train_test_split
函數,來自sklearn.model_selection
模塊。train_test_split
是機器學習中常用的數據集劃分工具,在后續代碼中用于將數據集隨機分割為訓練集和測試集,便于模型訓練和評估。
這行代碼導入了metrics
模塊,來自sklearn
包。metrics
包含了各種機器學習評估指標,在后續代碼中主要用于生成分類報告(如精確率、召回率、F1值等),全面評估模型性能。
這行代碼導入了accuracy_score
函數,來自sklearn.metrics
模塊。accuracy_score
是分類任務中最常用的評估指標,在后續代碼中用于計算模型在測試集上的分類準確率,直觀反映模型整體預測正確率。
(2) 讀取數據并分詞
cp = pd.read_table("差評.txt", encoding='gbk')
yzpj = pd.read_table("優質評價.txt", encoding='gbk')#import jieba
cp_segments = []
contents = cp.content.values.tolist()
for content in contents:results = jieba.lcut(content)if len(results)>1:cp_segments.append(results)
cp_fc_results = pd.DataFrame({'content':cp_segments})
cp_fc_results.to_excel('cp_fc_results.xlsx',index = False)yzpj_segments = []
contents = yzpj.content.values.tolist()
for content in contents:results = jieba.lcut(content)if len(results)>1:yzpj_segments.append(results)
yzpj_fc_results = pd.DataFrame({'content':yzpj_segments})
yzpj_fc_results.to_excel('yzpj_fc_results.xlsx',index = False)
- 首先使用pd.read_table函數分別讀取了名為 “差評.txt” 和 “優質評價.txt” 的文件,文件編碼為gbk,并將數據存儲在cp和yzpj兩個數據框中。
- 然后導入jieba庫,這是一個中文分詞工具。
- 接下來通過循環遍歷cp數據框中content列的值,使用jieba.lcut對每個評價內容進行分詞,將分詞結果長度大于 1 的添加到cp_segments列表中,最后將cp_segments列表轉換為數據框cp_fc_results并保存為cp_fc_results.xlsx文件。
- 對yzpj數據框進行同樣的操作,得到分詞后的結果并保存為yzpj_fc_results.xlsx文件。
(3) 去除停用詞
stopwords = pd.read_csv('StopwordsCN.txt',encoding='utf-8',engine='python',sep='\t')
def drop_stopwords(contents,stopwords):segments_clean = []for content in contents:line_clean = []for word in content:if word in stopwords:continueline_clean.append(word)segments_clean.append(line_clean)return segments_cleancontents = cp_fc_results.content.values.tolist()
stopwords = stopwords.stopword.values.tolist()
cp_fc_content_clean_s = drop_stopwords(contents,stopwords)contents = yzpj_fc_results.content.values.tolist()
yzpj_fc_content_clean_s =drop_stopwords(contents,stopwords)
- 首先使用pd.read_csv函數讀取了名為 “StopwordsCN.txt” 的停用詞文件,文件編碼為utf - 8,使用python引擎,分隔符為制表符\t。
- 定義了drop_stopwords函數,該函數接受兩個參數,contents是包含分詞結果的列表,stopwords是停用詞列表。函數內部通過嵌套循環遍歷contents中的每個分詞結果和其中的每個單詞,如果單詞在停用詞列表中則跳過,否則將其添加到line_clean列表中,最后將line_clean列表添加到segments_clean列表中并返回。
- 分別將cp_fc_results和yzpj_fc_results數據框中content列的值轉換為列表,然后調用drop_stopwords函數去除停用詞,得到cp_fc_content_clean_s和yzpj_fc_content_clean_s兩個去除停用詞后的列表。
?
(4) 樸素貝葉斯分類
4.1 給每個數據添加數字標簽
cp_train = pd.DataFrame({'segments_clean': cp_fc_content_clean_s, 'label': 1})
yzpj_train = pd.DataFrame({'segments_clean': yzpj_fc_content_clean_s, 'label': 0})
pj_train = pd.concat([cp_train, yzpj_train])
pj_train.to_excel('pj_train.xlsx', index=False)
將去除停用詞后的差評數據cp_fc_content_clean_s和標簽1(表示差評)構建成數據框cp_train,將優質評價數據yzpj_fc_content_clean_s和標簽0(表示優質評價)構建成數據框yzpj_train。
使用pd.concat函數將cp_train和yzpj_train兩個數據框合并成一個數據框pj_train,并將其保存為pj_train.xlsx文件。
?
4.2 數據切分
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = \train_test_split(pj_train['segments_clean'].values, pj_train['label'].values, random_state=0)
從sklearn.model_selection模塊中導入train_test_split函數,該函數用于將數據集劃分為訓練集和測試集。這里將pj_train數據框中的segments_clean列的值作為特征數據,label列的值作為標簽數據,按照默認的測試集比例將數據劃分為訓練集特征x_train、測試集特征x_test、訓練集標簽y_train和測試集標簽y_test,random_state = 0用于設置隨機種子,確保每次運行代碼時數據劃分結果一致。
?
4.3 將所有的詞轉換為詞向量
words = []
for line_index in range(len(x_train)):words.append(' '.join(x_train[line_index]))from sklearn.feature_extraction.text import CountVectorizer
vec = CountVectorizer(max_features=10000, lowercase=False, ngram_range=(1, 3))
vec.fit(words)
x_train_vec = vec.transform(words)
- 首先創建一個空列表words,通過循環將訓練集特征x_train中的每個分詞結果列表轉換為以空格分隔的字符串,并添加到words列表中。
- 從sklearn.feature_extraction.text模塊中導入CountVectorizer類,該類用于將文本數據轉換為詞向量。創建CountVectorizer對象vec,設置max_features = 10000表示只提取詞頻最高的前 10000 個詞作為詞庫,lowercase = False表示不將所有詞轉換為小寫,ngram_range=(1, 3)表示考慮 1 - 3 元組的詞。
- 使用vec.fit(words)根據words列表構建詞向量模型,然后使用vec.transform(words)將words列表轉換為詞向量矩陣x_train_vec。
?
4.4 訓練樸素貝葉斯分類器并進行預測
from sklearn.naive_bayes import MultinomialNB, ComplementNB
classifier = MultinomialNB(alpha=0.1)
classifier.fit(x_train_vec, y_train)train_pr = classifier.predict(x_train_vec)from sklearn.metrics import accuracy_scoretest_words = []
for line_index in range(len(x_test)):test_words.append(' '.join(x_test[line_index]))
x_test_vec = vec.transform(test_words)test_pr = classifier.predict(x_test_vec)
print("測試集準確率:", accuracy_score(y_test, test_pr))
test_predicted = classifier.predict(x_test_vec)
print("測試集分類報告:")
print(metrics.classification_report(y_test, test_predicted, digits=4))
-
從sklearn.naive_bayes模塊中導入MultinomialNB和ComplementNB類,這里選擇MultinomialNB類創建樸素貝葉斯分類器對象classifier,設置alpha = 0.1。
-
使用classifier.fit(x_train_vec, y_train)對分類器進行訓練,將訓練集詞向量x_train_vec和訓練集標簽y_train作為訓練數據。
-
使用classifier.predict(x_train_vec)對訓練集進行預測,得到訓練集預測結果train_pr。
-
對測試集數據進行同樣的處理,先將測試集特征x_test轉換為以空格分隔的字符串列表test_words,然后轉換為詞向量矩陣x_test_vec,使用classifier.predict(x_test_vec)對測試集進行預測,得到測試集預測結果test_pr。
-
使用accuracy_score函數計算測試集的準確率并打印,使用classification_report函數生成測試集的分類報告并打印,digits = 4表示保留四位小數。
?
4.5 交互式預測
while True:text_something = input('請輸入一段評價(輸入exit退出):')if text_something == 'exit':breakseg_list = jieba.lcut(text_something)seg_clean = [word for word in seg_list if word not in stopwords]text_processed = [' '.join(seg_clean)]text_vec = vec.transform(text_processed)predict = classifier.predict(text_vec)if predict[0] == 1:print("預測結果:差評")else:print("預測結果:優質評價")
- 使用while True創建一個無限循環,在循環內部使用input函數獲取用戶輸入的評價文本。
- 如果用戶輸入的是exit,則使用break跳出循環。
- 否則,對用戶輸入的文本進行分詞、去除停用詞處理,將處理后的結果轉換為符合要求的格式并轉換為詞向量,最后使用訓練好的分類器進行預測,并根據預測結果打印 “預測結果:差評” 或 “預測結果:優質評價”。
?
三、總結(完整保留)
詞向量是自然語言處理的核心技術,它將離散的詞語轉換為連續的向量空間表示,使機器學習模型能夠 "理解" 語義。從早期的 Word2Vec 到如今的 BERT,詞向量的發展推動了 NLP 任務的性能飛躍。盡管存在局限性,但詞向量仍是連接文本與機器學習的重要橋梁,在各類實際應用中發揮著關鍵作用。
通過本指南,讀者可以:
-
深入理解詞向量的數學原理和發展脈絡
-
掌握主流詞向量模型的特點和適用場景
-
使用Python實現完整的文本分類流程
-
了解中文文本處理的特殊注意事項
希望大家能有所收獲!