最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python實現(xiàn)詞頻統(tǒng)計與文本向量化的實戰(zhàn)教學

 更新時間:2026年06月04日 08:41:11   作者:夢想三三  
在自然語言處理(NLP)入門中,文本分類是一個非常經(jīng)典的任務(wù),本文會用到 scikit-learn 的 CountVectorizer 做文本向量化,用 jieba 做中文分詞,最后用樸素貝葉斯分類器完成訓練和預(yù)測,感興趣的小伙伴可以了解下

一、引言

在自然語言處理(NLP)入門中,文本分類是一個非常經(jīng)典的任務(wù)。今天,我將帶你從最基礎(chǔ)的詞頻統(tǒng)計開始,一步步構(gòu)建一個能夠自動判斷評論是“好評”還是“差評”的情感分析模型。

本文會用到 scikit-learnCountVectorizer 做文本向量化,用 jieba 做中文分詞,最后用樸素貝葉斯分類器完成訓練和預(yù)測。整個過程會包含完整的代碼和詳細的注釋,非常適合 NLP 初學者。

二、基礎(chǔ)知識點CountVectorizer 與詞頻統(tǒng)計

在開始實戰(zhàn)之前,我們先了解一下 CountVectorizer 的核心用法。它能把自然語言文本轉(zhuǎn)換成機器學習模型能處理的數(shù)字矩陣,屬于“基于統(tǒng)計的文本特征提取”方法。

from sklearn.feature_extraction.text import CountVectorizer

texts = ["dog cat fish", "dog cat cat", "fish bird", "bird"]
cv = CountVectorizer(max_features=6, ngram_range=(1, 3))

cv_fit = cv.fit_transform(texts)

print(cv_fit)
print(cv.get_feature_names_out())
print(cv_fit.toarray())

1、主要知識點

這段代碼演示了 CountVectorizer 最核心的用法,下面逐行拆解:

from sklearn.feature_extraction.text import CountVectorizer:從 scikit-learn 的特征提取模塊中導入詞頻向量化工具。這是文本分類中最常用的特征提取器之一。

texts = ["dog cat fish", "dog cat cat", "fish bird", "bird"]:定義了一個包含 4 條英文文本的列表,每條文本由空格分隔的單詞組成。在實際中文項目中,這里會替換成經(jīng)過分詞處理的中文句子。

cv_fit = cv.fit_transform(texts):這是兩步合一的操作。fit 階段根據(jù)輸入的所有文本,統(tǒng)計出所有符合 ngram_range 的詞/詞組,并按頻率排序篩選出前 6 個,生成詞庫。transform 階段把每一條文本轉(zhuǎn)換成對應(yīng)詞庫的詞頻向量,輸出是一個稀疏矩陣。

print(cv_fit):打印稀疏矩陣,只存儲非零元素的位置和數(shù)值,節(jié)省內(nèi)存。輸出格式為 (行索引, 列索引) 數(shù)值。

print(cv.get_feature_names_out()):輸出詞庫中的詞列表,即篩選出來的前 6 個詞/詞組。

print(cv_fit.toarray()):將稀疏矩陣轉(zhuǎn)換成普通的二維數(shù)組,每一行對應(yīng)一條文本,每一列對應(yīng)詞庫中的一個詞,數(shù)值是該詞在文本中出現(xiàn)的次數(shù)。

2、參數(shù)講解

cv = CountVectorizer(max_features=6, ngram_range=(1, 3)):初始化向量化器,這里有兩個關(guān)鍵參數(shù)需要重點理解:

ngram_range=(1, 3):控制詞/詞組的組合長度范圍。(1, 3) 表示同時提取單個詞(1-gram)、兩個詞的組合(2-gram)和三個詞的組合(3-gram)。例如文本 “dog cat fish” 會提取出:dog、catfish、dog catcat fish、dog cat fish。這個參數(shù)越大,能捕捉的語義信息越豐富,但特征維度也會急劇膨脹。

max_features=6:限制最終保留的特征數(shù)量(即詞/詞組的總數(shù)),只保留出現(xiàn)頻率最高的前 6 個。這是一個重要的降維手段,可以防止特征過多導致維度災(zāi)難和過擬合。在實際項目中,這個值通常設(shè)為 1000~10000 之間。

