Path: blob/master/site/ja/tutorials/load_data/unicode.ipynb
37863 views
Copyright 2018 The TensorFlow Authors.
Note: これらのドキュメントは私たちTensorFlowコミュニティが翻訳したものです。コミュニティによる 翻訳はベストエフォートであるため、この翻訳が正確であることや英語の公式ドキュメントの 最新の状態を反映したものであることを保証することはできません。 この翻訳の品質を向上させるためのご意見をお持ちの方は、GitHubリポジトリtensorflow/docsにプルリクエストをお送りください。 コミュニティによる翻訳やレビューに参加していただける方は、 [email protected] メーリングリストにご連絡ください。
はじめに
自然言語モデルは、しばしば異なる文字セットを使った異なる言語を扱います。 Unicodeは、ほぼすべての言語で文字表示に使われている標準的なエンコードの仕組みです。各文字は、0 から0x10FFFFまでの一意の整数の コードポイント(符号位置) を使ってエンコードされます。1つの Unicode文字列は、ゼロ個以上のコードポイントのシーケンスです。
このチュートリアルでは、TensorFlow での Unicode文字列の表現方法と、どうやって Unicode で標準的な文字列操作と同様の操作を行うかについて示します。また、スクリプト検出にもとづいて Unicode 文字列をトークンに分解します。
tf.string データ型
標準的な TensorFlow のtf.string型は、バイト列のテンソルを作ります。また、Unicode文字列はデフォルトでは utf-8 でエンコードされます。
バイト列が最小限の単位として扱われるため、tf.string 型のテンソルは可変長のバイト文字列を保持できます。また、文字列長はテンソルの次元には含まれません。
注 : Pythonを使って文字列を構成するとき、v2.x系とv3.x系では Unicode の扱いが異なります。v2.x系では、Unicode文字列は上記のようにプレフィックス "u" で明示します。v3.x系では、デフォルトで Unicode としてエンコードされます。
Unicode 表現
TensorFlow での Unicode文字列表現は、2つの標準的な方法があります:
stringスカラー — コードポイントのシーケンスは既知の 文字符合化方式 でエンコードされるint32ベクトル — 各文字には単一のコードポイントが入る
たとえば、以下3つはすべて Unicode文字列 "语言処理 "(中国語で「言語処理」を意味します)を表します。
Unicode 表現間の変換
TensorFlowでは、これらの異なる Unicode 表現間で変換する方法を用意しています。
tf.strings.unicode_decode:エンコードされた文字列スカラーを、コードポイントのベクトルに変換します。tf.strings.unicode_encode:コードポイントのベクトルを、エンコードされた文字列スカラーに変換します。tf.strings.unicode_transcode:エンコードされた文字列スカラーを、別の文字コードに再エンコードします。
バッチの次元
複数の文字列をデコードする場合、各文字列の文字数が等しくない場合があります。返される結果はtf.RaggedTensorであり、最も内側の次元の長さは各文字列の文字数によって異なります。:
この tf.RaggedTensor を直接使用することも、tf.RaggedTensor.to_tensor メソッドを使ってパディングを追加した密な tf.Tensor に変換するか、あるいは tf.RaggedTensor.to_sparse メソッドを使って tf.SparseTensor に変換することもできます。
同じ長さの複数の文字列をエンコードする場合、tf.Tensor を入力値として使用できます。
可変長の複数の文字列をエンコードする場合、tf.RaggedTensor を入力値として使用する必要があります。
パディングされた、あるいはスパースな複数の文字列を含むテンソルがある場合は、unicode_encode を呼び出す前に tf.RaggedTensor に変換します。
Unicode 操作
文字列長
tf.strings.length は、文字列長をどう計算するかを示す unit パラメーターが使えます。unit のデフォルトは "BYTE" ですが、"UTF8_CHAR" や "UTF16_CHAR" など他の値に設定して、エンコードされた string 文字列のUnicodeコードポイントの数を決めることができます。
部分文字列
同様に、 tf.strings.substr では " unit" パラメーターを使い、かつ "pos" および "len" パラメーターを指定することで、オフセットの種類を決めることができます。
Unicode文字列を分割する
tf.strings.unicode_split は、Unicode文字列を個々の文字に分割します。
文字のバイトオフセット
tf.strings.unicode_decode によって生成された文字テンソルを元の文字列に戻すには、各文字の開始位置のオフセットを知ることが役立ちます。tf.strings.unicode_decode_with_offsetsメソッド は unicode_decode に似ていますが、各文字の開始オフセットを含む2番目のテンソルを返す点が異なります。
Unicode スクリプト
各Unicodeコードポイントは、スクリプト として知られる単一のコードポイント集合に属しています。文字スクリプトは、その文字がどの言語なのかを判断するのに役立ちます。たとえば、「Б」がキリル文字であることがわかれば、その文字を含むテキストはロシア語やウクライナ語などのスラブ言語である可能性が高いことがわかります。
TensorFlowは、あるコードポイントがどのスクリプトかを返す tf.strings.unicode_script を提供しています。戻り値のスクリプトコードは、International Components for Unicode (ICU) の UScriptCode に対応する int32 値になります。
tf.strings.unicode_script は、多次元のコードポイントの tf.Tensors や tf.RaggedTensor にも適用できます。:
例:シンプルなセグメンテーション
セグメンテーションは、テキストを単語のような粒度に分割するタスクです。これは、スペース文字を使用して単語を区切れる場合には簡単に行えますが、一部の言語(中国語や日本語など)はスペースを使いませんし、また、一部の言語(ドイツ語など)には、意味を解析するために分ける必要がある、単語を結合した長い複合語があります。Webテキストでは、「NY株価」(ニューヨーク株価)のように、異なる言語とスクリプトがしばしば混在しています。
単語の境界を推定してスクリプトを変更することにより、(MLモデルを実装せずに)非常に大まかなセグメンテーションを実行できます。これは、上記の「NY株価」の例のような文字列に対して機能します。さまざまな言語のスペース文字はすべて、実際のテキストとは異なる特別なスクリプトコードである USCRIPT_COMMON として分類されるため、スペースを使用するほとんどの言語でも機能します。
最初に、文章を文字ごとのコードポイントにデコードし、それから各文字のスクリプトコード(識別子)を調べます。
次に、これらのスクリプトコードを使って、単語の境界を追加すべき場所を決めます。前の文字とスクリプトコードが異なるそれぞれの文字の先頭に、単語の境界を追加します。:
そして、これらの目印(開始オフセット)を使って、各単語ごとの文字リストを含む RaggedTensor を作成します。:
最後に、RaggedTensor をコードポイント単位でセグメント化して、文章に戻します。:
最終的な結果を見やすくするために、UTF-8文字列にエンコードします。:
View on TensorFlow.org
Run in Google Colab
View source on GitHub
Download notebook