DataWorks の PyODPS 3 ノードでオープンソースの Jieba ライブラリを使用して、MaxCompute 上で中国語テキストを大規模にセグメント化します。デフォルトの Jieba 辞書がドメイン固有の用語をカバーしていない場合は、カスタム辞書を MaxCompute リソースとしてアップロードして、セグメンテーション結果を拡張します。
一般的なユースケースには、テキスト分析、情報検索、テキストマイニング、特徴抽出、検索エンジンの構築、機械翻訳、言語モデルのトレーニングなどがあります。
このトピックの手順は参照用です。本番環境では使用しないでください。
前提条件
開始する前に、以下を確認してください。
-
DataWorks ワークスペース。詳細については、「ワークスペースの作成と管理」をご参照ください。
-
MaxCompute データソースが追加され、ワークスペースに関連付けられていること。詳細については、「MaxCompute データソースの追加とワークスペースへの関連付け」をご参照ください。
背景情報
DataWorks PyODPS ノードを使用すると、Python コードを記述し、MaxCompute SDK for Python をワークフローで直接使用できます。2つのノードタイプが利用可能です。
| ノードタイプ | Python サポート | 注記 |
|---|---|---|
| PyODPS 3 | Python 3.X のみ | pip インストールをサポート。新規開発に推奨 |
| PyODPS 2 | Python 2.X および 3.X | Python 2.X が必要な場合にのみ使用 |
新しいプロジェクトでは、PyODPS 3 ノードを使用します。詳細については、「PyODPS 3 タスクの開発」をご参照ください。
準備: Jieba パッケージのダウンロード
GitHub から オープンソースの Jieba パッケージ をダウンロードします。
実践 1: デフォルトの Jieba 辞書を使用したテキストのセグメント化
ステップ 1: ワークフローの作成
詳細については、「ワークフローの作成」をご参照ください。
ステップ 2: Jieba パッケージの MaxCompute リソースとしてのアップロード
-
ワークフロー名を右クリックし、[リソースの作成] > [MaxCompute] > [アーカイブ] を選択します。
-
「[リソースの作成]」ダイアログボックスで、以下のパラメーターを設定し、「[作成]」をクリックします。
パラメーター 説明 ファイル [アップロード] をクリックし、ダウンロードした jieba-master.zipファイルを選択します。名前 リソース名を入力します。この実践では、 jieba-master.zipを使用します。リソース名はファイル名と異なる場合がありますが、命名規則に従う必要があります。
-
トップツールバーの
アイコンをクリックして、リソースをコミットします。
ステップ 3: 入力テーブルと出力テーブルの作成
次の2つのテーブルを作成します。
-
jieba_test— 入力テキストデータを保存 -
jieba_result— セグメンテーション出力を保存
テーブルを作成するには、ワークフロー名を右クリックし、[テーブルの作成] > [MaxCompute] > [テーブル] を選択します。ダイアログボックスでテーブルを設定し、以下の DDL 文を実行してスキーマを定義します。各テーブルを作成した後、開発環境にコミットします。詳細については、「MaxCompute テーブルの作成と管理」をご参照ください。
-- Input table: stores test data
CREATE TABLE jieba_test (
`chinese` string,
`content` string
);
-- Output table: stores segmentation results
CREATE TABLE jieba_result (
`chinese` string
);
ステップ 4: テストデータのインポート
-
jieba_test.csv をローカルマシンにダウンロードします。
-
[DataStudio] ページの [Scheduled Workflow] ペインで、
アイコンをクリックして [Data Import Wizard] を開きます。 -
テーブル名フィールドに
jieba_testを入力し、テーブルを選択して、[次へ] をクリックします。 -
「
jieba_test.csv」をアップロードし、アップロード設定を構成して、データをプレビューした後、[次へ] をクリックします。 -
[名前で] を選択し、[データのインポート] をクリックします。
ステップ 5: PyODPS 3 ノードの作成
-
ワークフロー名を右クリックし、[ノードの作成] > [MaxCompute] > [PyODPS 3] を選択します。
-
[ノードの作成] ダイアログボックスで、[名前] を
word_splitに設定し、[確認] をクリックします。
ステップ 6: セグメンテーションコードの実行
次のコードを word_split ノードに貼り付けて実行します。このコードは、jieba_test の chinese 列をセグメント化し、結果を jieba_result に書き込み、最初の10行を出力します。
def test(input_var):
import jieba
result = jieba.cut(input_var, cut_all=False)
return "/ ".join(result)
hints = {
'odps.isolation.session.enable': True,
'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))
odps.stage.mapper.split.size は、実行並列性を向上させるために使用できます。詳細については、「フラグパラメーター」をご参照ください。
ステップ 7: 結果の表示
2つのオプションが利用可能です。
-
[ランタイムログ] タブ(ページの下部にある)—— 開発中の出力を素早く確認するのに適しています。
-
DataStudio の左側のナビゲーションウィンドウにある [アドホッククエリ] —
jieba_resultテーブルの完全な結果セットをクエリできます。select * from jieba_result;
実践 2: カスタム辞書を使用したテキストのセグメント化
Jieba のデフォルト辞書がドメイン固有の用語を見逃す場合は、カスタム辞書を MaxCompute ファイルリソースとしてアップロードします。
PyODPS では、MaxCompute リソースを読み取るユーザー定義関数 (UDF) は、クロージャ関数または呼び出し可能なクラス関数として記述する必要があります。
複雑な UDF を参照する MaxCompute 関数を作成するには、詳細については、「MaxCompute 関数の作成と使用」をご参照ください。
ステップ 1: カスタム辞書リソースの作成
-
ワークフロー名を右クリックし、[リソースの作成] > [MaxCompute] > [ファイル] を選択します。
-
[リソースの作成] ダイアログボックスで、[名前] を
key_words.txtに設定し、[作成] をクリックします。 -
key_words.txt構成タブで、カスタム辞書の内容を入力し、リソースを保存してコミットします。次の例では、2つのドメイン固有の用語を追加します。要件に基づいて内容を調整してください。增量备份 安全合规
ステップ 2: カスタム辞書を使用したセグメンテーションコードの実行
def test(resources):
import jieba
fileobj = resources[0]
jieba.load_userdict(fileobj)
def h(input_var): # ネストされた h() 関数を呼び出して辞書をロードし、テキストをセグメント化します。
result = jieba.cut(input_var, cut_all=False)
return "/ ".join(result)
return h
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') # get_resource() 関数を呼び出して MaxCompute リソースを参照します。
mapped_df = src_df.chinese.map(test, resources=[file_object]) # map 関数を呼び出して resources パラメーターを転送します。
result_df = mapped_df.persist('jieba_result2', hints=hints, libraries=libraries)
print(result_df.head(10))
odps.stage.mapper.split.size は、実行並列性を向上させるために使用できます。詳細については、「フラグパラメーター」をご参照ください。
ステップ 3: 結果の表示
-
[ランタイムログ] タブはページの下部にあり、開発中の出力をすばやく確認するのに適しています。
-
[アドホッククエリ] は、DataStudio の左側のナビゲーションウィンドウにあり、
jieba_result2テーブルの完全な結果セットをクエリできます。select * from jieba_result2;