すべてのプロダクト
Search
ドキュメントセンター

DataWorks:PyODPS ノードを使用して Jieba に基づいて中国語テキストをセグメント化する

最終更新日:Jan 11, 2025

テキスト分析、情報検索、テキストマイニング、特徴抽出、検索エンジンの構築、機械翻訳、または言語モデルのトレーニングを実行するシナリオでは、DataWorks の PyODPS ノードを使用して、オープンソースのセグメンテーションツール Jieba に基づいて中国語テキストをセグメント化し、テキストを分析および処理できます。 Jieba のデフォルト辞書がビジネス要件を満たしていない場合は、カスタム辞書を作成してエントリを追加したり、セグメンテーション結果を変更したりできます。

背景情報

DataWorks は PyODPS ノードを提供します。 DataWorks の PyODPS ノードで Python コードを編集し、データ開発用に Python 用 MaxCompute SDK を使用できます。 DataWorks の PyODPS ノードには、PyODPS 2 ノードと PyODPS 3 ノードが含まれます。 PyODPS 3 はシンプルで使いやすい API を提供し、pip を使用してインストールできます。 この方法で、MaxCompute のリソースと機能をより有効に活用できます。 データ開発には PyODPS 3 ノードを使用することをお勧めします。 詳細については、「PyODPS 3 タスクを開発する」をご参照ください。

重要
  • PyODPS 3 ノードは Python 3.X のみをサポートしています。 PyODPS 2 ノードは Python 2.X と Python 3.X をサポートしています。 Python 2.X を使用する場合は、PyODPS 2 ノードのみを選択できます。

  • このトピックの操作は参考用です。 本番環境では使用しないことをお勧めします。

前提条件

  1. DataWorks ワークスペースが作成されていること。 詳細については、「ワークスペースの作成と管理」をご参照ください。

  2. MaxCompute データソースが追加され、ワークスペースに関連付けられていること。 詳細については、「MaxCompute データソースを追加し、ワークスペースに関連付ける」をご参照ください。

準備:オープンソースの Jieba パッケージをダウンロードする

次の図に示されている手順に従って、GitHub からオープンソースの Jieba パッケージをダウンロードします。clone

実践 1:オープンソースの Jieba パッケージを使用して中国語テキストをセグメント化する

  1. ワークフローを作成します。 詳細については、「ワークフローの作成」をご参照ください。

  2. MaxCompute リソースを作成し、jieba-master.zip パッケージをアップロードします。

    1. 作成したワークフローの名前を右クリックし、[リソースの作成] > [maxcompute] > [アーカイブ] を選択します。

    2. [リソースの作成] ダイアログボックスで、パラメーターを設定し、[作成] をクリックします。

      新建资源次の表に、いくつかのパラメーターを示します。

      パラメーター

      説明

      [ファイル]

      [アップロード] をクリックし、プロンプトに従ってダウンロードした jieba-master.zip パッケージをアップロードします。

      [名前]

      リソースの名前。 リソース名は、アップロードするファイルの名前と異なる場合がありますが、特定の規則に準拠している必要があります。 プロンプトに従ってカスタムリソース名を指定できます。 この実践では、このパラメーターは jieba-master.zip に設定されています。

    3. トップツールバーの 提交 アイコンをクリックして、リソースをコミットします。

  3. jieba_test という名前のテーブルと jieba_result という名前のテーブルを作成します。 jieba_test テーブルはテストデータを格納するために使用されます。 jieba_result テーブルはテスト結果を格納するために使用されます。

    テーブルを作成するには、次の操作を実行します。作成したワークフローの名前を右クリックし、[テーブルの作成] > [maxcompute] > [テーブル] を選択します。 [テーブルの作成] ダイアログボックスで、プロンプトに従ってパラメーターを設定し、[作成] をクリックします。 次に、DDL ステートメントを実行して、テーブルのフィールドを設定します。 テーブルの作成後、テーブルを開発環境にコミットします。 テーブルの作成方法の詳細については、「MaxCompute テーブルの作成と管理」をご参照ください。

    次の表に、2 つのテーブルのフィールドを設定するために使用される DDL ステートメントを示します。

    テーブル

    DDL ステートメント

    説明

    jieba_test

    CREATE TABLE jieba_test (
        `chinese` string,
        `content` string
    );

    テストデータを格納します。

    jieba_result

    CREATE TABLE jieba_result (
        `chinese` string
    ) ;

    テスト結果を格納します。

  4. テストデータをダウンロードし、jieba_test テーブルにインポートします。

    1. テストデータを含む jieba_test.csv ファイルをオンプレミスマシンにダウンロードします。

    2. 导入[datastudio] ページの [スケジュールされたワークフロー] ペインで アイコンをクリックします。

    3. [データインポートウィザード] ダイアログボックスで、データをインポートするテーブル jieba_test の名前を入力し、テーブルを選択して、[次へ] をクリックします。

    4. オンプレミスマシンから jieba_test.csv ファイルをアップロードし、アップロード情報を設定し、データをプレビューして、[次へ] をクリックします。

    5. [名前別] を選択し、[データのインポート] をクリックします。

  5. PyODPS 3 ノードを作成します。

    1. 作成したワークフローの名前を右クリックし、[ノードの作成] > [maxcompute] > [pyodps 3] を選択します。

    2. [ノードの作成] ダイアログボックスで、[名前] パラメーターを設定し、[確認] をクリックします。 この例では、ノード名は word_split です。

  6. オープンソースの 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 を使用して実行の並列性を向上させることができます。
    hints = {
        'odps.isolation.session.enable': True,
        'odps.stage.mapper.split.size': 64,
    }
    libraries =['jieba-master.zip']  # jieba-master.zip パッケージを参照します。
    src_df = o.get_table('jieba_test').to_df()  # jieba_test テーブルのデータを参照します。
    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. 結果を表示します。

    次のいずれかの方法を使用して、Jieba セグメンテーションプログラムの実行結果を表示できます。

    • 方法 1:ページの下部にある [ランタイムログ] タブで Jieba セグメンテーションプログラムの実行結果を表示します。

    • 方法 2:DataStudio ページの左側のナビゲーションペインで [アドホッククエリ] をクリックし、アドホッククエリノードを作成して jieba_result テーブルのデータを表示します。

      select * from jieba_result;

