このトピックでは、DataWorks の PyODPS ノードでオープンソースの Jieba 形態素解析ライブラリを使用して、MaxCompute テーブルに格納されている中国語テキストを分割する方法を説明します。また、クロージャ関数を使用して、カスタム辞書でデフォルトの辞書を拡張する方法も示します。
このトピックを読むことで、以下の内容を理解できます:
サードパーティの Python パッケージを MaxCompute のアーカイブ リソースとしてアップロードする
PyODPS の
map()呼び出しでそのパッケージを参照するクロージャ関数を介して、ユーザー定義関数 (UDF) 内で MaxCompute のファイルリソースをロードする
セグメンテーション結果は、[ランタイムログ] タブおよびアドホッククエリで確認してください。
このトピックのサンプルコードは参照用です。本番環境では直接使用しないでください。
前提条件
開始する前に、以下を確認してください:
MaxCompute コンピュートエンジンが関連付けられた DataWorks ワークスペースがあること。詳細については、「ワークスペースの作成」をご参照ください。
Python および PyODPS 3 ノードに関する基本的な知識があること。詳細については、「PyODPS 3 タスクの開発」をご参照ください。
PyODPS ノードとサードパーティパッケージの連携方法
DataWorks の PyODPS ノードを使用すると、MaxCompute SDK for Python (PyODPS) を使用して MaxCompute に対して Python コードを実行できます。PyODPS 2 と PyODPS 3 の 2 つのノードバージョンが利用可能ですが、PyODPS 3 を使用してください。
PyODPS の UDF でサードパーティの Python ライブラリを使用するには、ライブラリの zip ファイルを MaxCompute のアーカイブ リソースとしてアップロードし、persist() の libraries パラメーターで参照します。MaxCompute はジョブの初期化時に各マッパーにライブラリを配布するため、UDF の実行時に利用可能になります。
事前準備:Jieba パッケージのダウンロード
GitHub から Jieba パッケージ (jieba-master.zip) をダウンロードします。

