【自然語言處理 — 概念篇】最基礎的Bag-of-Words模型是什麼呢?

更新於 發佈於 閱讀時間約 8 分鐘

常常我們在進行NLP討論時,不管哪一種NLP任務都會偶爾聽到BOW這個詞,原來全名就是「Bag-of-words」由名稱就可以知道這是在處理NLP任務之前的基礎工事,將一整篇文章切碎成一段語句,甚至是最小單位的「詞」,而這些詞又如何表述關係或者進一步的使用,試圖讓機器可以理解我們人類的詞語,就是基於BOW發展而來的。

既然是進入NLP世界的基礎,那我們就不得不來仔細了解一番,為什麼會有此命名呢? 轉譯成中文又可以稱為「詞袋」,就想像成專門裝各類糖果的袋子,每一種糖果可能會重複出現幾次,那麼在袋中的糖果,將各種不同種類統計之後,就能夠得出哪些糖果甚至進一步分這些糖果的種類(軟、硬糖...),而詞也是同樣的道理,統計出詞頻、詞的特徵,進一步分析出這段語句中可能帶有哪些情緒(正向、負向...),基本上就是透過一套演算法或資料結構幫我們進行前處理,以利後續的NLP任務進行。

圖片來源

BOW的處理過程

  1. 建構詞彙表: 將袋中的詞整理成一張表,這張表涵蓋了所有的詞。
  2. 標示特徵向量: 使用詞彙表的單詞做為特徵,建構一個特徵向量,維度與詞彙表的大小相同。
  3. 特徵表示應用: 將特徵向量應用於具體的NLP任務,如文本分類、情感分析、信息檢索等。這些特徵向量可以作為機器學習算法的輸入。

需要注意的是, BoW方法忽略了單詞的順序和語義信息, 只能說它的工法是讓機器讀懂我們語言的第一工序, 後續發展的NLP、機器學習都離不開BOW的影子, 後來也逐漸發現單純的BOW能看到的資訊並不多, 因此也衍生了後續的進階文本表示方法(TF-IDF、Word2Vec、BERT…等)。

不如動手做做看吧

安裝套件

  • scikit-learn:用於機器學習的Python套件, 擅長分類、回歸、聚類、降維、模型選擇和預處理等機器學習任務的工具和算法。
  • pandas: 對矩陣進行表格的處理。
  • jieba: 斷詞, 對中文進行分詞。
!pip install scikit-learn

!pip install pandas

!pip install jieba

下載中文字型讓圖表可以顯示中文

請參考「🖋 【Google Colab Python系列】 視覺化資料Matplotlib 如何繪製出中文?

import matplotlib as mpl
import matplotlib.font_manager as fm
import matplotlib.pyplot as plt

# 下載繁體中文字型
!wget -O SourceHanSerifTW-VF.ttf https://github.com/adobe-fonts/source-han-serif/raw/release/Variable/TTF/Subset/SourceHanSerifTW-VF.ttf

# 加入字型檔
fm.fontManager.addfont('SourceHanSerifTW-VF.ttf')

# 設定字型
#
mpl.rc('font', family='Source Han Serif TW VF')

定義文本數據集以及對應的標籤

這個步驟主要將我們需要進行處理的文本進行一維陣列的儲存,並且假設我們已經斷詞完畢。

corpus = [
"我喜歡吃水果",
"他喜歡喝咖啡",
"我喜歡漫畫書",
"他喜歡看電影"
]

自訂分詞器

以jieba進行

import jieba
def tokenizer(text):
return list(jieba.cut(text))th

轉換成特徵向量

指定自訂的斷詞器

from sklearn.feature_extraction.text import CountVectorizer

# 創建 BOW 特徵提取器
vectorizer = CountVectorizer(tokenizer=tokenizer)

# 通過 BOW 特徵提取器將文本轉換為特徵向量
features = vectorizer.fit_transform(corpus)

檢視詞彙表

feature_names = vectorizer.get_feature_names_out()
feature_names

# array(['他', '吃水果', '喜歡', '喝咖啡', '我', '書', '漫畫', '看', '電影'], dtype=object)

檢視特徵向量

print(features.toarray())

[[0 1 1 0 1 0 0 0 0]
[1 0 1 1 0 0 0 0 0]
[0 0 1 0 1 1 1 0 0]
[1 0 1 0 0 0 0 1 1]]