実践 2:カスタム辞書を使用して中国語テキストをセグメント化する

Jieba ツールのデフォルト辞書が要件を満たしていない場合は、カスタム辞書を使用できます。 このセクションでは、カスタム辞書を使用して中国語テキストをセグメント化する方法の例を示します。

  1. MaxCompute リソースを作成します。

    PyODPS ユーザー定義関数(UDF)を使用して、MaxCompute にアップロードされたリソースを読み取ることができます。 リソースはテーブルまたはファイルです。 この場合、UDF をクロージャ関数または呼び出し可能クラスの関数として記述する必要があります。

    説明

    DataWorks で MaxCompute 関数を作成して、複雑な UDF を参照できます。 詳細については、「MaxCompute 関数の作成と使用」をご参照ください。

    このセクションでは、クロージャ関数を呼び出して、MaxCompute にアップロードされたカスタム辞書ファイル key_words.txt を参照します。

    1. ファイルタイプの MaxCompute 関数を作成します。

      作成したワークフローの名前を右クリックし、[リソースの作成] > [maxcompute] > [ファイル] を選択します。 [リソースの作成] ダイアログボックスで、[名前] パラメーターを key_words.txt に設定し、[作成] をクリックします。

    2. key_words.txt リソースの設定タブで、カスタム辞書の内容を入力し、リソースを保存してコミットします。

      次の内容は、カスタム辞書の例です。 テスト要件に基づいてカスタム辞書の内容を入力できます。

      增量备份
      安全合规
  2. カスタム辞書を使用してセグメンテーションコードを実行します。

    PyODPS 3 ノードで次のサンプルコードを実行して、jieba_test テーブルのテストデータをセグメント化し、セグメンテーション結果データの最初の 10 行を返します。

    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
    
    # odps.stage.mapper.split.size を使用して実行の並列性を向上させることができます。
    hints = {
        'odps.isolation.session.enable': True,
        'odps.stage.mapper.split.size': 64,
    }
    libraries =['jieba-master.zip']  # jieba-master.zip パッケージを参照します。
    src_df = o.get_table('jieba_test').to_df()  # jieba_test テーブルのデータを参照します。
    
    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))  # セグメンテーション結果データの最初の 10 行を表示します。 jieba_result2 テーブルでより多くのデータを表示できます。
    説明

    odps.stage.mapper.split.size を使用して実行の並列性を向上させることができます。 詳細については、「フラグパラメーター」をご参照ください。

  3. 結果を表示します。

    次のいずれかの方法を使用して、カスタム辞書の実行結果を表示できます。

    • 方法 1:ページの下部にある [ランタイムログ] タブでカスタム辞書の実行結果を表示します。

    • 方法 2:DataStudio ページの左側のナビゲーションペインで [アドホッククエリ] をクリックし、アドホッククエリノードを作成して jieba_result2 テーブルのデータを表示します。

      select * from jieba_result2;