実践 1:Jieba のデフォルト辞書を使用した中国語テキストの形態素解析
ステップ 1:ワークフローの作成
DataWorks でワークフローを作成します。詳細については、「ワークフローの作成」をご参照ください。
ステップ 2:Jieba パッケージをアーカイブ リソースとしてアップロード
DataStudio で、ワークフロー名を右クリックし、[Create Resource] > [MaxCompute] > [Archive] を選択します。
[リソースの作成] ダイアログボックスで、次のパラメーターを設定し、[作成] をクリックします。
パラメーター 説明 ファイル [アップロード] をクリックし、GitHub からダウンロードした jieba-master.zipファイルを選択します。名前 リソース名。これを jieba-master.zipに設定します。名前はアップロードしたファイル名と異なっていてもかまいませんが、DataWorks の命名規則に従う必要があります。
ツールバーの
アイコンをクリックして、リソースを開発環境にコミットします。
ステップ 3:ソーステーブルと結果テーブルの作成
入力データを格納する jieba_test と、形態素解析の出力を格納する jieba_result の 2 つの MaxCompute テーブルを作成します。
各テーブルを作成するには、ワークフロー名を右クリックして[テーブルの作成] > [MaxCompute] > [テーブル] の順に選択します。[テーブルの作成] ダイアログボックスで、パラメーターを設定し、[作成] をクリックします。次に、以下の DDL 文を実行してテーブルスキーマを定義します。
`jieba_test` — 形態素解析対象の中国語テキストを格納します:
CREATE TABLE jieba_test (
`chinese` string,
`content` string
);`jieba_result` — 形態素解析の出力を格納します:
CREATE TABLE jieba_result (
`chinese` string
);テーブルを作成した後、開発環境にコミットします。
ステップ 4:テストデータのインポート
jieba_test.csv をオンプレミスマシンにダウンロードします。
[DataStudio] ページの [定期ワークフロー] ペインにある
アイコンをクリックします。[データインポートウィザード] ダイアログボックスで、テーブル名フィールドに
jieba_testを入力し、テーブルを選択して、[次へ] をクリックします。[参照] をクリックし、オンプレミスのマシンから
jieba_test.csvをアップロードし、[次へ] をクリックします。[名前で] を選択し、[データをインポート] をクリックします。
ステップ 5:PyODPS 3 ノードの作成
ワークフロー名を右クリックし、[ノードの作成] > MaxCompute > PyODPS 3 を選択します。
「ノードの作成」ダイアログボックスで、「名前」を
word_split(または他の適切な名前)に設定し、「確認」をクリックします。
ステップ 6:形態素解析コードの実行
次のコードを PyODPS 3 ノードに貼り付けて実行します。このコードは jieba_test から chinese 列を読み取り、Jieba を使用して各値を形態素解析し、結果を jieba_result に書き込みます。
def test(input_var):
import jieba
result = jieba.cut(input_var, cut_all=False)
return "/ ".join(result)
hints = {
'odps.isolation.session.enable': True,
# split.size を増やしてマッパーの並列処理を向上させます。詳細は、フラグパラメーターをご参照ください。
'odps.stage.mapper.split.size': 64,
}
libraries = ['jieba-master.zip'] # Jieba アーカイブを各マッパーに配布します。
src_df = o.get_table('jieba_test').to_df()
result_df = src_df.chinese.map(test).persist('jieba_result', hints=hints, libraries=libraries)
print(result_df.head(10)) # 最初の 10 行を出力します。完全な結果は jieba_result にあります。odps.stage.mapper.split.size を使用して、実行の並列処理を向上させることができます。利用可能なすべてのフラグパラメーターについては、「フラグパラメーター」をご参照ください。ステップ 7:結果の表示
ランタイムログ: ページ下部の [ランタイムログ] タブで、
print(result_df.head(10))の出力を確認します。テーブル全体: DataStudio の左側のナビゲーションウィンドウで、[アドホッククエリ] をクリックし、アドホッククエリ ノードを作成し、実行します:
SELECT * FROM jieba_result;
実践 2:カスタム辞書を使用した中国語テキストの形態素解析
Jieba のデフォルト辞書では、ドメイン固有の用語が認識されない場合があります。カスタム辞書をロードすることで、これらの用語が文字に分割されずに、単一のトークンとして扱われるようにできます。
PyODPS の map() は、データを 1 行ずつ UDF に渡します。辞書を各行ごとではなく、マッパーの初期化時に一度だけロードするには、クロージャ関数または呼び出し可能なクラスの関数を使用します。外部関数はマッパーの起動時に辞書をロードし、各行を処理する内部関数を返します。このパターンにより、各行での冗長な I/O を回避できます。より複雑な UDF については、「MaxCompute UDF の作成と使用」をご参照ください。
ステップ 1:カスタム辞書をファイルリソースとしてアップロード
ワークフロー名を右クリックし、[リソースの作成] > MaxCompute > [ファイル] を選択します。
「リソースの作成」ダイアログボックスで、[名前] を
key_words.txtに設定し、「作成」をクリックします。key_words.txtリソースの構成タブで、カスタム用語を (1 行に 1 つ) 入力し、リソースを保存してコミットします。例:增量备份 安全合规
ステップ 2:結果テーブルの作成
コードを実行する前に、jieba_result と同じ DDL を使用して jieba_result2 という名前のテーブルを作成します:
CREATE TABLE jieba_result2 (
`chinese` string
);テーブルを開発環境にコミットします。
ステップ 3:カスタム辞書を使用した形態素解析コードの実行
次のコードを同じ PyODPS 3 ノード (または新しいノード) に貼り付けて実行します。
def test(resources):
import jieba
fileobj = resources[0]
jieba.load_userdict(fileobj) # マッパーの初期化時にカスタム辞書を一度ロードします。
def h(input_var): # 内部関数:マップ操作の各行に対して呼び出されます。
result = jieba.cut(input_var, cut_all=False)
return "/ ".join(result)
return h # UDF ハンドラとして内部関数を返します。
hints = {
'odps.isolation.session.enable': True,
'odps.stage.mapper.split.size': 64,
}
libraries = ['jieba-master.zip']
src_df = o.get_table('jieba_test').to_df()
file_object = o.get_resource('key_words.txt') # MaxCompute ファイルリソースを参照します。
mapped_df = src_df.chinese.map(test, resources=[file_object]) # リソースをクロージャに渡します。
result_df = mapped_df.persist('jieba_result2', hints=hints, libraries=libraries)
print(result_df.head(10))o.get_resource()は MaxCompute からファイルリソースをフェッチし、resourcesパラメーターを介して外部のtest()関数に渡します。リソースは行ごとではなく、マッパーごとに一度ロードされます。ヒントのオプションについては、「フラグパラメーター」をご参照ください。
ステップ 4:結果の表示
ランタイムログ: 出力の先頭 10 行を確認するには、[ランタイムログ] タブをチェックしてください。
テーブル全体:次のアドホッククエリを実行します:
SELECT * FROM jieba_result2;
ステップ 5:出力の比較
次のクエリを並べて実行し、カスタム辞書が 增量备份 や 安全合规 などのドメイン固有の用語の形態素解析をどのように変更するかを確認します。
SELECT * FROM jieba_result; -- デフォルト辞書の結果
SELECT * FROM jieba_result2; -- カスタム辞書の結果key_words.txt にリストされている用語は、デフォルト辞書によって分割されるのではなく、jieba_result2 では単一のトークンとして表示されます。
次のステップ
DataWorks で PyODPS を使用する — リソース管理、スケジューリング、高度な UDF パターンなど、PyODPS ノードに関する完全なガイド。
MaxCompute UDF の作成と使用 — 呼び出し可能なクラスのパターンなど、より複雑な UDF について。
フラグパラメーター — MaxCompute ジョブのチューニングに利用できるすべてのヒントパラメーター。