面向開發人員的 DeepPavlov:#1 NLP 工具與聊天機器人創建

大家好! 我們將開設一系列文章,致力於解決與自然語言處理(自然語言處理或簡稱 NLP)相關的實際問題以及使用開源庫創建對話代理(聊天機器人) 深巴甫洛夫,它是由我們 MIPT 神經系統和深度學習實驗室的團隊開發的。 該系列的主要目標是將 DeepPavlov 介紹給廣泛的開發人員,並向您展示如何在沒有機器學習和數學博士學位的深入知識的情況下解決應用 NLP 問題。

NLP 任務包括確定文字的情緒、解析命名實體、確定對話者想要從您的機器人那裡得到什麼:訂購披薩或獲取背景資訊等等。 您可以閱讀有關 NLP 任務和方法的更多信息 這裡.

在本文中,我們將向您展示如何使用預先訓練的 NLP 模型來運行 REST 伺服器,無需任何額外的配置或培訓即可使用。

面向開發人員的 DeepPavlov:#1 NLP 工具與聊天機器人創建

深巴甫洛夫的安裝

此處和下文將給予針對 Linux 的說明。 對於 Windows,請參閱我們的 文件

  • 使用目前支援的 Python 版本建立並啟動虛擬環境:
    virtualelnv env -p python3.7
    source env/bin/activate
  • 在虛擬環境中安裝 DeepPavlov:
    pip install deeppavlov
    

使用 DeepPavlov 模型啟動 REST 伺服器

在我們首次使用 DeepPavlov 模型啟動伺服器之前,討論該程式庫架構的一些功能將會很有用。

DP 中的任何模型都包含:

  • Python程式碼;
  • 可下載元件 - 針對特定資料(嵌入、神經網路權重等)的序列化訓練結果;
  • 設定檔(以下簡稱config),包含模型使用的類別、下載元件的URL、Python依賴等資訊。

我們將在接下來的文章中向您詳細介紹 DeepPavlov 的原理,目前我們知道這一點就足夠了:

  • DeepPavlov 中的任何模型都透過其配置名稱來識別;
  • 要運行該模型,您需要從 DeepPavlov 伺服器下載其元件;
  • 此外,要運行模型,您需要安裝它使用的 Python 庫。

我們將推出的第一個模型將是多語言命名實體識別(NER)。 此模型根據文字單字所屬的命名實體的類型(專有名稱、地名、貨幣名稱等)對文字單字進行分類。 目前最新版本 NER 的配置名稱:

ner_ontonotes_bert_mult

我們使用以下模型啟動 REST 伺服器:

  1. 我們將其配置中指定的模型依賴項安裝到活動虛擬環境中:
    python -m deeppavlov install ner_ontonotes_bert_mult
    
  2. 從 DeepPavlov 伺服器下載序列化模型元件:
    python -m deeppavlov download ner_ontonotes_bert_mult
    

    序列化的元件將下載到 DeepPavlov 主目錄,預設位於該目錄

    ~/.deeppavlov

    下載時,已下載組件的雜湊值將與伺服器上組件的雜湊值進行檢查。 如果存在匹配,則跳過下載並使用現有文件。 下載組件的大小平均為 0.5 到 8 Gb,在某些情況下解壓縮後可達 20 Gb。

  3. 我們使用以下模型啟動 REST 伺服器:
    python -m deeppavlov riseapi ner_ontonotes_bert_mult -p 5005
    

執行此命令的結果是,將在主機的連接埠 5005 上啟動具有模型的 REST 伺服器(預設連接埠為 5000)。

初始化模型後,可以在 URL 找到帶有 API 文件和測試能力的 Swagger http://127.0.0.1:5005。 讓我們透過將模型傳送到端點來測試模型 http://127.0.0.1:5005/model 具有以下 JSON 內容的 POST 請求:

{
  "x": [
    "В МФТИ можно добраться на электричке с Савёловского Вокзала.",
    "В юго-западной Руси стог жита оценен в 15 гривен"
  ]
}

作為回應,我們應該收到以下 JSON:

[
  [
    ["В", "МФТИ", "можно", "добраться", "на", "электричке", "с", "Савёловского", "Вокзала", "."],
    ["O", "B-FAC", "O", "O", "O", "O", "O", "B-FAC", "I-FAC", "O"]
  ],
  [
    ["В", "юго", "-", "западной", "Руси", "стог", "жита", "оценен", "в", "15", "гривен"],
    ["O", "B-LOC", "I-LOC", "I-LOC", "I-LOC", "O", "O", "O", "O", "B-MONEY", "I-MONEY"]
  ]
]

