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

Rの解析に役に立つ記事
スポンサーリンク

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")

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

タイトルとURLをコピーしました