Yoshi Nishikawa Blog

医学となにかのインタラクティブ

Rで表記ゆれを癒やす:全角から半角へ

日本語データを扱うときに困ること

日本語データを分析するときにもっとも困ることは何でしょうか?

それは、表記ゆれです。

送り仮名、漢字かな混じり、全角半角混じり、大文字小文字混じり・・・色々ありますが、

今回は、特に、全角と半角が混ざった表記ゆれについて考えていきます。

日本語には、全角と半角の文字が存在します。歴史を紐解くとわかるもので、

ウィキペディア にも詳しいのですが、東アジアの印刷物は、もともと文字が正方形に収まるように作られていました。

コンピュータが出現し、文字が扱えるようになり、はじめは、すべての文字が同じ幅の文字として用いられていました。

その後、東アジアの文字は、1文字を表すのに2バイト以上を用いる「マルチバイト文字」によって利用が可能となりました。

これ自体は、アルファベットが、漢字などよりも細く印刷される伝統によく合っています。

しかし、解析を行う上で、、Dr、Dr.、など、全角アルファベットや全角数字でタイプされた日本語情報を扱う場合には、半角アルファベットや半角数字と同じと認識してくれません。

このような表記ゆれに対する対処は、以下のブログにとてもまとまっていて、参考にさせてもらいました。

Rで全角英数記号を半角にするのに{stringi}が役に立った話 - Note of Pediatric Surgery

Nippon package

まず、全角半角ごちゃごちゃのデータを準備します。

 data <- c("BOYON", "boyon", "ボヨーン")
library(Nippon)
zen2han(data)

まずは、もともとpackageとして入っていたNipponを用いてみます。

[1] "BOYONboyonボヨーン"

zen2hanではうまくいかない・・・
すべて連続する文字列として処理されてしまい、データフレーム全体を調整するには適していない模様です。

三重大学谷村先生のスライドを見ていると・・・

library(Nippon)
sanitizeZenkaku(data)
[1] "BOYON"   "boyon"   "ボヨ-ン"

sanitizeZenkakuでいけました!!

ただ、これだと

伸ばし棒までsanitizeされてハイフンになってしまいます。。

halfwidthen

Rcppで全角英数を半角英数に変換するパッケージをつくった - Technically, technophobic.

こちらを参考にして、githubからpackageをインストールしまして・・・

library(devtools)
install_github("yutannihilation/halfwidthr")

library(halfwidthr)
halfwidthen(data)
[1] "BOYON"    "boyon"    "ボヨーン"

これでうまくいきました!

いまのところこちらが使い勝手がよいので、
当面はhalfwidthenを使用させていただきます。

stringrには実装されないかな・・・(他力本願)