著者:Swetha Kannan
原文:https://www.knime.com/blog/how-to-find-remove-invisible-unicode-characters
不可視文字は、データクリーニングにおいて最も厄介な問題の一つです。テキストデータの中に潜むこれらの文字は、目には見えませんが、データのインポートを失敗させたり、検索機能を阻害したり、さらには分析結果を密かに台無しにしたりするほどの強力な悪影響を及ぼします。
これらの隠れた文字は、メール、Webサイト、スプレッドシート、AIが生成したテキスト、あるいはAPIなどからデータをコピー&ペーストしたときにいつの間にか紛れ込みます。コピー元のデータに含まれていた「フォーマット指示(文字の配置などを制御する情報)」を表す見えないUnicode文字が、そのままデータに引き継がれてしまうのです。その結果、データインポートのエラー、検索の不一致、並べ替え(ソート)の乱れ、フィルターの機能不全などが引き起こされます。しかも、多くの場合、エラーメッセージには具体的な原因が示されません。
一番厄介なのは、問題が文字通り目に見えないため、その原因を探すのに何時間も無駄にしてしまう可能性がある点です
本ガイドでは、目に見えないUnicode文字とは何か、代表的な種類はどのようなものかについて解説し、KNIMEを使用してそれらを見つけ出し、削除する手順を説明します。
目次
Unicode文字とは、業界標準である「Unicode標準(Unicode Standard)」に準拠した文字のことです。この標準では、プラットフォーム、プログラム、言語を問わず、あらゆる文字に固有の番号(コードポイント)が割り当てられています。これにより、コンピューターや様々なデバイス上で、異なる言語や記述システムのテキストを一貫して表現・処理できるようになります。つまり、この世のあらゆるテキストはUnicodeによってエンコード(符号化)され、処理することが可能です。
例えば、タミル語の文字「a」は「அ」と表記されます。このタミル文字のUnicodeコードポイントは「U+0B85」です。
Unicodeで数字の前につく「U+」という表記は、それに続く数字が16進数フォーマットであることを示しています。Unicodeのコードポイントは、それぞれの文字、記号、絵文字に割り当てられた固有の識別番号です。このコードがあるおかげで、異なるコンピューター、プログラム、プログラミング言語の間でも、文字がまったく同じように理解され、使用されることが保証されます。16進数表現が広く使われているのは、大きな数字を人間が読みやすい短い文字列に収めることができるためです。
Unicodeには、文字の一般的な特性に基づいた様々なカテゴリやクラスが存在します。これらのカテゴリは、異なる言語や表記体系の文字を分類するための標準的な方法を提供するものです。特に重要なカテゴリは以下の通りです。
| カテゴリ | 正規表現パターン | 具体例 |
|---|---|---|
| 文字 (Letter: L) | \p{L} | A, б (キリル文字), 漢 (漢字) |
| 数値 (Number: N) | \p{N} | 1, Ⅳ (ローマ数字) |
| 記号 (Symbol: S) | \p{S} | +, $, ♫ (音符), ☀️ (太陽のシンボル) |
| フォーマット (Format: Cf) | \p{Cf} | ゼロ幅スペース (U+200B), ゼロ幅接合子 (U+200D) |
これらのカテゴリは、テキスト処理(文字数のカウントや句読点の識別など)の様々な場面で役立ちます。中でも「フォーマット(Cf)」カテゴリは、まさに今回のターゲットである「見えない文字」が含まれる場所であり、データクリーニングで真っ先にきれいにすべき対象となります。
不可視のUnicode文字とは、データ内には存在するものの、視覚的には表示されない文字のことです。これらはスペースを占有し、テキストの処理方法や、データの並べ替え、検索、フィルタリングといった動作に影響を及ぼしますが、画面上では確認することができません。
こうした非表示文字には、空白文字(スペース、タブ、改行)、ゼロ幅文字(見た目上は全く空白に見えないUnicodeの空白文字)、そして画面上には表示されない制御文字などが含まれます。
目に見えないUnicode文字には様々な種類があり、それぞれ異なる役割を持っています。
一般的なものとしては、以下のような種類があります。
空白文字:
・スペース (U+0020):最も馴染みのある不可視文字で、空白を表します。
・タブ (U+0009):文字間に水平方向の空白を設けるために使用されます。
ゼロ幅文字:
・ゼロ幅スペース (U+200B):見た目上の空白は生じませんが、改行位置に影響を与えます。
・ゼロ幅接合子 (U+200D):隣接する文字を結合させる役割を果たします。
制御文字:
・キャリッジリターン (U+000D):「復帰」を意味し、カーソルを行の先頭に移動させます。
・ラインフィード (U+000A):「改行」を意味し、カーソルを次の行に進めます。
これらはしばしば、データのインポート失敗を引き起こしますが、その際のエラーメッセージでは何が問題なのか正確に特定できないことがよくあります。その結果、解決策を探すために多くの時間を費やしたにもかかわらず、結局は役に立たない不明瞭なエラーメッセージに直面することになってしまいます。
| 文字名 | コードポイント | 役割・動作 | 混入しやすい場所 |
|---|---|---|---|
| スペース | U+0020 | 単語間の通常の空白 | あらゆる場所 |
| タブ | U+0009 | 水平方向の間隔(インデント) | スプレッドシート、TSVファイル |
| ゼロ幅スペース | U+200B | 見た目は隙間なし、改行位置に影響 | Web上の文章、HTMLエディタ |
| ゼロ幅接合子 | U+200D | 隣り合う文字を不可視のまま結合 | 連続する絵文字、多言語テキスト |
| キャリッジリターン | U+000D | カーソルを行の先頭へ移動 | Windowsの改行コード、CSV |
| ラインフィード | U+000A | カーソルを次の行へ移動 | Unix/Macの改行コード |
| バイトオーダーマーク (BOM) | U+FEFF | ファイル冒頭でエンコードの種類を識別 | CSVエクスポート、UTF-8ファイル |
| ソフトハイフン | U+00AD | 不可視のハイフン(改行時のみ表示) | ワープロソフト、Webコンテンツ |
| 改行なしスペース (NBSP) | U+00A0 | 自動改行を発生させない特殊スペース | Webページ、PDF、AI生成テキスト |
見えないUnicode文字のトラブルは、かつてないほど身近になっています。主な発生源は以下の通りです。
KNIMEは、ドラッグ&ドロップ式の視覚的なインターフェースでワークフローを構築できるデータ分析・AIプラットフォームです。このプラットフォームでは、不可視文字(制御文字など)の処理について、必要な制御レベルに応じて以下の3つの方法を選択できます。
1.「String Format Manager」ノードを使用して、削除前に不可視文字を特定する
2. 「String Cleaner」ノードを使用して、正規表現を使わずに不可視文字を削除する
3. 「String Replacer」ノードを使用して、正規表現により特定の文字を対象として処理する
まずは、よくあるシナリオから見ていきましょう。
あなたがデータサイエンティストで、ExcelシートからコピーしてWebエディタに貼り付けられたデータセットを扱っているとします。Excelのエンコード(ISO-1252)とWebエディタのエンコード(UTF-8)の不一致により、いくつかの不具合に直面しました。調査の結果、原因はデータに紛れ込んだ見えないUnicode文字であることが判明します。
例えば、Excel上のデータセットが以下のような見た目だったとします。
ここでは、最初の行の説明文に意図的に不可視文字(ゼロ幅スペース)が挿入されています。これをテキストエディタにコピーした際、エンコードのミスマッチにより、見えない文字が以下のように不正な形で表面化してしまいます。
不可視文字を扱う上で最も難しいのは、「本当にそこに存在するかどうか」を確認することです。これを解決するのが「String Format Manager」ノードです。このノードは、元のデータを書き換えることなく、文字列カラムに表示用のフォーマットを適用します。設定を行うと、改行、キャリッジリターン、タブ、改行なしスペースなどの非印刷文字の場所に、プレースホルダーとなる代替シンボル(記号)をテーブルビュー(Table View)上に直接表示してくれます。
これにより、他のツールに切り替えることなく、KNIME上でデータを見ながら見えない文字がどこに隠れているかを視覚的に検査できます。
設定は簡単です:String Format Managerノードをデータに接続し、検査したい文字列カラムを選択して、「非印刷文字を記号として表示する」オプションにチェックを入れるだけです。出力されるテーブルの構造はそのままに、見えない文字がある場所に視覚的なプレースホルダーが表示されます。
正規表現のコードを書くのは避けたい場合は、「String Cleaner」ノードを使用することで、シンプルな設定ダイアログから不可視文字を削除できます。このノードでは、以下の処理が可能です。
・特殊な配列の削除: アクセント記号、発音区別符号、非ASCII文字、非印刷文字の除去
・特定文字の削除: アルファベット、数字、句読点、記号、絵文字、または任意のカスタム文字の個別削除
・空白(スペース)の整理: すべての空白、文頭・文末の空白、または重複している無駄な空白の削除
・改行と特殊な空白の処理: 改行コードの維持、通常のスペースへの置換、または完全な削除の選択
・大文字・小文字の変換とパディング: すべて大文字・小文字への統一、頭文字のみ大文字化、最小文字数に応じた文字埋め(パディング)
使い方は非常にシンプルです:String Cleanerノードをデータに接続して対象のカラムを選択し、「Remove non-printable characters(非印刷文字の削除)」と「Remove special whitespace(特殊な空白の削除、または必要に応じて標準スペースへの置換)」を有効にするだけです。既存のカラムの中身を直接上書きするか、新しいカラムを作成して出力するかを選べます。
対象とする文字をさらに細かく制御・狙い撃ちしたい場合は、正規表現パターンが使える「String Replacer」ノードが効果的です。
ステップ 1:String Replacerノードをデータセットに接続する
String Replacerノードを配置し、設定ウィンドウを開きます。
ステップ 2:対象のカラムを選択する
見えないUnicode文字が含まれているカラムを選択します。今回の例では「Description」というカラムを指定します。
ステップ 3:ステップ3:パターンタイプとして「正規表現」を選択する
String Replacer(文字列置換)では、Literal(完全一致)、Wildcard(*や?を使った柔軟な一致)、Regular expression(正規表現)の3つのパターンタイプから選択できます。ここでは「Regular expression」を選択します。これにより、Unicodeのカテゴリパターンを使って、すべての見えない文字を一度にまとめて指定できるようになります。
ステップ 4:パターンに「\p{Cf}」と入力する
ここが最も重要なポイントです。\p{Cf} というパターンは、Unicodeの書式(Format)カテゴリに属するすべての文字に一致します。これには、ゼロ幅スペース、ゼロ幅接合子、その他すべての隠れたフォーマット指示文字が含まれます。
検索パターンに \p{Cf} を入力し、置換テキスト(Replacement text)の欄は空欄のままにします。※正しく動作したかテストしたい場合は、一時的に「SUCCESS」などの分かりやすい文字列を入力して正しく処理されたことを確認します。
ステップ 5:出力用の新しい列を作成する
「新しい列を追加(Append new column)」のチェックボックスをオンにすると、データセットに新しい列が作成されます。この新しい列には、不可視文字が削除・置換された「クリーンアップ済み」のテキストが格納されます。新しい列の名前は「Replacement」となります。
以上です!
どの方法を使うべきか迷っていますか?
KNIMEには、ユーザーの自然言語による指示に基づいてビジュアルワークフローを自動構築してくれるAIアシスタント「K-AI」が搭載されています。「テキストデータから見えないUnicode文字を削除するにはどうすればいいですか?」とチャット形式で質問(プロンプト)を投げ、K-AIのアドバイスに従ってString Manipulationノードなどを配置・設定するだけで、理想通りの結果を瞬時に得ることができます。
見えない文字はデータ前処理における共通の頭痛の種ですが、もう作業の足を引っ張られる必要はありません。KNIMEがあれば、以下のシンプルなアプローチで解決します。
あなたのデータ状況に最も適したアプローチを選択し、本来の重要なデータ分析業務へと戻りましょう!
Excelや社内システム、外部APIから集まるデータの表記揺れや「見えない文字」の混入にお悩みではありませんか?KNIMEを活用した効率的なデータパイプラインの自動化や、前処理業務の大幅なスピードアップ、データガバナンスの強化についてのご相談・デモンストレーションのご要望など、お気軽にお問い合わせください。
このサイトでは、クッキー (cookie)などの技術を使用して取得したアクセス情報等のユーザ情報を取得しております。
この表示を閉じる場合、プライバシーポリシーに同意いただきますよう、お願いいたします。