見出し画像

テキスト分析の大通り#22: TeradataでのUnicode正規化、NFKC

補足その3。あるって知らなかったよ。
テキスト分析において、文字の全角半角の統一をしていく際、Unicode正規化を行います。その際によく使われるオプションがNFKC(詳細は割愛、以下参照)ですが、これがTeradataのデータベース関数にもあることを知り、どんな動きか見てみました。

まずは以下にテストデータとSQLを。追って補足を加えます。

確認したかったことは以下です。

  • 大文字・ダブルバイトの英語と数字が半角・シングルバイトに変換されるか

  • 半角のカタカナと最低限の記号が全角に変換されるか

  • 通常の文字と濁音記号、半濁音記号が隣り合わせで発生した文字列を入力した際に、単一の濁音文字、半濁音文字に変換されるか
    (組み合わせは通常文字自体の全角・半角と、濁音・半濁音記号の全角・半角があるため4パターンとなる)

  • 上記の処理を通常の文字と濁音文字含めた形で実施した際におかしな挙動を起こさないか。例えば「あ゜」のような文字列の並びを単一の文字に変換してしまわないか

ということで用意したデータが上述のファイルです。ひらがな、カタカナ、英字、数字、最低限の記号データを用意しました。「文字」の列を適時加工しながら関数に投入することによる変換を見ていくことにします。

なお、ノートブック内の最初に記載されているデータロード関連の記述は、放っておいてください。Jupyter Labのノートブック拡張でTeradataへSQLを投げたり、データ操作できるカーネルがあるため、そちらを使ってデータロードをした際のコマンドです。機会があればまた別途ご紹介します。


確認1: 単独文字

単独の文字を投入したら、どのような挙動を示すかを確認します。単純に列「文字」を関数に入れ、わかりやすくするために変化があれば1、なければ0を表示する列を「変換」として出力します。関数はtranslateという関数で、Unicode内での変換、モードとしてNFKCを選択するパラメーターはunicode_to_unicode_nfkcとなります。
見ると、全角のひらがなは変換されず、半角記号は全角に寄せられ、半角カタカナは全角に寄せられ、全角カタカナはそのまま、全角数字、全角英字は大文字小文字ともに半角に寄せられます。期待通りの動きです。
不思議な動きなのが、濁音・半濁音の記号で、どちらかに寄せられるのではなく、どちらも違う「何か」に変換されています。


確認2: 濁音と半濁音

続いて日本語文字に絞り(英数字を除き)、これらの次に濁音・半濁音が続く文字列を関数に入れた際の動きを見ます。172行までの日本語文字を片側に、173から176行目の濁音・半濁音記号(全角と半角)をもう片側にしてクロスジョインさせ、総当たりのデータで文字と濁音・半濁音記号のデータの並びを作成し、これを関数に突っ込みます。そしてこれが濁音、半濁音であれば1文字のデータになるはずなので、文字数をカウントする列を用意します(文字数)。

結果を見ていくと、どんな文字列であれ全角の濁音・半濁音をセットした場合、文字の統合はなされず、なぜか3文字になることがわかります。どういうことなのかは分かりませんが、うまくは行ってないですね。そして全角・半角の文字と半角の濁音記号で適切でない組み合わせの場合(「あ」に半角の濁音記号)、2文字になっており、文字の統合はされないことがわかります。これは一安心。ただし、表示としておかしな表記の文字もどきに見えるのが気持ち悪いです。そして適切な組み合わせ(う、さしすせそ、たちつてと等)は1文字に統合されていることがわかります。きちんとしているようです。


確認3: 全角の濁音と半濁音をあらかじめ置換しておく

上記の確認2で気になる部分は全角文字と全角の濁音・半濁音記号の組み合わせだけだったので、これらに関してはあらかじめ半角の記号に置換しておき、そのうえでこの関数を利用すれば期待する挙動になるのではと思い確認3を実施しました。結果は期待通り。


ということで、最後に記載したように、以下のような前処理で、ある程度の正規化はできるのではないかと思います。

lower(translate(oreplace(oreplace(入力列,'゛','゙'),'゜','゚') using unicode_to_unicode_nfkc)) as 出力列名,


一応処理の説明をすると、内側から以下の通りです: 

  • 入力の文字列名が「入力列」

  • oreplaceで全角濁音記号を半角濁音記号に置換

  • oreplaceで全角半濁音記号を半角半濁音記号に置換

  • translateでUnicode正規化

  • lowerで英語の大文字を小文字に統一

こまかな記号系のパターンは試せていませんが、個人的な経験で言うと、テキスト処理上記号のほとんどはどのみち削除してしまいます。なので、その意味ではここまでできれば十分使えるかなと思いました。

///

#analytics #unicode正規化 #nfkc #形態素解析 #text #nlp #データ #分析 #teradata #sql


この記事が気に入ったらサポートをしてみませんか?