本文へスキップ
からだにいいもの

Rのトピックスを中心に『まだ、まだ、知らない、役に立つ情報?』を発信します。

Rで解析:Unicodeを扱う「Unicode」パッケージ

Unicode パッケージは Unicode 16.0.0 のデータセットと、それを R から簡便に扱うためのユーティリティ群を提供します。文字コードの変換、大文字小文字の正規化、スクリプト・ブロックの取得、名前検索など、テキスト処理で頻出する作業を簡単に実行できるのが特徴です。

パッケージバージョンは16.0.0-1。実行コマンドはR version 4.5.0で確認しています。

パッケージのインストール

下記、コマンドを実行してください。

install.packages("Unicode")   # CRAN からインストール
スポンサーリンク

主要機能ハイライト

分類主な関数目的
Unicode 文字の大文字・小文字変換u_to_lower_case() / u_to_upper_case() / u_to_title_case() / u_case_fold()デフォルトの Unicode アルゴリズムによるケースマッピングを実施。
コードポイント数の計算n_of_u_chars()文字列やコードレンジ中のコードポイント数を返す。
簡易トークナイザUnicode_alphabetic_tokenizer()アルファベットプロパティを使った単語分割。
ブロック / スクリプト情報u_blocks() / u_scripts()指定したブロック・スクリプトのコードレンジを取得。
文字プロパティ・メタ情報u_char_info() / u_char_properties() / u_char_property()コードポイントの詳細プロパティをデータフレームで取得。
文字名・検索u_char_name() / u_char_from_name() / u_char_label()文字名からコードポイントを引く、逆引きなど。
マッチング・包含判定u_char_match() / %uin%文字がレンジに含まれるか判定。

実行コマンド

詳細はコメント、パッケージのヘルプを確認してください。

まずは、パッケージを読み込みます。

# パッケージの読み込み
library("Unicode")

1 小文字・大文字・タイトルケース

LETTERS                        # ベースライン
"A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z"

u_to_lower_case(LETTERS)       # 小文字化
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"

u_to_upper_case("heiss")        # 大文字化
[1] "HEISS"

u_case_fold() を使えば case‑folding(言語依存しない大小一致判定用の正規化)を行えます。

u_case_fold("Hi Dave.")
"hi dave."

なお、Unicode パッケージ単体では全角半角変換を直接提供しませんが、マッピング後に stringi::stri_trans_nfkc() と組み合わせることで正規化パイプラインを構築できます。

2. コードポイント数を数える

latn_cyrl <- u_scripts(c("Latn", "Cyrl"))    # ラテン・キリル
# 内容確認
latn_cyrl 
$Latin
 [1] U+0041..U+005A   U+0061..U+007A   U+00AA           U+00BA           U+00C0..U+00D6  
 [6] U+00D8..U+00F6   U+00F8..U+01BA   U+01BB           U+01BC..U+01BF   U+01C0..U+01C3  
[11] U+01C4..U+0293   U+0294           U+0295..U+02AF   U+02B0..U+02B8   U+02E0..U+02E4  
[16] U+1D00..U+1D25   U+1D2C..U+1D5C   U+1D62..U+1D65   U+1D6B..U+1D77   U+1D79..U+1D9A  
[21] U+1D9B..U+1DBE   U+1E00..U+1EFF   U+2071           U+207F           U+2090..U+209C  
[26] U+212A..U+212B   U+2132           U+214E           U+2160..U+2182   U+2183..U+2184  
[31] U+2185..U+2188   U+2C60..U+2C7B   U+2C7C..U+2C7D   U+2C7E..U+2C7F   U+A722..U+A76F  
[36] U+A770           U+A771..U+A787   U+A78B..U+A78E   U+A78F           U+A790..U+A7CD  
[41] U+A7D0..U+A7D1   U+A7D3           U+A7D5..U+A7DC   U+A7F2..U+A7F4   U+A7F5..U+A7F6  
[46] U+A7F7           U+A7F8..U+A7F9   U+A7FA           U+A7FB..U+A7FF   U+AB30..U+AB5A  
[51] U+AB5C..U+AB5F   U+AB60..U+AB64   U+AB66..U+AB68   U+AB69           U+FB00..U+FB06  
[56] U+FF21..U+FF3A   U+FF41..U+FF5A   U+10780..U+10785 U+10787..U+107B0 U+107B2..U+107BA
[61] U+1DF00..U+1DF09 U+1DF0A          U+1DF0B..U+1DF1E U+1DF25..U+1DF2A

