正規化

コンピュータサイエンスにおいて、正規化標準化または正規化とも呼ばれる)とは、複数の表現が可能なデータを「標準」、「正規」、あるいは正準形式に変換するプロセスです。これは、異なる表現の同等性を比較したり、異なるデータ構造の数を数えたり、繰り返し計算を排除することで様々なアルゴリズムの効率を向上させたり、意味のあるソート順序を適用したりするために行われます。

使用例

ファイル名

ファイルシステム内のファイルは、ほとんどの場合、複数のファイル名でアクセスできます。例えば、Unix系システムでは、文字列「/./」は「 」に置き換えられます/。C標準ライブラリでは、関数がrealpath()この処理を実行します。この関数は、ファイル名を正規化するために、親ディレクトリを参照するコンポーネントの処理、複数のスラッシュのシーケンスの簡素化、末尾のスラッシュの削除、シンボリックリンク/..の解決などの操作も実行します。

ファイル名の正規化はコンピュータセキュリティにとって重要です。例えば、Webサーバーには、cgiディレクトリ以下のファイルのみC:\inetpub\wwwroot\cgi-bin実行できるという制限があるかもしれません。このルールは、パスが で始まっているC:\inetpub\wwwroot\cgi-bin\かどうかを確認し、そのパスで始まっている場合にのみ実行することで適用されます。ファイルはC:\inetpub\wwwroot\cgi-bin\..\..\..\Windows\System32\cmd.exe最初はcgiディレクトリにあるように見えますが、..パス指定子を悪用してディレクトリ階層を遡り、 外にあるファイルを実行しようとしますcgi-bincmd.exeファイル名を最も単純な表現である に正規化していないために実行を許可するとエラーが発生し、ディレクトリトラバーサルC:\Windows\System32\cmd.exe脆弱性と呼ばれます。パスが正規化されているため、このファイルは実行すべきではないことは明らかです。

ユニコード

Unicodeでは、多くのアクセント付き文字を複数の方法で表現できます。たとえば、é はUnicode では Unicode 文字 U+0065 (ラテン小文字 E) に文字 U+0301 (結合アキュートアクセント) を続けて表現できますが、合成文字 U+00E9 (アキュート付きラテン小文字 E) として表現することもできます。この場合、このようなグリフを含む文字列のあらゆる表現を考慮する必要があるため、文字列の比較はより複雑になります。これを処理するために、Unicode は正規化のメカニズムを提供します。この文脈では、正規化はUnicode 正規化です。

Unicode 標準、特にUTF-8の可変幅エンコードでは、状況によっては正規化がさらに必要になる場合があります。つまり、標準では UTF-8 では Unicode 文字に対して有効なバイト シーケンスが 1 つしかありません[ 1 ]が、一部のバイト シーケンスは無効です。つまり、Unicode 文字列を UTF-8 にエンコードしても取得できないバイト シーケンスです。一部のずさんなデコーダー実装では、無効なバイト シーケンスを入力として受け入れ、そのようなシーケンスに対して有効な Unicode 文字を出力として生成する場合があります。このようなデコーダーを使用すると、一部の Unicode 文字は実質的に複数の対応するバイト シーケンス (有効なバイト シーケンスと無効なバイト シーケンス) を持つことになります。これにより、前のセクションで説明したものと同様のセキュリティの問題が発生する可能性があります。したがって、無効なバイト シーケンスを許可するデコーダーに渡す UTF-8 文字列に何らかのフィルター (UTF-8 で記述された正規表現など) を適用する場合は、フィルターに渡す前に文字列を正規化する必要があります。この文脈において、正規化とは、文字列のすべての文字を単一の有効なバイトシーケンスに変換するプロセスを指します。正規化の代わりに、無効なバイトシーケンスを含む文字列を拒否する方法もあります。

URL

正規URLは、重複コンテンツ唯一の信頼できるソースを定義するためのURLです。

Googleによる使用

