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

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

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

一、引言

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

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

二、基礎(chǔ)知識(shí)點(diǎn)CountVectorizer 與詞頻統(tǒng)計(jì)

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

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、主要知識(shí)點(diǎn)

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

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

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

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

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

print(cv.get_feature_names_out()):輸出詞庫(kù)中的詞列表,即篩選出來(lái)的前 6 個(gè)詞/詞組。

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

2、參數(shù)講解

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

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

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

3、輸出解讀

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

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

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

三、實(shí)戰(zhàn)項(xiàng)目:評(píng)論情感分析

1、項(xiàng)目目標(biāo)

我們手頭有兩份文本文件:差評(píng).txt好評(píng).txt。目標(biāo)是訓(xùn)練一個(gè)模型,能夠自動(dòng)判斷任意一條新評(píng)論的情感傾向(好評(píng)或差評(píng))。

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

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

import pandas as pd
import jieba

cp_content = pd.read_table(r".\差評(píng).txt", encoding='utf-8', header=None)
yzpj_content = pd.read_table(r".\好評(píng).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 用于過(guò)濾掉分詞后只有一個(gè)詞(通常是標(biāo)點(diǎn)或單字)的無(wú)效行,避免后續(xù)處理出錯(cuò)。pd.read_table()header=None 參數(shù)不能漏,否則第一行數(shù)據(jù)會(huì)被誤當(dāng)作列名。

3、去除停用詞

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

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ù)實(shí)際文件內(nèi)容修改,建議先用 print(stopwords.columns) 確認(rèn)列名。

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

將清洗后的文本打上標(biāo)簽:差評(píng)為 1,好評(píng)為 0,并合并成一個(gè)完整的數(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ù)處理(分詞、去停用詞、打標(biāo)簽)后的中間結(jié)果持久化到磁盤,后續(xù)可以直接讀取該 Excel 文件進(jìn)行模型訓(xùn)練,避免每次運(yùn)行程序都重新做分詞和清洗(尤其當(dāng)數(shù)據(jù)量較大時(shí),能節(jié)省大量時(shí)間);同時(shí)方便人工查看數(shù)據(jù)是否正確。

5、特征提取與模型訓(xùn)練

這是核心環(huán)節(jié)。我們將分詞后的文本列表拼接成空格分隔的字符串,然后用 CountVectorizer 將其轉(zhuǎn)換為詞頻向量,最后用樸素貝葉斯分類器進(jìn)行訓(xù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("訓(xùn)練集評(píng)估結(jié)果:")
print(metrics.classification_report(y_train, train_pr))

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

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

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

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

6、測(cè)試集評(píng)估

用同樣的方式處理測(cè)試集,并評(píng)估模型在未見(jiàn)過(guò)的數(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("測(cè)試集評(píng)估結(jié)果:")
print(metrics.classification_report(y_test, test_pr))

測(cè)試集向量化時(shí)只能用 vec.transform(),絕對(duì)不能再次調(diào)用 vec.fit()vec.fit_transform()。fit 只能調(diào)用一次,否則測(cè)試集的詞庫(kù)會(huì)和訓(xùn)練集不一致,導(dǎo)致預(yù)測(cè)結(jié)果完全錯(cuò)誤。

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

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

s = '這個(gè)玩意真好,我很喜歡'

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"評(píng)論【{s}】→預(yù)測(cè):好評(píng)")
else:
    print(f"評(píng)論【{s}】→預(yù)測(cè):差評(píng)")

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

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

代碼運(yùn)行展示

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

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

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

成果展示

以上就是Python實(shí)現(xiàn)詞頻統(tǒng)計(jì)與文本向量化的實(shí)戰(zhàn)教學(xué)的詳細(xì)內(nèi)容,更多關(guān)于Python詞頻統(tǒng)計(jì)與文本向量化的資料請(qǐ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的返回源碼詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • 60行Python PyGame代碼實(shí)現(xiàn)簡(jiǎn)單的迷宮游戲

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

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

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

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

    python opencv 圖像尺寸變換方法

    下面小編就為大家分享一篇python opencv 圖像尺寸變換方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • python csv實(shí)時(shí)一條一條插入且表頭不重復(fù)問(wèn)題

    python csv實(shí)時(shí)一條一條插入且表頭不重復(fù)問(wèn)題

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

    Python實(shí)現(xiàn)按學(xué)生年齡排序的實(shí)際問(wèn)題詳解

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

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

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

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

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

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

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

    python計(jì)算N天之后日期的方法

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

最新評(píng)論

库车县| 二连浩特市| 安阳县| 兴海县| 上林县| 北京市| 客服| 赤峰市| 永清县| 惠来县| 舞阳县| 南澳县| 宜宾市| 将乐县| 清苑县| 巫溪县| 绥棱县| 永德县| 合川市| 邹平县| 二手房| 三门峡市| 永济市| 门源| 裕民县| 平原县| 青海省| 龙江县| 都兰县| 延津县| 周至县| 微山县| 精河县| 安吉县| 新邵县| 临漳县| 三穗县| 乐山市| 怀安县| 利辛县| 六枝特区|