藉由pandas進行表格呈現

import pandas as pd
df = pd.DataFrame(features.toarray(), columns=feature_names)
df

繪製詞頻圖

import matplotlib.pyplot as plt
# 計算每個詞彙在所有句子中的總頻率
word_frequencies = features.sum(axis=0).A1

# 建立圖形
plt.figure(figsize=(10, 6))
plt.bar(range(len(feature_names)), word_frequencies)
plt.xticks(range(len(feature_names)), feature_names, rotation=45, fontsize=8)
plt.xlabel('詞彙')
plt.ylabel('頻率')
plt.title('詞彙頻率圖')

# 顯示圖形
plt.show()

圖片來源

今天的範例都在這裡「📦 bow.ipynb」歡迎自行取用。

如何使用請參閱「【Google Colab系列】台股分析預備式: Colab平台與Python如何擦出火花?」。

結語

原來BOW的概念如此簡單,我們常常被華麗的名詞給阻礙了前進的動力,仔細拆解每一個步驟之後才知道原來我們日常生活中的詞語,要讓機器讀懂也是不容易的,但動手實作之後,將每一步記錄起來,並重複學習就不是那麼困難了,讓我們持續學習NLP的技術吧! 下一章我們將來談談詞的向量與嵌入。

------------------------------------------------------------------------------------------------

喜歡撰寫文章的你,不妨來了解一下:

Web3.0時代下為創作者、閱讀者打造的專屬共贏平台 - 為什麼要加入?

歡迎加入一起練習寫作,賺取知識!