正規URLとは、サイト上の重複ページ群の中でGoogleが最も代表的だと判断したページのURLです。例えば、同じページに「」や「」といったURLが複数ある場合、https://example.com/?dress=1234Googlehttps://example.com/dresses/1234はそのうちの1つを正規URLとして選択します。なお、ページが完全に同一である必要はありません。リストページの並べ替えやフィルタリングに若干の変更を加えても、ページが一意になるわけではありません(例:価格で並べ替えたり、アイテムの色でフィルタリングしたりする)。

正規形は重複形とは異なるドメインに存在する可能性がある。[ 2 ]

インターネット

正規 URL の助けにより、検索エンジンはクエリ結果にどのリンクを提供すべきかを認識します。

正規リンク要素は正規 URL を定義するために使用できます。

イントラネット

イントラネットでは、情報の検索は主に手動で行われます。この場合、正規URLは機械可読ではない形式でも定義できます。例えば、ガイドラインなどです。

その他

正規 URL は通常、共有アクションに使用される URL です。

正規 URL は検索エンジンの検索結果で使用されるため、ほとんどの場合、ランディング ページになります。

検索エンジンとSEO

ウェブ検索と検索エンジン最適化(SEO)において、URL正規化は複数のURLが存在するウェブコンテンツを扱います。同じウェブコンテンツに複数のURLが存在すると、検索エンジンにとって問題が発生する可能性があります。特に、検索結果にどのURLを表示すべきかを判断する際に問題となります。[ 3 ]ほとんどの検索エンジンは、どのURLを正しいバージョンとして扱うべきかを示すヒントとして、 Canonicalリンク要素をサポートしています。Googleのジョン・ミューラー氏が指摘しているように、 robots noindex要素のような他の指示がページ内に存在すると、検索エンジンに正規化の処理方法に関する矛盾したシグナルを与える可能性があります。[ 4 ]

例:

これらの URL はすべて Wikipedia のホームページを指していますが、検索エンジンはそのうちの 1 つだけを URL の正規形式であると見なします。

XML

正規XML文書とは、定義上、正規XML仕様で定義されたXML正規形式に準拠したXML文書です。簡単に言うと、正規化とは、タグ内の空白を削除し、特定の文字エンコーディングを使用し、名前空間参照をソートして冗長なものを排除し、XMLおよびDOCTYPE宣言を削除し、相対URIを絶対URIに変換することです。

簡単な例として、次の 2 つの XML スニペットが挙げられます。

  1. <node1 x='1' a="1" a="2">Data</node1    > <node2>Data</node2>
  2. <node1 a="2" x="1">Data</node1> <node2>Data</node2>

最初の例では、最初のノードの終了タグに余分なスペースが含まれています。2番目の例は正規化されており、これらのスペースは削除されています。W3C正規化では、タグ内のスペースのみが削除され、タグ間のスペースは削除されないことに注意してください。

正規化の変更の完全な概要を以下に示します。

  • 文書はUTF-8でエンコードされています
  • 入力時に改行を解析前に #xA に正規化する
  • 属性値は、検証プロセッサによって正規化される。
  • 文字および解析済み実体参照は置き換えられる
  • CDATAセクションは文字コンテンツに置き換えられます
  • XML宣言と文書型宣言は削除されました
  • 空要素は開始タグと終了タグのペアに変換されます
  • 文書要素の外側と開始タグと終了タグ内の空白は正規化されます
  • 文字コンテンツ内のすべての空白は保持されます(改行正規化中に削除された文字を除く)
  • 属性値の区切り文字は引用符(二重引用符)に設定されます
  • 属性値と文字内容内の特殊文字は文字参照に置き換えられます
  • 各要素から余分な名前空間宣言が削除される
  • 各要素にデフォルトの属性が追加されます
  • xml:base属性の修正が実行される
  • 各要素の名前空間宣言と属性には辞書式順序が課される

計算言語学

形態論辞書学において、レンマとは単語の集合の標準的な形式です。例えば英語では、runrunsranrunning は同じ語彙素の形式であるため、それらのいずれか(例えばrun)を選択してすべての形式を表すことができます。Unitexなどの語彙データベースではこの種の表現が使用されています。

レンマ化とは、単語をその標準的な形式に変換するプロセスです。

参照

参考文献