このトピックでは、DataWorksのPyODPSノードを使用して、オープンソースのセグメンテーションツールJiebaに基づいてデータテーブル内の中国語テキストをセグメント化し、セグメント化された単語やフレーズを新しいテーブルに書き込む方法について説明します。 このトピックでは、クロージャ関数を使用してカスタム辞書に基づいて中国語テキストをセグメント化する方法についても説明します。
前提条件
DataWorksワークスペースが作成され、MaxCompute計算エンジンがワークスペースに関連付けられます。 ワークスペースを作成する方法の詳細は、「ワークスペースの作成」をご参照ください。
背景情報
DataWorksはPyODPSノードを提供します。 DataWorksのPyODPSノードでPythonコードを編集し、MaxCompute SDK for Pythonを使用できます。 DataWorksのPyODPSノードには、PyODPS2ノードとPyODPS3ノードがあります。 PyODPS 3ノードの使用を推奨します。 詳細については、「PyODPS 3タスクの開発」をご参照ください。
このトピックのサンプルコードは参考用です。 本番環境ではコードを使用しないことを推奨します。
準備: オープンソースのJiebaパッケージをダウンロードする
GitHubからオープンソースのJiebaパッケージをダウンロードします。
実践1: オープンソースのJiebaパッケージを使用して中国語テキストをセグメント化する
ワークフローを作成します。
詳細については、「ワークフローの作成」をご参照ください。
MaxComputeリソースを作成し、jieba-master.zipパッケージを作成します。
作成したワークフローの名前を右クリックし、. を選択します。
では、リソースの作成ダイアログボックスでパラメーターを設定し、作成. をクリックします。
次の表に、いくつかのパラメーターを示します。 パラメーター
説明
ファイル
[アップロード] をクリックし、ダウンロードしたjieba-master.zipパッケージを指示に従ってアップロードします。
名前
リソースの名前です。 リソース名は、アップロードするファイルの名前とは異なる場合がありますが、特定の規則に準拠する必要があります。 プロンプトに従ってカスタムリソース名を指定できます。 この場合、このパラメーターはjieba-master.zipに設定されます。
をクリックし、
リソースをコミットするには、上部のツールバーのアイコンをクリックします。
jieba_testという名前のテーブルとjieba_resultという名前のテーブルを作成します。 jieba_testテーブルは、テストデータを格納するために使用されます。 jieba_resultテーブルは、テスト結果を格納するために使用されます。
作成したワークフローの名前を右クリックし、 を選択します。 [テーブルの作成] ダイアログボックスで、プロンプトに従ってパラメーターを設定し、[作成] をクリックします。 次に、DDLステートメントを実行して、テーブルのフィールドを設定します。 次の表に、2つのテーブルのフィールドを構成するために使用されるDDLステートメントを示します。
Table
DDLステートメント
説明
jieba_test
CREATE TABLE jieba_test ( `chinese` string, `content` string );テストデータを格納します。
jieba_結果
CREATE TABLE jieba_result ( `chinese` string ) ;テスト結果を格納します。
テーブルが作成されたら、テーブルを開発環境にコミットします。
テストデータをダウンロードし、テストデータをjieba_testテーブルを使用します。
ダウンロードします。jieba_test.csvオンプレミスマシンへのテストデータを含むファイル。
をクリックし、
のスケジュールされたワークフローペインのアイコンDataStudioページに移動します。 では、データインポートウィザードダイアログボックスで、テーブルの名前を入力します。jieba_testデータをインポートするには、テーブルを選択し、次へ. をクリックします。
クリック参照、アップロードjieba_test.csvオンプレミスマシンからファイルを作成し、次へ. をクリックします。
選択名前でをクリックし、データのインポート. をクリックします。
PyODPS 3ノードを作成します。
作成したワークフローの名前を右クリックし、. を選択します。
では、ノードの作成ダイアログボックスで、名前パラメーターを適切な値に設定します。word_splitをクリックし、確認.をクリックします。
オープンソースのJiebaパッケージを使用して、セグメンテーションコードを実行します。
PyODPS 3ノードで次のサンプルコードを実行して、jieba_testテーブルのテストデータをセグメント化し、セグメント化結果データの最初の10行を返します。
def test(input_var): import jieba result = jieba.cut(input_var, cut_all=False) return "/ ".join(result) # odps.stage.mapper.split.size can be used to improve the execution parallelism. hints = { 'odps.isolation.session.enable': True, 'odps.stage.mapper.split.size': 64, } libraries =['jieba-master.zip'] # Reference the jieba-master.zip package. src_df = o.get_table('jieba_test').to_df() # Reference the data in the jieba_test table. result_df = src_df.chinese.map(test).persist('jieba_result', hints=hints, libraries=libraries) print(result_df.head(10)) # Display the first 10 rows of segmentation result data. You can view more data in the jieba_result table.説明odps.stage.mapper.split.sizeを使用して、実行の並列処理を改善できます。 詳細は、「フラグパラメーター」をご参照ください。
結果を表示します。
ページ下部の [ランタイムログ] タブでJiebaセグメンテーションプログラムの実行結果を表示します。
DataStudioページの左側のナビゲーションウィンドウで [アドホッククエリ] をクリックし、アドホッククエリノードを作成してjieba_resultテーブルのデータを表示することもできます。
select * from jieba_result;
実践2: カスタム辞書を使用して中国語のテキストをセグメント化する
Jiebaツールの辞書が要件を満たしていない場合は、カスタム辞書を使用できます。 このセクションでは、カスタム辞書を使用して中国語テキストをセグメント化する方法の例を示します。
MaxComputeリソースを作成します。
PyODPSユーザー定義関数 (UDF) を呼び出して、MaxComputeにアップロードされたリソースを読み取ることができます。 リソースはテーブルまたはファイルです。 この場合、UDFをクロージャ関数または呼び出し可能なクラスの関数として記述する必要があります。 複雑なUDFを参照する必要がある場合は、DataWorksでMaxCompute関数を作成できます。 詳細については、「MaxCompute UDFの作成と使用」をご参照ください。
このセクションでは、MaxComputeにアップロードされたカスタム辞書ファイルkey_words.txtを参照するクロージャ関数が呼び出されます。
ファイルタイプのMaxCompute関数を作成します。
作成したワークフローの名前を右クリックし、 を選択します。 [リソースの作成] ダイアログボックスで、Nameパラメーターをkey_words.txtに設定し、[作成] をクリックします。
key_words.txtリソースの構成タブで、カスタム辞書の内容を入力し、リソースを保存してコミットします。
次の内容は、カスタム辞書のコンテンツ例です。 テスト要件に基づいて、カスタム辞書の内容を入力できます。
增量备份 安全合规
カスタム辞書を使用してセグメンテーションコードを実行します。
PyODPS 3ノードで次のサンプルコードを実行して、jieba_testテーブルのテストデータをセグメント化し、セグメント化結果データの最初の10行を返します。
重要次のサンプルコードを実行する前に、セグメンテーション結果データを格納する
jieba_result2という名前のテーブルを作成する必要があります。 テーブルの作成方法の詳細については、「jieba_resultという名前のテーブルの作成」をご参照ください。def test(resources): import jieba fileobj = resources[0] jieba.load_userdict(fileobj) def h(input_var): # Call the nested h() function to load the dictionary and segment text. result = jieba.cut(input_var, cut_all=False) return "/ ".join(result) return h # odps.stage.mapper.split.size can be used to improve the execution parallelism. hints = { 'odps.isolation.session.enable': True, 'odps.stage.mapper.split.size': 64, } libraries =['jieba-master.zip'] # Reference the jieba-master.zip package. src_df = o.get_table('jieba_test').to_df() # Reference the data in the jieba_test table. file_object = o.get_resource('key_words.txt') # Call the get_resource() function to reference the MaxCompute resource. mapped_df = src_df.chinese.map(test, resources=[file_object]) # Call the map function to transfer the resources parameter. result_df = mapped_df.persist('jieba_result2', hints=hints, libraries=libraries) print(result_df.head(10)) # Display the first 10 rows of segmentation result data. You can view more data in the jieba_result2 table.説明odps.stage.mapper.split.sizeを使用して、実行の並列処理を改善できます。 詳細は、「フラグパラメーター」をご参照ください。
結果を表示します。
ページ下部の [ランタイムログ] タブで実行結果を表示します。
DataStudioページの左側のナビゲーションウィンドウで [アドホッククエリ] をクリックし、アドホッククエリノードを作成してjieba_result2テーブルのデータを表示することもできます。
select * from jieba_result2;
カスタム辞書を使用して実行されたセグメンテーションコードの結果と、オープンソースのJiebaパッケージを使用して実行されたセグメンテーションコードの結果を比較します。
関連ドキュメント
DataWorksでPyODPS 3ノードを使用する方法の詳細については、「DataWorksでのPyODPSの使用」をご参照ください。