DeepPavlov สำหรับนักพัฒนา: #1 เครื่องมือ NLP และการสร้างแชทบอท

สวัสดีทุกคน! เรากำลังเปิดชุดบทความที่เกี่ยวข้องกับการแก้ปัญหาในทางปฏิบัติที่เกี่ยวข้องกับการประมวลผลภาษาธรรมชาติ (การประมวลผลภาษาธรรมชาติหรือ NLP) และการสร้างตัวแทนการโต้ตอบ (แชทบอท) โดยใช้ไลบรารีโอเพ่นซอร์ส ดีพพาฟลอฟซึ่งกำลังได้รับการพัฒนาโดยทีมงานของเราที่ MIPT Laboratory of Neural Systems and Deep Learning เป้าหมายหลักของซีรีส์นี้คือการแนะนำ DeepPavlov ให้กับนักพัฒนาจำนวนมาก และแสดงให้เห็นว่าคุณสามารถแก้ปัญหา NLP ที่ประยุกต์ใช้ได้อย่างไรโดยไม่ต้องมีความรู้เชิงลึกเกี่ยวกับ Machine Learning และปริญญาเอกสาขาคณิตศาสตร์

งาน NLP รวมถึงการกำหนดความรู้สึกของข้อความ แยกวิเคราะห์เอนทิตีที่มีชื่อ การกำหนดสิ่งที่คู่สนทนาต้องการจากบอทของคุณ: สั่งพิซซ่าหรือรับข้อมูลเบื้องหลัง และอื่นๆ อีกมากมาย คุณสามารถอ่านเพิ่มเติมเกี่ยวกับงานและวิธีการ NLP ที่นี่.

ในบทความนี้ เราจะแสดงวิธีเรียกใช้เซิร์ฟเวอร์ REST ด้วยโมเดล NLP ที่ผ่านการฝึกอบรมมาแล้ว และพร้อมใช้งานโดยไม่ต้องมีการกำหนดค่าหรือการฝึกอบรมเพิ่มเติม

DeepPavlov สำหรับนักพัฒนา: #1 เครื่องมือ NLP และการสร้างแชทบอท

การติดตั้ง DeepPavlov

คำแนะนำสำหรับ Linux จะได้รับที่นี่และด้านล่าง สำหรับ Windows โปรดดูของเรา เอกสาร

  • สร้างและเปิดใช้งานสภาพแวดล้อมเสมือนจริงด้วย Python เวอร์ชันที่รองรับในปัจจุบัน:
    virtualelnv env -p python3.7
    source env/bin/activate
  • ติดตั้ง DeepPavlov ในสภาพแวดล้อมเสมือนจริง:
    pip install deeppavlov
    

การเปิดตัวเซิร์ฟเวอร์ REST ด้วยโมเดล DeepPavlov

ก่อนที่เราจะเปิดตัวเซิร์ฟเวอร์ด้วยโมเดล DeepPavlov เป็นครั้งแรก การพูดคุยเกี่ยวกับคุณสมบัติบางอย่างของสถาปัตยกรรมของไลบรารีจะมีประโยชน์

รุ่นใด ๆ ใน DP ประกอบด้วย:

  • รหัสหลาม;
  • ส่วนประกอบที่ดาวน์โหลดได้ - ผลการฝึกอบรมต่อเนื่องกับข้อมูลเฉพาะ (การฝัง น้ำหนักของโครงข่ายประสาทเทียม ฯลฯ)
  • ไฟล์การกำหนดค่า (ต่อไปนี้จะเรียกว่าการกำหนดค่า) ซึ่งมีข้อมูลเกี่ยวกับคลาสที่ใช้โดยโมเดล, URL ของส่วนประกอบที่ดาวน์โหลด, การพึ่งพา Python เป็นต้น

เราจะบอกคุณเพิ่มเติมเกี่ยวกับสิ่งที่อยู่ภายใต้การดูแลของ DeepPavlov ในบทความต่อไปนี้ ตอนนี้ก็เพียงพอแล้วสำหรับเราที่จะรู้ว่า:

  • โมเดลใดๆ ใน DeepPavlov จะถูกระบุด้วยชื่อของการกำหนดค่า
  • หากต้องการรันโมเดล คุณต้องดาวน์โหลดส่วนประกอบจากเซิร์ฟเวอร์ DeepPavlov
  • นอกจากนี้ ในการรันโมเดล คุณต้องติดตั้งไลบรารี Python ที่ใช้ด้วย