3、輸出解讀

cv_fit 是一個稀疏矩陣,只存儲非零元素,節(jié)省內(nèi)存。

get_feature_names_out() 返回詞庫中的詞列表。

toarray() 將稀疏矩陣轉(zhuǎn)為普通數(shù)組,每一行對應(yīng)一條文本,每一列對應(yīng)詞庫中的一個詞,數(shù)值是該詞在文本中出現(xiàn)的次數(shù)。

三、實戰(zhàn)項目:評論情感分析

1、項目目標

我們手頭有兩份文本文件:差評.txt好評.txt。目標是訓練一個模型,能夠自動判斷任意一條新評論的情感傾向(好評或差評)。

2、數(shù)據(jù)讀取與分詞

首先,用 pandas 讀取數(shù)據(jù),并用 jieba 進行中文分詞。

import pandas as pd
import jieba

cp_content = pd.read_table(r".\差評.txt", encoding='utf-8', header=None)
yzpj_content = pd.read_table(r".\好評.txt", encoding='utf-8', header=None)

cp_segments = []
contents = cp_content[0].values.tolist()
for content in contents:
    results = jieba.lcut(content)
    if len(results) > 1:
        cp_segments.append(results)

yzpj_segments = []
contents = yzpj_content[0].values.tolist()
for content in contents:
    results = jieba.lcut(content)
    if len(results) > 1:
        yzpj_segments.append(results)

cp_fc_results = pd.DataFrame({'content': cp_segments})
cp_fc_results.to_excel('cp_fc_results.xlsx', index=False)

yzpj_fc_results = pd.DataFrame({'content': yzpj_segments})
yzpj_fc_results.to_excel('yzpj_fc_results.xlsx', index=False)

jieba.lcut() 返回的是分詞列表,if len(results) > 1 用于過濾掉分詞后只有一個詞(通常是標點或單字)的無效行,避免后續(xù)處理出錯。pd.read_table()header=None 參數(shù)不能漏,否則第一行數(shù)據(jù)會被誤當作列名。

3、去除停用詞

停用詞(如“的”、“了”、“是”等)對分類任務(wù)貢獻不大,反而會增加噪聲,因此需要去除。

stopwords = pd.read_csv(r".\StopwordsCN.txt", encoding='utf8', engine='python', index_col=False)

def drop_stopwords(contents, stopwords):
    segments_clean = []
    for content in contents:
        line_clean = []
        for word in content:
            if word in stopwords:
                continue
            line_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_contents_clean_s = drop_stopwords(contents, stopwords_list)

contents = yzpj_fc_results.content.values.tolist()
yzpj_fc_contents_clean_s = drop_stopwords(contents, stopwords_list)

stopwords.stopword.values.tolist() 中的 stopword 是停用詞文件中的列名,如果列名不一致(比如叫 wordstopword),需要根據(jù)實際文件內(nèi)容修改,建議先用 print(stopwords.columns) 確認列名。

4、構(gòu)建分類數(shù)據(jù)集

將清洗后的文本打上標簽:差評為 1,好評為 0,并合并成一個完整的數(shù)據(jù)集。

cp_train = pd.DataFrame({'segments_clean': cp_fc_contents_clean_s, 'label': 1})
yzpj_train = pd.DataFrame({'segments_clean': yzpj_fc_contents_clean_s, 'label': 0})
pj_train = pd.concat([cp_train, yzpj_train])
pj_train.to_excel('pj_train.xlsx', index=False)

將預(yù)處理(分詞、去停用詞、打標簽)后的中間結(jié)果持久化到磁盤,后續(xù)可以直接讀取該 Excel 文件進行模型訓練,避免每次運行程序都重新做分詞和清洗(尤其當數(shù)據(jù)量較大時,能節(jié)省大量時間);同時方便人工查看數(shù)據(jù)是否正確。

5、特征提取與模型訓練

這是核心環(huán)節(jié)。我們將分詞后的文本列表拼接成空格分隔的字符串,然后用 CountVectorizer 將其轉(zhuǎn)換為詞頻向量,最后用樸素貝葉斯分類器進行訓練。

from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn import metrics

x_train, x_test, y_train, y_test = train_test_split(
    pj_train['segments_clean'].values, pj_train['label'].values, random_state=0
)

