跳到主要內容跳到頁尾

文字字頻統計:拆開一格文字,連星號、問號與空白一起算

4 分鐘閱讀摘要與日期

用 MID、SEQUENCE、UNIQUE 與 MAP 統計自製文字的字元出現次數;避開 COUNTIF 萬用字元,說明大小寫、換行及 UTF-16 計數限制。

發布

文章目錄

一整段文字放在同一格時,想知道每個字元各出現幾次,可以先把它逐個拆成一欄,再列出不重複的項目並計數。這能用來檢查重複符號、簡單文案與輸入內容的組成。

本篇使用自製短文字,英文字母先統一為大寫,空白與換行保留計數。結果是字元頻率,不是中文斷詞、關鍵字分析,也不是人眼看到的完整 emoji 個數。

準備文字與輸出空間

在空白工作表的 B2 輸入下面這段文字;A 後面有一個半形空白,後面的 a 是小寫:

text
茶茶A a*?~*

在 D1:E1 填入「字元、次數」,清空 D2:E30。英文字母合併後,預期出現順序如下:

字元次數
茶2
A2
[空白]1
*2
?1
~1

順序依首次出現排列,不是依次數排序。合計次數為 9,與這份經大寫轉換的簡單文字長度相同。

一次拆分、去重與計數

在 D2 輸入:

Google 試算表公式
fx

統一英文字母大小寫,並把空白與換行顯示成可辨識標籤

=IF( B2="", "沒有文字", LET( t, UPPER(B2), chars, ARRAYFORMULA(MID(t, SEQUENCE(LEN(t)), 1)), u, UNIQUE(chars), HSTACK( MAP(u, LAMBDA(x, SWITCH(x, " ", "[空白]", CHAR(10), "[換行]", x) )), MAP(u, LAMBDA(x, SUMPRODUCT(N(chars=x)))) ) ) )

這份公式分成四個階段:

  1. UPPER 先統一大小寫,讓 a 與 A 都計入 A。
  2. SEQUENCE(LEN(t)) 產生從 1 到文字長度的直向序號;ARRAYFORMULA 讓 MID 一次取出各位置,形成一欄 chars。
  3. UNIQUE 留下不同的字元;MAP 逐個取出 x,用等號比較整欄,再以 SUMPRODUCT 將符合項目加總。
  4. HSTACK 把顯示標籤與次數並排。只有輸出標籤轉成 [空白]、[換行],計數時仍比較真正的原始字元。

空白輸入會顯示「沒有文字」,先避開長度為 0 的序號問題。若是數字代碼,請先把來源儲存格設為純文字,尤其是需要保留前置零的內容。

為什麼不直接用 COUNTIF?

COUNTIF 的條件支援萬用字元:* 可代表任意文字,? 可代表單一字元,~ 用於跳脫。把「每個字元」直接當條件,會讓星號、問號等符號產生另一種意思。COUNTIF 官方說明

本篇用 chars=x 做字面相等比較,所以原文裡兩個星號就得到 2,問號和波浪號各得到 1。這個寫法也先明確決定大小寫合併規則,不把它當成區分大小寫的統計器。

保留空白和換行,有什麼用?

把 B2 改成第一行「茶 」與第二行「茶」,第一行的茶後面保留一個半形空白。你也可以在 B2 暫時輸入:

Google 試算表公式
fx

建立含一個半形空白及一個換行的測試文字

="茶 " & CHAR(10) & "茶"

預期是茶 2 次、[空白] 1 次、[換行] 1 次。這適合檢查肉眼容易漏看的字元。全形空白、Tab、不換行空白是不同字元,本文沒有替它們製作專屬標籤,也沒有移除或合併它們。

Google 官方說明,LEN 也計算空白及不可見字元。LEN 官方說明

UTF-16 限制:不要把結果叫做 emoji 字數

在 Google 試算表裡,LEN("🦊") 回傳 2;使用拉丁字母 e 加上獨立組合重音符號的 LEN("é") 也回傳 2。這裡依照試算表文字函式的 UTF-16 單位拆分,沒有處理使用者感知的完整字素(grapheme cluster)。

因此,代理字元對、組合重音、膚色修飾、國旗與連接的 emoji,都不能保證一個畫面符號就是一列。這個案例適合一般中文字、英文字母與簡單符號;要分析這些複合文字,應先選用能辨識字素的文字處理方式。本文不把兩個測例推論成所有 Unicode 情況都已驗收。

此外,UPPER 是一個明確的資料轉換:你得到的是轉大寫後文字的頻率。需要保留原始大小寫或處理其他語系特殊大小寫規則時,必須重新設計去重與比較方式,不能只刪除 UPPER 就宣稱完成。

自己練習與排錯

  1. 把 B2 改成 *?~*,確認星號 2、問號 1、波浪號 1。
  2. 改成 aAa,確認只顯示 A,次數為 3。
  3. 清空 B2,確認顯示「沒有文字」,最後還原 茶茶A a*?~*。

出現 #REF! 時,清空結果下方與右側的儲存格。文字很長時,每個不同字元都會掃描整欄拆分結果,計算量會增加;本篇沒有測得大型語料的效能上限,不建議直接拿整本書當第一個練習。

本文改寫自方格子的字頻統計案例,換成自製文字並補上符號與文字單位限制。想拆解每一步,可搭配 MID 與 LEN、SEQUENCE 數列、LAMBDA 實戰。

分享:
#文字處理#字頻#MAP
喜特先生 Mr. Sheet

喜特先生 Mr. Sheet

數據分析師/商業分析師

八年工作經驗,跨不同業界解決數據需求。做過的案例都整理在作品集。

接下來可以

相關文章

查看所有文章

留言討論

共 0 則留言

訂閱電子報,新文章上線就通知你

免費,隨時可取消。

送出即表示同意服務條款與隱私權政策。