iT邦幫忙

2025 iThome 鐵人賽

DAY 26
0
Modern Web

手刻部落格,從設計到部署的實戰攻略系列 第 26

站內搜尋(二):何謂斷詞、記號化 Tokenization?

  • 分享至 

  • xImage
  •  

上一講我們聊了搜尋的基本原理,可以透過建立一張關鍵字對應出現位置的表格來達成高效率的搜尋。

然而也提出要產出這張表的許多難點,包含處理不同複數、型態的英文單字,以及該根據什麼邏輯來分割中文句子,找出合適的關鍵字?這一講我們就來細聊這些話題。

何謂斷詞、記號化 Tokenization?

斷詞(或稱為分詞) Word Segmentation 可以理解成將一段文字分成詞、句等有意義的小單位。在分割中文、日文等不用空白分割字句的語言時,較常使用斷詞來描述這個動作。

而記號化(Tokenization)就比較常在英文世界中使用,意味把一段文字分成詞、符號和數字等小單位,也常用在自然語言處理(NLP)和大型語言模型(LLM)的範疇中。

簡單來說,在談及搜尋原理時,我們可以用 Tokenization 來形容把句子拆成最小單位的動作,中文語境下也可以用斷詞來指稱 Tokenization。

為什麼需要 Tokenization 呢?這由於我們需要建立關鍵字索引,才能在使用者輸入關鍵字的時候,以高效的方式找到所屬文章和位置。上一講談過若是在搜尋的時候每次都走訪比對所有文章內容,其效率便會非常之差。

斷詞

而既然我的部落格內容,大部分是以中文呈現,就來看看中文的斷詞要怎麼做吧!

先看看一個簡單的句子「大學生活動很多」,要怎麼將這個句子合理的分割開來呢?

比較合理的應該是拆成「大學生、活動、很多」,然而就中文常見的詞語組合,分割成「大學、生活、動、很多」好像也是有那麼點道理。

我們來看看常見的兩種斷詞方法:字典斷詞、統計斷詞。

字典斷詞

首先是用字典斷詞,顧名思義就是根據預先定義的字典來作處理,如果匹配上了字典中的字詞,就根據此字詞來分割。

同樣用「大學生活動很多」這個句子來舉例,在斷詞之前我們先定義以下這樣的字典:

大學、大學生、活動、很多

透過一種「匹配最大長度」的斷詞策略,先找有沒有匹配的字詞,如果有匹配多個字詞的話就挑最長的那個。

所以從頭開始匹配時最初會出現「大學」、「大學生」兩種 Cases,取較長的「大學生」,接著繼續匹配到「活動」和「很多」。

然而這種作法依舊可能會有問題,譬如用同樣一本字典來對「大學生活費很高」斷詞,就會優先把「大學生」撈出來,剩下「活費很高」繼續做斷詞,可是就語意來說,應該要切成「大學、生活費、很高」才比較合理。

這時就可以嘗試看看另一種思路:統計斷詞。

機率、統計斷詞

在自然語言處理(NLP)的領域中,我們可以透過統計的方式來分析語句中字詞組合出現的頻率,藉此來判斷要「斷」在哪裡。

其中一種常用的組合是 n-gram + PMI (Pointwise Mutual Information),透過 n-gram 把文字切成連續的片段,例如「大學、學生、生活、活費、費很、很高」,然後計算相鄰字詞的 PMI(兩個字詞黏在一起凝聚力)。

在比較 PMI 的時候,我們通過大量語料來得出 PMI(生活, 費) 的數值通常會蠻高的,所以合併成「生活費」。綜合下來「大學、生活費、很高」的分數會高於「大學生、活、費、很高」的機率較高,最終獲得比較合理的斷詞效果。

統計斷詞的方式還有很多種,這邊僅僅淺談概念而已,要深入了解的話就是一整門 NLP 的課程了。

而上述這些理論,都有一些已經做好的開源工具了,例如中文的斷詞器:結巴(Jieba)。我們可以自訂擴充的字典,像是領域內的專有名詞,搭配其機率模型來作更精準的中文斷詞。

參考資料

  1. Wiki - 詞法分析
  2. Wiki - 文字分割
  3. Wiki - n-gram
  4. Wiki - Pointwise mutual information
  5. GitHub - nodejieba

上一篇
站內搜尋(一):淺談搜尋原理,如何用關鍵字找到某篇文章?
下一篇
站內搜尋(三):搜尋流程,MiniSearch + Jieba
系列文
手刻部落格,從設計到部署的實戰攻略29
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言