入門GPT | 詞袋模型(Bag of Words)輔助提升餐廳滿意度
Bag-of-Words 將文本看作由單詞構(gòu)成的無序集合,通過統(tǒng)計單詞在文本中出現(xiàn)的頻次來表示文本。因此,Bag-of-Words主要用于文本分類、情感分析、信息檢索等自然語言處理任務(wù)中
- 1. 什么是詞袋模型(Bag of Words)
- 2. 實現(xiàn) Bag of Words 的步驟
2.1 文本預處理
2.2 構(gòu)建詞匯表
2.3 向量化文本(詞袋表示)
2.4 通過文本的向量表示,使用余弦相似度分析句子相似度
- 3. 統(tǒng)計詞頻,通過評論提升餐廳滿意度
在自然語言處理領(lǐng)域,如何將人類語言轉(zhuǎn)化為機器能夠理解和處理的結(jié)構(gòu)化數(shù)據(jù),是解決文本問題的關(guān)鍵。
Bag of Words(簡稱 BoW)是一種經(jīng)典的文本表示方法,憑借其簡單性和易實現(xiàn)性,在文本分析中被廣泛應用。從情感分析到文檔分類,BoW 都扮演著重要角色
1. 什么是詞袋模型(Bag of Words)
Bag of Words 的核心思想是將文本看作一個“詞袋”,不關(guān)注單詞的順序,僅統(tǒng)計每個單詞在文本中出現(xiàn)的頻率。它將一段文本轉(zhuǎn)化為一個固定長度的向量,其中每個元素代表詞匯表中一個單詞的出現(xiàn)次數(shù)。雖然簡單,但 BoW 能有效地將自然語言處理任務(wù)轉(zhuǎn)化為標準的機器學習問題。
BoW 的特點是只關(guān)注詞匯的頻率,因此它特別適合于情感分析、文本分類、文檔聚類等任務(wù)。然而,BoW 也有一些缺點,比如忽略了單詞之間的順序和上下文語義信息,這會導致對語義敏感的任務(wù)(如句子生成)性能不足。盡管如此,其簡單高效的特性使其成為入門自然語言處理的理想方法。
2. 實現(xiàn) Bag of Words 的步驟
2.1 文本預處理
文本預處理是實現(xiàn) BoW 的第一步。原始文本通常包含噪聲,例如標點符號、停用詞和大小寫的混亂。清理文本能夠減少噪聲,提高模型的性能。對于中文,還需要進行分詞,因為中文沒有天然的單詞分隔符。
以下是 Python 實現(xiàn)中文分詞和停用詞去除的代碼:
"""
scikit-learn
"""
import jieba
from sklearn.feature_extraction.text import CountVectorizer
import numpy as np
# 客戶評論
reviews = [
"食物非常美味,配送速度也很快!",
"配送太慢了,食物已經(jīng)涼了。",
"食物很棒,服務(wù)也不錯,就是價格稍貴。",
"從未見過這么差的服務(wù),食物送得又慢又難吃!",
"這家餐廳的食物真是太美味了,值得推薦!",
"雖然配送慢,但食物的味道讓我感到驚喜。",
"食物美味可口,配送速度也有待提高。",
"我覺得這道菜非常美味,值得再點一次。",
"配送速度慢得讓人失望,但食物的味道彌補了這一點。",
"這道菜的味道真是美味無比,令人回味無窮。",
"雖然等了很久,但食物的美味讓我覺得值得。",
"每次來這家店,食物的美味總是讓我驚喜。",
"配送的速度實在太慢,影響了我的用餐體驗。"
]
# 分詞預處理
# 停用詞列表
stop_words = ["了", "的", "也", "從未", "這么", "但", "就是"]
# 分詞與去停用詞
def preprocess_text(corpus):
processed_corpus = []
for text in corpus:
words = jieba.lcut(text) # 使用 jieba 分詞
words = [word for word in words if word notin stop_words] # 去停用詞
processed_corpus.append(" ".join(words)) # 拼接成字符串
return processed_corpus
preprocessed_reviews = preprocess_text(reviews)
print("分詞后的評論:")
print(preprocessed_reviews)
運行這段代碼后,我們會得到預處理后的文本,如下所示:
分詞后的評論:
['食物 非常 美味 , 配送 速度 很快 !', '配送 太慢 , 食物 已經(jīng) 涼 。', '食物 很棒 , 服務(wù) 不錯 , 價格 稍貴 。', '從未見過 差 服務(wù) , 食物 送得 又 慢 又 難吃 !', '這家 餐廳 食物 真是太 美味 , 值得 推薦 !', '雖然 配送 慢 , 食物 味道 讓 我 感到 驚喜 。', '食物 美味可口 , 配送 速度 有待 提高 。', '我 覺得 這 道菜 非常 美味 , 值得 再點 一次 。', '配送 速度慢 得 讓 人 失望 , 食物 味道 彌補 這 一點 。', '這 道菜 味道 真是 美味 無比 , 令人 回味無窮 。', '雖然 等 很 久 , 食物 美味 讓 我 覺得 值得 。', '每次 來 這家 店 , 食物 美味 總是 讓 我 驚喜 。', '配送 速度 實在 太慢 , 影響 我 用餐 體驗 。']
2.2 構(gòu)建詞匯表
接下來需要構(gòu)建一個詞匯表,包含所有預處理后的評論中出現(xiàn)的唯一單詞。詞匯表是向量化的基礎(chǔ),每個單詞會被分配一個固定的索引。
以下是構(gòu)建詞匯表的代碼:
from sklearn.feature_extraction.text import CountVectorizer
# 構(gòu)建 BoW 模型
vectorizer = CountVectorizer()
bow_matrix = vectorizer.fit_transform(preprocessed_reviews)
# 輸出詞匯表
print("\n詞匯表:")
print(vectorizer.get_feature_names_out())
結(jié)果中,??vectorizer.get_feature_names_out()?
? 會輸出詞匯表:
詞匯表:
['一次''一點''不錯''從未見過''令人''價格''體驗''值得''再點''味道''回味無窮''太慢''失望''實在'
'已經(jīng)''彌補''影響''很快''很棒''總是''驚喜''感到''推薦''提高''無比''有待''服務(wù)''每次'
'用餐''真是''真是太''稍貴''美味''美味可口''雖然''覺得''這家''送得''速度''速度慢''道菜''配送'
'難吃''非常''食物''餐廳']
2.3 向量化文本(詞袋表示)
利用構(gòu)建好的詞匯表,我們可以將每條評論轉(zhuǎn)化為一個稀疏向量。每個向量的長度等于詞匯表的大小,每個元素代表該詞匯在文本中出現(xiàn)的次數(shù)。
以下是生成 BoW 矩陣的代碼:
# 輸出 BoW 矩陣
print("\nBoW 矩陣:")
print(bow_matrix.toarray())
運行結(jié)果會生成一個稀疏矩陣,例如:
BoW 矩陣:
[[000000000000000001000000000000001000
0010010110]
[000000000001001000000000000000000000
0000010010]
[001001000000000000100000001000010000
0000000010]
[000100000000000000000000001000000000
0100001010]
[000000010000000000000010000000101000
1000000011]
[000000000100000000001100000000000010
0000010010]
[000000000000000000000001010000000100
0010010010]
[100000011000000000000000000000001001
0000100100]
[010000000100100100000000000000000000
0001010010]
[000010000110000000000000100001001000
0000100000]
[000000010000000000000000000000001011
0000000010]
[000000000000000000011000000100001000
1000000010]
[000000100001010010000000000010000000
0010010000]]
每一行是一個評論的 BoW 向量,每一列對應詞匯表中的一個單詞,元素值為該單詞的出現(xiàn)次數(shù)。
2.4 通過文本的向量表示,使用余弦相似度分析句子相似度
余弦相似度是衡量兩個向量之間夾角余弦值的指標,可以用于比較文本的內(nèi)容相似程度
假設(shè)兩個向量為 A 和 B,其余弦相似度定義為:
余弦相似度的值在 [?1,1] 之間:
- 1 表示兩個向量方向完全一致(文本非常相似)。
- 0 表示向量正交(無相似性)。
- -1 表示兩個向量方向完全相反(完全不相似)。
余弦相似度:???人工智能小白到高手:余弦相似度(Cosine Similarity)的簡單理解??
from sklearn.metrics.pairwise import cosine_similarity
# 計算余弦相似度
cos_sim_matrix = cosine_similarity(bow_matrix)
# 熱力圖的繪制
import matplotlib.pyplot as plt
import seaborn as sns
# 設(shè)置中文字體
plt.rcParams['font.sans-serif'] = ['SimHei'] # 使用黑體
plt.rcParams['axes.unicode_minus'] = False# 解決負號顯示問題
plt.figure(figsize=(12, 10))
sns.heatmap(cos_sim_matrix, annot=True, cmap='coolwarm',
xticklabels=[reviews[i] for i in range(len(reviews))],
yticklabels=[reviews[i] for i in range(len(reviews))], fmt=".2f",
cbar_kws={"shrink": .8})
plt.title("評論之間的余弦相似度熱力圖", fontsize=16)
plt.xlabel("評論", fontsize=14)
plt.ylabel("評論", fontsize=14)
# 調(diào)整標簽的字體大小和旋轉(zhuǎn)角度
plt.xticks(rotation=45, ha='right', fontsize=10)
plt.yticks(rotation=0, fontsize=10)
plt.tight_layout()
plt.show()
矩陣圖中每個單元格表示兩個句子之間的余弦相似度,顏色越深,句子在語義上越相似。
例如,“食物非常美味,配送速度也很快”和“食物美味可口,配送速度也有待提高”交叉處的單元格顏色相對較深,說明它們具有較高的余弦相似度0.50,這意味著它們在語義上較為相似。
通過余弦相似度矩陣,可以進行以下分析:
- 找出最相似的評論對,例如通過矩陣中非對角線的最大值。
- 為新評論尋找最相近的現(xiàn)有評論,作為推薦系統(tǒng)的一部分。
- 根據(jù)相似度對評論進行聚類或分類。
3. 統(tǒng)計詞頻,通過評論提升餐廳滿意度
這些評論混合了正面和負面的反饋,統(tǒng)計矩陣中詞頻最高的詞,可以分析客戶關(guān)注的核心問題
# 計算詞頻
word_counts = np.asarray(bow_matrix.sum(axis=0)).flatten()
word_freq = dict(zip(vectorizer.get_feature_names_out(), word_counts))
# 按詞頻排序并輸出前10個詞
sorted_word_freq = sorted(word_freq.items(), key=lambda x: x[1], reverse=True)[:10]
print("\n詞頻最高的前10個詞:")
for word, freq in sorted_word_freq:
print(f"{word}: {freq}")
通過對生成的 BoW 矩陣計算詞頻,進行分析,我們可以發(fā)現(xiàn)一些有趣的現(xiàn)象。
例如,詞匯“美味”、“值得”和“驚喜”在正面評論中出現(xiàn)頻率較高,而“太慢”在負面評論中更常見。這些詞的分布可以幫助我們快速定位客戶滿意和不滿的關(guān)鍵點。正面評論中的高頻詞可能表明用戶對食物質(zhì)量滿意,而負面評論中的詞則表明配送慢是主要問題。
詞頻最高的前10個詞:
食物: 10
美味: 6
配送: 6
值得: 3
味道: 3
速度: 3
太慢: 2
驚喜: 2
服務(wù): 2
雖然: 2
詞袋模型是早期的一種模型,相對簡單,存在兩個主要問題:
第一,它使用高維稀疏向量來表示文本,每個單詞對應詞匯表中的一個維度。這導致模型更適用于高維空間,而且計算效率低。
第二,詞袋模型在表示單詞時忽略了它們在文本中的上下文信息
Bag-of-Words 將文本看作由單詞構(gòu)成的無序集合,通過統(tǒng)計單詞在文本中出現(xiàn)的頻次來表示文本。因此,Bag-of-Words主要用于文本分類、情感分析、信息檢索等自然語言處理任務(wù)中,在需要捕捉詞序信息的任務(wù)中表現(xiàn)較差,如機器翻譯和命名實體識別。
本文轉(zhuǎn)載自 ??AI取經(jīng)路??,作者: AI取經(jīng)路