words = []
for line_index in range(len(x_train)):
    words.append(' '.join(x_train[line_index]))

vec = CountVectorizer(max_features=4000, lowercase=False, ngram_range=(1, 3))
vec.fit(words)
x_train_vec = vec.transform(words)

classifier = MultinomialNB(alpha=0.1)
classifier.fit(x_train_vec, y_train)

train_pr = classifier.predict(x_train_vec)
print("訓練集評估結(jié)果:")
print(metrics.classification_report(y_train, train_pr))

max_features=4000:限制特征數(shù)量為 4000,避免維度災(zāi)難,數(shù)據(jù)量大時可適當增大。

ngram_range=(1, 3):同時考慮單個詞、雙詞組合和三詞組合,捕捉更多語義信息。對于中文評論,2-gram 和 3-gram 能有效捕捉“不好”、“非常差”等短語級情感。

alpha=0.1:拉普拉斯平滑系數(shù),防止零概率問題。當某個詞在訓練集中未出現(xiàn)時,平滑系數(shù)可以避免概率為 0 導致整個預(yù)測失敗。值越小,對原始頻率的依賴越大;值越大,平滑效果越強。

vec.transform(words)必須分開調(diào)用,且fit只能在訓練集上執(zhí)行一次。如果誤寫成vec.fit_transform(words),雖然語法上沒錯,但后續(xù)測試集和新數(shù)據(jù)就無法正確向量化了。另外,words列表中的每個元素必須是空格分隔的字符串,不能是原始的分詞列表,否則CountVectorizer` 會把整個列表當成一個字符串處理。

6、測試集評估

用同樣的方式處理測試集,并評估模型在未見過的數(shù)據(jù)上的表現(xiàn)。

test_words = []
for line_index in range(len(x_test)):
    test_words.append(' '.join(x_test[line_index]))

test_pr = classifier.predict(vec.transform(test_words))

print("測試集評估結(jié)果:")
print(metrics.classification_report(y_test, test_pr))

測試集向量化時只能用 vec.transform(),絕對不能再次調(diào)用 vec.fit()vec.fit_transform()。fit 只能調(diào)用一次,否則測試集的詞庫會和訓練集不一致,導致預(yù)測結(jié)果完全錯誤。

7、模型預(yù)測與保存

訓練好的模型可以用來預(yù)測任意新評論。同時,我們將模型和向量化器保存到磁盤,方便以后直接使用。

s = '這個玩意真好,我很喜歡'

cut_list = jieba.lcut(s)
cut_str = ' '.join(cut_list)
s_vec = vec.transform([cut_str])
result = classifier.predict(s_vec)

if result[0] == 1:
    print(f"評論【{s}】→預(yù)測:好評")
else:
    print(f"評論【{s}】→預(yù)測:差評")

import joblib
joblib.dump(classifier, 'nb_model.pkl')
joblib.dump(vec, 'count_vectorizer.pkl')
joblib.dump(stopwords, 'stopwords.pkl')

在預(yù)測新評論時,一定要使用訓練好的 vec.transform() 進行向量化,而不是 vec.fit_transform()。fit 只能在訓練集上調(diào)用一次,測試集和新數(shù)據(jù)只能調(diào)用 transform,否則會導致詞庫不一致,預(yù)測結(jié)果完全錯誤。vec.transform([cut_str]) 中傳入的參數(shù)必須是列表形式(即使只有一條評論),因為 CountVectorizer 要求輸入是文本列表。joblib.dump 保存的三個 .pkl 文件后續(xù)可以直接加載使用,無需重新訓練。

代碼運行展示

四、進階:用大模型搭建交互網(wǎng)頁

模型訓練好了,但每次預(yù)測都要跑 Python 代碼,不夠方便。我們可以借助大模型(如 ChatGPT、Claude 等)幫我們生成一個 HTML 網(wǎng)頁,讓用戶直接在瀏覽器中輸入評論,點擊按鈕就能得到預(yù)測結(jié)果。

我們已經(jīng)有三個關(guān)鍵文件:nb_model.pkl(訓練好的樸素貝葉斯模型)、count_vectorizer.pkl(詞向量轉(zhuǎn)換器)、stopwords.pkl(停用詞表)。大模型可以幫我們生成一個 Flask 后端 + HTML 前端的簡易 Web 應(yīng)用,后端加載模型并暴露 API,前端提供輸入框和結(jié)果顯示區(qū)域。確保已安裝 Flask:pip install flask,運行 python app.py,在瀏覽器中訪問 http://127.0.0.1:5000,輸入評論點擊“判斷情感”即可看到預(yù)測結(jié)果。

成果展示

以上就是Python實現(xiàn)詞頻統(tǒng)計與文本向量化的實戰(zhàn)教學的詳細內(nèi)容,更多關(guān)于Python詞頻統(tǒng)計與文本向量化的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Django 響應(yīng)數(shù)據(jù)response的返回源碼詳解

    Django 響應(yīng)數(shù)據(jù)response的返回源碼詳解

    這篇文章主要介紹了Django 響應(yīng)數(shù)據(jù)response的返回源碼詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • 60行Python PyGame代碼實現(xiàn)簡單的迷宮游戲

    60行Python PyGame代碼實現(xiàn)簡單的迷宮游戲

    這篇文章主要為大家詳細介紹如何通過了60行Python PyGame代碼實現(xiàn)一個簡單的迷宮游戲,文中的示例代碼講解詳細,感興趣的小伙伴可以了解下
    2023-12-12
  • python命令 -u參數(shù)用法解析

    python命令 -u參數(shù)用法解析

    這篇文章主要介紹了python命令 -u參數(shù)用法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • python opencv 圖像尺寸變換方法

    python opencv 圖像尺寸變換方法

    下面小編就為大家分享一篇python opencv 圖像尺寸變換方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • python csv實時一條一條插入且表頭不重復問題

    python csv實時一條一條插入且表頭不重復問題

    這篇文章主要介紹了python csv實時一條一條插入且表頭不重復問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Python實現(xiàn)按學生年齡排序的實際問題詳解

    Python實現(xiàn)按學生年齡排序的實際問題詳解

    這篇文章主要給大家介紹了關(guān)于Python實現(xiàn)按學生年齡排序?qū)嶋H問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面跟著小編來一起學習學習吧。
    2017-08-08
  • python之chroma向量數(shù)據(jù)庫安裝方式

    python之chroma向量數(shù)據(jù)庫安裝方式

    Chroma支持四種距離函數(shù)配置,包括歐氏距離、余弦距離、內(nèi)積和曼哈頓距離,在人臉比對場景中,余弦距離是最優(yōu)選擇
    2026-01-01
  • Python 爬蟲全面使用指南:從Requests到Scrapy分布式架構(gòu)詳解

    Python 爬蟲全面使用指南:從Requests到Scrapy分布式架構(gòu)詳解

    本文介紹了Python網(wǎng)絡(luò)爬蟲生態(tài)中的的三大核心工具:Requests、BeautifulSoup和Scrapy,覆蓋了從簡單靜態(tài)網(wǎng)頁抓取到復雜動態(tài)渲染抓取的全流程,提供了豐富的實戰(zhàn)示例和注意事項,感興趣的朋友跟隨小編一起看看吧
    2026-05-05
  • python中路徑字符串斜杠替換方式

    python中路徑字符串斜杠替換方式

    這篇文章主要介紹了python中路徑字符串斜杠替換方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • python計算N天之后日期的方法

    python計算N天之后日期的方法

    這篇文章主要介紹了python計算N天之后日期的方法,涉及Python操作日期的相關(guān)技巧,非常具有實用價值,需要的朋友可以參考下
    2015-03-03

最新評論

当雄县| 合阳县| 大埔区| 灵台县| 高台县| 安福县| 凤翔县| 额尔古纳市| 大石桥市| 南漳县| 巴中市| 平顺县| 海安县| 三门峡市| 错那县| 基隆市| 竹北市| 赤城县| 嵊泗县| 东阿县| 东源县| 祁东县| 南乐县| 肇东市| 敖汉旗| 商南县| 定安县| 晋江市| 乌兰察布市| 巢湖市| 武平县| 历史| 沙雅县| 富宁县| 乐陵市| 崇文区| 揭东县| 赤城县| 惠州市| 承德市| 宜黄县|