全部產品
Search
文件中心

DataWorks:使用PyODPS節點進行結巴中文分詞

更新時間:Jun 19, 2024

如您需進行文本分析、資訊檢索、文本挖掘與特徵提取、構建搜尋引擎、機器翻譯、訓練語言模型等情境應用,則可通過DataWorks的PyODPS節點使用開源結巴中文分詞工具,將中文文本分割為詞語,進行相關文本的分析處理。同時,若預設詞庫無法滿足您的業務需要,您還可通過建立自訂詞庫來增加分詞或修改分詞結果。

背景資訊

DataWorks提供的PyODPS節點支援直接編輯Python代碼並使用MaxCompute的Python SDK進行資料開發。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資料來源並綁定至工作空間

準備工作:下載開源結巴中文分詞包

進入GitHub,按照下圖指引下載開源結巴分詞中文包clone

實踐一:使用開源詞包進行分詞

  1. 建立商務程序,操作詳情請參見建立商務程序

  2. 建立MaxCompute資源並上傳jieba-master.zip包。

    1. 按右鍵建立的商務程序,選擇建立資源 > MaxCompute > Archive

    2. 建立資源對話方塊中,配置各項參數,完成後單擊建立

      建立資源核心參數配置說明如下。

      參數

      描述

      上傳檔案

      單擊點擊上傳,根據介面提示選擇已下載的jieba-master.zip檔案。

      名稱

      資源的名稱,無需和上傳的檔案名稱保持一致,但需要符合命名規範。您可根據介面提示自訂資源名稱,本實踐名稱樣本配置為jieba-master.zip

    3. 單擊工具列中的提交表徵圖,根據介面提示提交建立的資源。

  3. 建立測試資料表jieba_test和測試結果表jieba_result

    按右鍵建立的商務程序,選擇建立表 > MaxCompute > ,根據介面提示建立表,並使用DDL模式配置表的欄位資訊。建立完成後,提交表到開發環境。建表相關操作,詳情請參見建立並使用MaxCompute表

    本實踐需要建立的兩個表的配置要點如下。

    表名

    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. 資料開發頁面,單擊匯入表徵圖。

    3. 將本機資料匯入開發表對話方塊,輸入需要匯入資料的測試表jieba_test並選中,單擊下一步

    4. 上傳您下載至本地的jieba_test.csv檔案,配置上傳資訊並預覽資料,單擊下一步

    5. 選中按名稱匹配,單擊匯入資料

  5. 建立PyODPS 3節點。

    1. 按右鍵建立的商務程序,選擇建立節點 > MaxCompute > PyODPS 3

    2. 建立節點對話方塊輸入名稱(樣本為word_split),單擊確認

  6. 使用開源詞包測試回合分詞代碼。

    在PyODPS 3節點中運行下方範例程式碼,對上傳至jieba_test表中的測試資料進行分詞,並回顯分詞結果表的前十行資料。

    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可用於提高執行並行度,詳情請參見Flag參數列表

  7. 查看運行結果。

    運行完成後,您可通過如下方式查看結巴分詞程式的運行結果:

    • 方式一:在頁面下方的作業記錄地區查看。

    • 方式二:在頁面左側單擊臨時查詢按鈕,建立一個臨時查詢節點,查看測試結果表jieba_result中的結果資料。

      select * from jieba_result;

實踐二:使用自訂詞庫進行分詞

如果開源結巴分詞的預設詞庫無法滿足您的需求,則您可使用自訂的詞庫對分詞結果進行進一步修正,以下為您樣本如何使用自訂詞庫進行分詞。

  1. 建立MaxCompute資源。

    PyODPS自訂函數可讀取上傳至MaxCompute的資源(表資源或檔案資源),此時,自訂函數需要寫為閉包函數或Callable類。

    說明

    您可使用DataWorks的註冊MaxCompute函數功能引用複雜的自訂函數,詳情請參見建立並使用自訂函數

    本實踐以使用閉包函數的方式,引用上傳至MaxCompute的資源檔(即自訂詞庫)key_words.txt

    1. 建立File類型的MaxCompute函數。

      按右鍵建立的商務程序,選擇建立資源 > MaxCompute > File,輸入資源名稱key_words.txt後單擊建立

    2. 輸入自訂詞庫內容並儲存、提交。

      以下為自訂詞庫的樣本,您可根據自己的測試需求輸入合適的自訂詞庫。

      增量備份
      安全合規
  2. 使用自訂詞庫測試回合分詞代碼。

    在PyODPS 3節點中運行下方範例程式碼,對上傳至jieba_test表中的測試資料進行分詞,並回顯分詞結果表的前十行資料。

    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 可用於提高執行並行度,詳情請參見Flag參數列表

  3. 查看運行結果。

    運行完成後,您可通過如下方式查看結巴分詞程式的運行結果:

    • 方式一:在頁面下方的作業記錄地區查看。

    • 方式二:在頁面左側單擊臨時查詢按鈕,建立一個臨時查詢節點,查看測試結果表jieba_result2中的結果資料。

      select * from jieba_result2;