留言
avatar-img
留言分享你的想法!
avatar-img
阿Han的沙龍
128會員
282內容數
哈囉,我是阿Han,是一位 👩‍💻 軟體研發工程師,喜歡閱讀、學習、撰寫文章及教學,擅長以圖代文,化繁為簡,除了幫助自己釐清思路之外,也希望藉由圖解的方式幫助大家共同學習,甚至手把手帶您設計出高品質的軟體產品。
阿Han的沙龍的其他內容
2025/01/29
🤔 簡單且靜態就足夠了? 相信我們在開發Python應用程式的過程中, 常常會借用Enum來定義我們可能的選項, 就像顏色紅、綠、黃會有這樣的結構: class Color(str, Enum): RED = 'red' GREED = 'green' YELLOW = 'yel
Thumbnail
2025/01/29
🤔 簡單且靜態就足夠了? 相信我們在開發Python應用程式的過程中, 常常會借用Enum來定義我們可能的選項, 就像顏色紅、綠、黃會有這樣的結構: class Color(str, Enum): RED = 'red' GREED = 'green' YELLOW = 'yel
Thumbnail
2025/01/08
當我們的系統發展到一定程度時, 難免會面臨到正式上線的問題, 要如何讓維運更加簡易呢? 尤其隨著複雜的客製化配置的出現時, 我們應該如何有效的管理, 甚至驗證配置是否如預期資料型態、格式…, 而正好 pydantic 可以滿足這樣的需求, 就讓我們來看看怎麼使用吧! 需安裝的套件 pip i
Thumbnail
2025/01/08
當我們的系統發展到一定程度時, 難免會面臨到正式上線的問題, 要如何讓維運更加簡易呢? 尤其隨著複雜的客製化配置的出現時, 我們應該如何有效的管理, 甚至驗證配置是否如預期資料型態、格式…, 而正好 pydantic 可以滿足這樣的需求, 就讓我們來看看怎麼使用吧! 需安裝的套件 pip i
Thumbnail
2025/01/02
要如何使用unicorn啟動多個FastAPI服務, 歡迎參考我們的「【💊 Python的解憂錦囊 - FastAPI】如何啟動多個Workers」。 當我們試著設計帶入模組化時… 我們在「【💊 Python的解憂錦囊 - FastAPI】使用 lifespan 來共享資料與管理生命週期
Thumbnail
2025/01/02
要如何使用unicorn啟動多個FastAPI服務, 歡迎參考我們的「【💊 Python的解憂錦囊 - FastAPI】如何啟動多個Workers」。 當我們試著設計帶入模組化時… 我們在「【💊 Python的解憂錦囊 - FastAPI】使用 lifespan 來共享資料與管理生命週期
Thumbnail
看更多
你可能也想看
Thumbnail
大家好,我是一名眼科醫師,也是一位孩子的媽 身為眼科醫師的我,我知道視力發展對孩子來說有多關鍵。 每到開學季時,診間便充斥著許多憂心忡忡的家屬。近年來看診中,兒童提早近視、眼睛疲勞的案例明顯增加,除了3C使用過度,最常被忽略的,就是照明品質。 然而作為一位媽媽,孩子能在安全、舒適的環境
Thumbnail
大家好,我是一名眼科醫師,也是一位孩子的媽 身為眼科醫師的我,我知道視力發展對孩子來說有多關鍵。 每到開學季時,診間便充斥著許多憂心忡忡的家屬。近年來看診中,兒童提早近視、眼睛疲勞的案例明顯增加,除了3C使用過度,最常被忽略的,就是照明品質。 然而作為一位媽媽,孩子能在安全、舒適的環境
Thumbnail
提供一條簡單公式、一套盤點思路,幫助你快速算出去日本自助旅遊需要準備多少日幣現金!
Thumbnail
提供一條簡單公式、一套盤點思路,幫助你快速算出去日本自助旅遊需要準備多少日幣現金!
Thumbnail
這次來介紹一下NLP自然語言處理中重要的一個任務「命名實體識別(Named Entity Recognition)」, 這個任務主要識別出「人名」、「地名」、「公司」…等實體, 透過這些實體辨識結果, 可以近一步的理解意圖, 甚至判斷出該文章主要在講什麼重點…等。 關於更多NER的細節歡迎閱讀: 「
Thumbnail
這次來介紹一下NLP自然語言處理中重要的一個任務「命名實體識別(Named Entity Recognition)」, 這個任務主要識別出「人名」、「地名」、「公司」…等實體, 透過這些實體辨識結果, 可以近一步的理解意圖, 甚至判斷出該文章主要在講什麼重點…等。 關於更多NER的細節歡迎閱讀: 「
Thumbnail
前面我們介紹了「【Hugging Face】Ep.1 平凡人也能玩的起的AI平台」, 我們都知道「詞」是NLP世界中的最小單元, 關於詞的知識歡迎參考: 簡單來說,主要的目的是將文本轉換為模型可以處理的數據, But…, 他主要的任務並不是像jieba…等斷詞器一樣, 而是很單純的扮演文字與模型的橋
Thumbnail
前面我們介紹了「【Hugging Face】Ep.1 平凡人也能玩的起的AI平台」, 我們都知道「詞」是NLP世界中的最小單元, 關於詞的知識歡迎參考: 簡單來說,主要的目的是將文本轉換為模型可以處理的數據, But…, 他主要的任務並不是像jieba…等斷詞器一樣, 而是很單純的扮演文字與模型的橋
Thumbnail
Part-of-Speech Tagging, POS是詞性標注的全名, 主要為詞彙標上語言中的語法類別或用途, 再進行後續的分析與處理, 就想像成文件歸檔的動作, 每個文件貼上一個標籤類別, 而透過這些標籤類別進行關聯性的分類歸檔。 一個句子最基本的組成單位是「詞」這在我們之前幾個篇章都有談過,如
Thumbnail
Part-of-Speech Tagging, POS是詞性標注的全名, 主要為詞彙標上語言中的語法類別或用途, 再進行後續的分析與處理, 就想像成文件歸檔的動作, 每個文件貼上一個標籤類別, 而透過這些標籤類別進行關聯性的分類歸檔。 一個句子最基本的組成單位是「詞」這在我們之前幾個篇章都有談過,如
Thumbnail
我們有想過嗎? 一句簡單的話語, 竟然隱含著豐富的句法結構與規則, 而句法就是依著這樣的規則組合而成, 形成一個完整的句子, 隨著資料量越大, 透過規則與關聯性, 機器就能夠根據我們的話語進行拆解, 並試圖理解我們的意圖進行更貼心的服務, 隨著Chatgpt的興起, 我們也見證到AI的新里程碑, 資
Thumbnail
我們有想過嗎? 一句簡單的話語, 竟然隱含著豐富的句法結構與規則, 而句法就是依著這樣的規則組合而成, 形成一個完整的句子, 隨著資料量越大, 透過規則與關聯性, 機器就能夠根據我們的話語進行拆解, 並試圖理解我們的意圖進行更貼心的服務, 隨著Chatgpt的興起, 我們也見證到AI的新里程碑, 資
Thumbnail
詞跟詞之間的距離有多近呢? 如果一個詞在相對的空間內都佔有一席之地的話, 試想, 每個詞都是一個獨立的個體, 就如同我們人類一般, 相同興趣的、相同頻率的就容易被歸納在一起,某些詞可能是相近的意思, 因此我們只需要給每個詞標上一個向量值, 並進行統計,而這些詞在這批資料集之中所佔的位置依照距離都能夠
Thumbnail
詞跟詞之間的距離有多近呢? 如果一個詞在相對的空間內都佔有一席之地的話, 試想, 每個詞都是一個獨立的個體, 就如同我們人類一般, 相同興趣的、相同頻率的就容易被歸納在一起,某些詞可能是相近的意思, 因此我們只需要給每個詞標上一個向量值, 並進行統計,而這些詞在這批資料集之中所佔的位置依照距離都能夠
Thumbnail
常常我們在進行NLP討論時,不管哪一種NLP任務都會偶爾聽到BOW這個詞,原來全名就是「Bag-of-words」由名稱就可以知道這是在處理NLP任務之前的基礎工事,將一整篇文章切碎成一段語句,甚至是最小單位的「詞」,而這些詞又如何表述關係或者進一步的使用,試圖讓機器可以理解我們人類的詞語,就是基於
Thumbnail
常常我們在進行NLP討論時,不管哪一種NLP任務都會偶爾聽到BOW這個詞,原來全名就是「Bag-of-words」由名稱就可以知道這是在處理NLP任務之前的基礎工事,將一整篇文章切碎成一段語句,甚至是最小單位的「詞」,而這些詞又如何表述關係或者進一步的使用,試圖讓機器可以理解我們人類的詞語,就是基於
Thumbnail
在自然語言處理領域中,佔據核心地位的就是文字向量化的技術。先前有介紹過了經典好用的 tfidf,這次想要介紹融入了神經網路模型為基礎的word2vec(Google 2013年論文),事不宜遲,就讓我們往下看看吧
Thumbnail
在自然語言處理領域中,佔據核心地位的就是文字向量化的技術。先前有介紹過了經典好用的 tfidf,這次想要介紹融入了神經網路模型為基礎的word2vec(Google 2013年論文),事不宜遲,就讓我們往下看看吧
Thumbnail
本文會介紹「文本摘要」的基礎知識、基礎技術與框架。對於想理解「文本摘要」的讀者可以花時間閱讀一下。
Thumbnail
本文會介紹「文本摘要」的基礎知識、基礎技術與框架。對於想理解「文本摘要」的讀者可以花時間閱讀一下。
Thumbnail
前言 文章內容皆來自「NLP超強溝通術」這本書籍的讀後心得,吸收、內化後透過作者自己的理解進行整理與輸出。 什麼是NLP? 其實就很像我們的電腦程式一般,以眼睛、鼻子接收輸入(N),藉由經驗化為程式並透過思考判斷產生出決策的過程(P),透過語言或肢體進行輸出(L),這就是NLP的基本運作模式。
Thumbnail
前言 文章內容皆來自「NLP超強溝通術」這本書籍的讀後心得,吸收、內化後透過作者自己的理解進行整理與輸出。 什麼是NLP? 其實就很像我們的電腦程式一般,以眼睛、鼻子接收輸入(N),藉由經驗化為程式並透過思考判斷產生出決策的過程(P),透過語言或肢體進行輸出(L),這就是NLP的基本運作模式。
Thumbnail
一個好的自然語言模型,若出現了語言模型的 vocabulary set 未曾收錄的單字,語言模型就會產生 Out-of-Vocabulary (OOV)。 本文介紹 subword algorithms 介於 word-level 和 character-level 解決 OOV 的方法。
Thumbnail
一個好的自然語言模型,若出現了語言模型的 vocabulary set 未曾收錄的單字,語言模型就會產生 Out-of-Vocabulary (OOV)。 本文介紹 subword algorithms 介於 word-level 和 character-level 解決 OOV 的方法。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News