使用這些範例,我們將分析 DeepPavlov REST API。

API 深度巴甫洛夫

每個 DeepPavlov 模型至少有一個輸入參數。 在 REST API 中,參數是命名的,它們的名稱是傳入字典的鍵。 在大多數情況下,參數是需要處理的文字。 有關模型傳回的參數和值的更多資訊可以在文件的 MODELS 部分找到 深巴甫洛夫

在範例中,兩個字串的清單被傳遞給參數 x,每個字串都被賦予單獨的標記。 在 DeepPavlov 中,所有模型都將獨立處理的值清單(批次)作為輸入。

術語「批次」指的是機器學習領域,指的是由演算法或神經網路同時處理的一批獨立輸入值。 與單獨傳遞給輸入的相同值相比,這種方法可以減少(通常顯著)模型處理批次中的一個元素的時間。 但只有在處理完所有元素後才會發出處理結果。 因此,在產生傳入批次時,有必要考慮模型的速度及其每個單獨元素所需的處理時間。

如果 DeepPavlov 模型有多個參數,每個參數都會收到自己的一批值,並且在輸出時模型總是會產生一批答案。 傳出批次的元素是處理具有相同索引的傳入批次的元素的結果。

在上面的範例中,模型的結果是將每個字串分解為標記(單字和標點符號),並相對於它所代表的命名實體(組織名稱、貨幣)對標記進行分類。 目前型號 ner_ontonotes_bert_mult 能夠辨識18種命名實體,詳細說明可見 這裡.

DeepPavlov 的其他開箱即用模型

除了 NER 之外,在撰寫本文時 DeepPavlov 中還提供以下開箱即用的模型:

文字問答

用該文本的片段回答該文本的問題。 型號配置: 小隊_ru_bert_infer

請求範例:

{
  "context_raw": [
    "DeepPavlov разрабатывается лабораторией МФТИ.",
    "В юго-западной Руси стог жита оценен в 15 гривен."
  ],
  "question_raw": [
    "Кем разрабатывается DeepPavlov?",
    "Сколько стоил стог жита на Руси?"
  ]
}

其結果是:

[
  ["лабораторией МФТИ", 27, 31042.484375],
  ["15 гривен", 39, 1049.598876953125]
]

侮辱檢測

檢測是否存在對文字物件的侮辱行為(在撰寫本文時 - 僅適用於英語)。 模型配置:insuls_kaggle_conv_bert

請求範例:


{
  "x": [
    "Money talks, bullshit walks.",
    "You are not the brightest one."
  ]
}

其結果是:

[
  ["Not Insult"],
  ["Insult"]
]

情緒分析

文字情緒分類(正面、中性、負面)。 型號配置: rusentiment_elmo_twitter_cnn

請求範例:

{
  "x": [
    "Мне нравится библиотека DeepPavlov.",
    "Я слышал о библиотеке DeepPavlov.",
    "Меня бесят тролли и анонимусы."
  ]
}

其結果是:

[
  ["positive"],
  ["neutral"],
  ["negative"]
]

釋義檢測

判斷兩個不同的文本是否具有相同的意義。 型號配置: Stand_paraphraser_en

查詢:

{
  "text_a": [
    "Город погружается в сон, просыпается Мафия.",
    "Президент США пригрозил расторжением договора с Германией."
  ],
  "text_b": [
    "Наступает ночь, все жители города пошли спать, а преступники проснулись.",
    "Германия не собирается поддаваться угрозам со стороны США."
  ]
}

其結果是:

[
  [1],
  [0]
]

始終可以找到所有開箱即用的 DeepPavlov 模型的當前列表 這裡.

結論

在本文中,我們熟悉了 DeepPavlov API 以及該程式庫開箱即用的一些文字處理功能。 應該記住,對於任何 NLP 任務,在與任務的主題領域(領域)相對應的資料集上訓練模型時,將會獲得最佳結果。 此外,原則上,更多的模型也不能針對所有情況進行訓練。

在接下來的文章中,我們將了解該庫的其他設置,從 Docker 啟動 DeepPavlov,然後我們將繼續訓練模型。 並且不要忘記 DeepPavlov 有 論壇 – 詢問有關庫和模型的問題。 感謝您的關注!

來源: www.habr.com

添加評論