โมเดลแรกที่เราจะเปิดตัวคือ Named Entity Recognition (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
    

จากผลของการดำเนินการคำสั่งนี้ เซิร์ฟเวอร์ REST ที่มีโมเดลจะเปิดตัวบนพอร์ต 5005 ของเครื่องโฮสต์ (พอร์ตเริ่มต้นคือ 5000)

หลังจากเริ่มต้นโมเดลแล้ว คุณสามารถดู Swagger พร้อมเอกสารประกอบ API และความสามารถในการทดสอบได้ที่ URL http://127.0.0.1:5005. มาทดสอบโมเดลโดยส่งไปยังจุดสิ้นสุดกันดีกว่า http://127.0.0.1:5005/model คำขอ POST ที่มีเนื้อหา JSON ต่อไปนี้:

{
  "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

แต่ละโมเดล DeepPavlov มีอาร์กิวเมนต์อินพุตอย่างน้อยหนึ่งรายการ ใน REST API มีการตั้งชื่ออาร์กิวเมนต์ ชื่ออาร์กิวเมนต์คือคีย์ของพจนานุกรมที่เข้ามา ในกรณีส่วนใหญ่ อาร์กิวเมนต์คือข้อความที่ต้องประมวลผล ข้อมูลเพิ่มเติมเกี่ยวกับอาร์กิวเมนต์และค่าที่ส่งคืนโดยโมเดลสามารถพบได้ในส่วน MODELS ของเอกสารประกอบ ดีพพาฟลอฟ

ในตัวอย่าง รายการของสองสตริงถูกส่งผ่านไปยังอาร์กิวเมนต์ x ซึ่งแต่ละรายการได้รับการมาร์กอัปแยกกัน ใน DeepPavlov ทุกรุ่นจะใช้รายการ (ชุด) ของค่าที่ประมวลผลอย่างอิสระเป็นอินพุต

คำว่า “แบทช์” หมายถึงสาขาการเรียนรู้ของเครื่องและหมายถึงชุดของค่าอินพุตอิสระที่ประมวลผลโดยอัลกอริทึมหรือโครงข่ายประสาทเทียมพร้อมกัน แนวทางนี้ช่วยให้คุณลดเวลาที่โมเดลประมวลผลองค์ประกอบหนึ่งของชุดงาน (โดยมากมักมีนัยสำคัญ) เมื่อเทียบกับค่าเดียวกันที่ส่งไปยังอินพุตแยกกัน แต่ผลการประมวลผลจะออกหลังจากประมวลผลองค์ประกอบทั้งหมดแล้วเท่านั้น ดังนั้น เมื่อสร้างแบทช์ที่เข้ามา จำเป็นต้องคำนึงถึงความเร็วของโมเดลและเวลาประมวลผลที่จำเป็นสำหรับแต่ละองค์ประกอบด้วย

หากมีข้อโต้แย้งหลายประการสำหรับโมเดล DeepPavlov แต่ละข้อจะได้รับชุดค่าของตัวเอง และที่เอาต์พุต โมเดลจะสร้างคำตอบชุดเดียวเสมอ องค์ประกอบของแบตช์ขาออกคือผลลัพธ์ของการประมวลผลองค์ประกอบของแบตช์ขาเข้าด้วยดัชนีเดียวกัน

ในตัวอย่างข้างต้น ผลลัพธ์ของแบบจำลองคือการแบ่งแต่ละสตริงออกเป็นโทเค็น (คำและเครื่องหมายวรรคตอน) และจัดประเภทโทเค็นโดยสัมพันธ์กับเอนทิตีที่มีชื่อ (ชื่อองค์กร สกุลเงิน) ที่โทเค็นเป็นตัวแทน ปัจจุบันเป็นรุ่น ner_ontonotes_bert_mult สามารถจำแนกเอนทิตีที่มีชื่อได้ 18 ประเภท สามารถดูคำอธิบายโดยละเอียดได้ ที่นี่.

รุ่นอื่นๆ ที่แกะกล่องโดย DeepPavlov

นอกจาก NER แล้ว ยังมีรุ่นสำเร็จรูปต่อไปนี้ใน DeepPavlov ในขณะที่เขียน:

ข้อความตอบคำถาม

ตอบคำถามด้วยส่วนของข้อความนี้ การกำหนดค่าโมเดล: Squad_ru_bert_infer

คำขอตัวอย่าง:

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

ผล:

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

การตรวจจับการดูถูก

การตรวจจับการดูหมิ่นบุคคลที่กล่าวถึงข้อความ (ในขณะที่เขียน - สำหรับภาษาอังกฤษเท่านั้น) การกำหนดค่าโมเดล: insults_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 ใด ๆ ผลลัพธ์ที่ดีที่สุดจะเกิดขึ้นได้เมื่อฝึกอบรมแบบจำลองบนชุดข้อมูลที่สอดคล้องกับสาขาวิชา (โดเมน) ของงาน นอกจากนี้ โดยหลักการแล้ว โมเดลจำนวนมากขึ้นไม่สามารถฝึกได้ในทุกสถานการณ์

ในบทความต่อไปนี้ เราจะดูการตั้งค่าเพิ่มเติมของไลบรารี การเปิดตัว DeepPavlov จาก Docker จากนั้นเราจะไปยังโมเดลการฝึกอบรม และอย่าลืมว่า DeepPavlov มี ฟอรั่ม – ถามคำถามของคุณเกี่ยวกับห้องสมุดและแบบจำลอง ขอขอบคุณสำหรับความสนใจของคุณ!

ที่มา: will.com

เพิ่มความคิดเห็น