$Cyrillic
 [1] U+0400..U+0481   U+0482           U+0483..U+0484   U+0487           U+0488..U+0489  
 [6] U+048A..U+052F   U+1C80..U+1C8A   U+1D2B           U+1D78           U+2DE0..U+2DFF  
[11] U+A640..U+A66D   U+A66E           U+A66F           U+A670..U+A672   U+A673          
[16] U+A674..U+A67D   U+A67E           U+A67F           U+A680..U+A69B   U+A69C..U+A69D  
[21] U+A69E..U+A69F   U+FE2E..U+FE2F   U+1E030..U+1E06D U+1E08F

lapply(latn_cyrl, n_of_u_chars)                # 各レンジ内の文字数
$Latin
 [1]  26  26   1   1  23  31 195   1   4   4 208   1  27   9   5  38  49   4  13  34  36 256   1
[24]   1  13   2   1   1  35   2   4  28   2   2  78   1  23   4   1  62   2   1   8   3   2   1
[47]   2   1   5  43   4   5   3   1   7  26  26   6  42   9  10   1  20   6

$Cyrillic
 [1] 130   1   2   1   2 166  11   1   1  32  46   1   1   3   1  10   1   1  28   2   2   2  62
[24]   1

3. Unicode ブロックとスクリプト

## ブロック一覧を取得
blocks <- u_blocks()

length(blocks)        # ブロック数
[1] 338

names(blocks)[1:10]   # 先頭10ブロック名
 [1] "Adlam"                          "Aegean Numbers"                
 [3] "Ahom"                           "Alchemical Symbols"            
 [5] "Alphabetic Presentation Forms"  "Anatolian Hieroglyphs"         
 [7] "Ancient Greek Musical Notation" "Ancient Greek Numbers"         
 [9] "Ancient Symbols"                "Arabic"  

## 特定ブロックをフィルタ
kana <- u_blocks("Katakana")
str(kana)

4. 文字情報を深掘りする

## Euro Sign (U+20AC) が Unicode に追加されたバージョンを確認
x <- u_char_from_name("EURO SIGN")
u_char_property(x, "Age")  #=> "2.1"

## プロパティ一覧
head(u_char_properties())

u_char_info() は主要 15 プロパティを含むデータフレームを返すため、dplyr と組み合わせた集計が便利です。

5. 名前検索と正規表現

名前ベースの検索は「絵文字一覧を抜き出したい」「特定の通貨シンボルを収集したい」という場合に大変便利です。

## "DIGIT ONE" を名前に含む全コードポイントを取得
ones <- u_char_from_name("\\bDIGIT ONE\\b", type = "grep")
head(u_char_name(ones))

6. 可視化デモ:スクリプトごとの文字数のランキング

# tidyverseパッケージの読み込み
# tidyverseパッケージがなければインストール
if(!require("tidyverse", quietly = TRUE)){
  install.packages("tidyverse");require("tidyverse")
}

script_sizes <- lapply(u_scripts(), function(rng) sum(n_of_u_chars(rng)))
script_df <- data.frame(script = names(script_sizes), n = unlist(script_sizes))
script_df <- script_df |> arrange(desc(n))

# 上位 15 スクリプトを棒グラフ
script_df |> slice_head(n = 15) |> 
  ggplot(aes(reorder(script, n), n)) +
  geom_col() +
  coord_flip() +
  labs(x = "Script", y = "Code Points", title = "Top 15 Unicode Scripts by Code‑Point Count")

少しでも、あなたの解析が楽になりますように!!

スポンサーリンク
Prices and shipping availability may change. Please refer to the product page at time of purchase.
Content displayed on this site is provided by Amazon and may be updated or removed.
Amazon Associate, karada-good earns income through qualifying sales.