การวิเคราะห์เอนทิตี อารมณ์ และภาษาด้วย Cloud Natural Language API

Cloud Natural Language API ช่วยให้คุณแยกเอนทิตีออกจากข้อความ วิเคราะห์ความเห็น และวิเคราะห์ไวยากรณ์ และจัดประเภทข้อความเป็นหมวดหมู่ได้

ในห้องทดลองนี้ เราจะเรียนรู้วิธีใช้ Natural Language API เพื่อวิเคราะห์เอนทิตี อารมณ์ และไวยากรณ์

สิ่งที่จะได้เรียนรู้

  • การสร้างคําขอ Natural Language API และเรียก API ด้วย Curl
  • การแยกเอนทิตีและเรียกใช้การวิเคราะห์ความเห็นในข้อความด้วย Natural Language API
  • การวิเคราะห์ภาษาโดยใช้ข้อความด้วย Natural Language API
  • การสร้างคําขอ Natural Language API ในภาษาอื่น

สิ่งที่ต้องการ

  • โครงการ Google Cloud Platform
  • เบราว์เซอร์ เช่น Chrome หรือ Firefox

คุณจะใช้บทแนะนํานี้อย่างไร

อ่านจบเท่านั้น อ่านและตอบแบบฝึกหัด

คุณจะให้คะแนนประสบการณ์การใช้งาน Google Cloud Platform ของคุณมากน้อยเพียงใด

มือใหม่ ปานกลาง เชี่ยวชาญ

การตั้งค่าสภาพแวดล้อมด้วยตนเอง

หากยังไม่มีบัญชี Google (Gmail หรือ Google Apps) คุณต้องสร้างบัญชี ลงชื่อเข้าใช้คอนโซล Google Cloud Platform (console.cloud.google.com) และสร้างโปรเจ็กต์ใหม่ ดังนี้

ภาพหน้าจอจาก 2016-02-10 12:45:26.png

โปรดทราบว่ารหัสโปรเจ็กต์ ซึ่งเป็นชื่อที่ไม่ซ้ํากันสําหรับโปรเจ็กต์ Google Cloud ทั้งหมด (ชื่อข้างต้นมีผู้อื่นนําไปใช้แล้ว ขออภัยในความไม่สะดวก) และจะเรียกใน Codelab นี้ว่า PROJECT_ID ในภายหลัง

จากนั้นคุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากรของ Google Cloud

การเรียกใช้ Codelab นี้ไม่ควรมีค่าใช้จ่ายเกิน 2-3 ดอลลาร์ แต่อาจมากกว่านั้นหากคุณตัดสินใจใช้ทรัพยากรเพิ่มเติมหรือปล่อยให้ทรัพยากรทํางาน (ดู "cleanup" ในตอนท้ายของเอกสารนี้)

ผู้ใช้ใหม่ของ Google Cloud Platform มีสิทธิ์รับช่วงทดลองใช้ฟรี $300

คลิกไอคอนเมนูที่ด้านซ้ายบนของหน้าจอ

เลือก API และบริการจากเมนูแบบเลื่อนลงแล้วคลิกที่หน้าแดชบอร์ด

คลิกเปิดใช้ API และบริการ

จากนั้นค้นหา "language" ในช่องค้นหา คลิก Google Cloud Natural Language API:

คลิกเปิดใช้เพื่อเปิดใช้ Cloud Natural Language API

โปรดรอสักครู่เพื่อเปิดใช้ คุณจะเห็นข้อมูลนี้เมื่อเปิดใช้แล้ว

Google Cloud Shell คือสภาพแวดล้อมบรรทัดคําสั่งที่ทํางานในระบบคลาวด์ เครื่องเสมือนแบบ Debian นี้เต็มไปด้วยเครื่องมือสําหรับการพัฒนาทั้งหมดที่คุณต้องมี (gcloud, bq, git และอื่นๆ) และให้บริการไดเรกทอรีหน้าแรกขนาด 5GB อย่างถาวร เราจะใช้ Cloud Shell เพื่อสร้างคําขอไปยัง Natural Language API

เริ่มต้นใช้งาน Cloud Shell โดยคลิกไอคอน "เปิดใช้งาน Google Cloud Shell" Screen Shot 2015-06-08 เวลา 17:30.32 น. ที่มุมขวาบนของแถบส่วนหัว

เซสชัน Cloud Shell จะเปิดในเฟรมใหม่ที่ด้านล่างของคอนโซลและแสดงข้อความแจ้งบรรทัดคำสั่ง รอจนกว่าข้อความแจ้ง user@project:~$ จะปรากฏขึ้น

เนื่องจากเราจะใช้ URL เพื่อส่งคําขอไปยัง Natural Language API เราจึงต้องสร้างคีย์ API เพื่อส่งผ่าน URL คําขอของเรา หากต้องการสร้างคีย์ API ให้ไปที่ส่วนข้อมูลเข้าสู่ระบบของ API และบริการใน Cloud Console ดังนี้

เลือกคีย์ API ในเมนูแบบเลื่อนลง ดังนี้

ถัดไป ให้คัดลอกคีย์ที่เพิ่งสร้าง คุณจะต้องใช้กุญแจนี้ในภายหลังในห้องปฏิบัติการ

ตอนนี้คุณมีคีย์ API แล้ว ให้บันทึกไว้ในตัวแปรสภาพแวดล้อมเพื่อหลีกเลี่ยงการแทรกค่าของคีย์ API ในคําขอแต่ละรายการ โดยใช้ Cloud Shell โปรดแทนที่ <your_api_key> ด้วยคีย์ที่คุณเพิ่งคัดลอก

export API_KEY=<YOUR_API_KEY>

วิธี Natural Language API แรกที่เราใช้คือ analyzeEntities วิธีนี้จะทําให้ API แยกเอนทิตี (เช่น ผู้คน สถานที่ และกิจกรรม) ออกจากข้อความได้ หากต้องการลองใช้การวิเคราะห์เอนทิตีของ API&#39 เราจะใช้ประโยคต่อไปนี้

Joanne Rowling เขียนภายใต้ชื่อปากกา J. K. Rowling และ Robert Galbraith เป็นนักเขียนนิยายและนักเขียนบทภาพยนตร์ชาวอังกฤษซึ่งเขียนซีรีส์แฟนตาซีเรื่องแฮร์รี่ พอตเตอร์

เราจะสร้างคําขอไปยัง Natural Language API ในไฟล์ request.json ในสภาพแวดล้อม Cloud Shell ให้สร้างไฟล์ request.json โดยใช้โค้ดด้านล่าง คุณจะสร้างไฟล์โดยใช้ตัวแก้ไขบรรทัดคําสั่งที่ต้องการ (nano, vim, emacs) หรือใช้ตัวแก้ไข Orion ในตัวใน Cloud Shell ก็ได้ ดังนี้

request.json

{
  "document":{
    "type":"PLAIN_TEXT",
    "content":"Joanne Rowling, who writes under the pen names J. K. Rowling and Robert Galbraith, is a British novelist and screenwriter who wrote the Harry Potter fantasy series."
  },
  "encodingType":"UTF8"
}

ในคําขอ เราจะบอก Natural Language API เกี่ยวกับข้อความที่เราจะส่ง ค่าประเภทที่รองรับคือ PLAIN_TEXT หรือ HTML ในเนื้อหา เราจะส่งข้อความไปยัง Natural Language API สําหรับการวิเคราะห์ นอกจากนี้ Natural Language API ยังรองรับการส่งไฟล์ที่จัดเก็บไว้ใน Cloud Storage เพื่อประมวลผลข้อความด้วย หากต้องการส่งไฟล์จาก Cloud Storage เราจะแทนที่ content ด้วย gcsContentUri และระบุค่าของไฟล์ข้อความ URI ใน Cloud Storage encodingType จะบอก API ว่าจะใช้การเข้ารหัสข้อความประเภทใดเมื่อประมวลผลข้อความ API จะใช้ค่านี้เพื่อคํานวณหาตําแหน่งบุคคลที่ปรากฏในข้อความของเรา

ตอนนี้คุณสามารถส่งเนื้อความคําขอไปพร้อมๆ กับตัวแปรสภาพแวดล้อมคีย์ API ที่บันทึกไว้ก่อนหน้านี้ไปยัง Natural Language API ได้ด้วยคําสั่ง curl ต่อไปนี้ (ทั้งหมดในบรรทัดบรรทัดคําสั่งเดียว)

curl "https://language.googleapis.com/v1/documents:analyzeEntities?key=${API_KEY}" \
  -s -X POST -H "Content-Type: application/json" --data-binary @request.json

จุดเริ่มต้นของการตอบกลับควรมีลักษณะดังนี้

{
  "entities": [
     {
      "name": "Robert Galbraith",
      "type": "PERSON",
      "metadata": {
        "mid": "/m/042xh",
        "wikipedia_url": "https://en.wikipedia.org/wiki/J._K._Rowling"
      },
      "salience": 0.7980405,
      "mentions": [
        {
          "text": {
            "content": "Joanne Rowling",
            "beginOffset": 0
          },
          "type": "PROPER"
        },
        {
          "text": {
            "content": "Rowling",
            "beginOffset": 53
          },
          "type": "PROPER"
        },
        {
          "text": {
            "content": "novelist",
            "beginOffset": 96
          },
          "type": "COMMON"
        },
        {
          "text": {
            "content": "Robert Galbraith",
            "beginOffset": 65
          },
          "type": "PROPER"
        }
      ]
    },

    ...
  ]
}

สําหรับแต่ละเอนทิตีในการตอบกลับ เราจะได้รับเอนทิตี type, URL ของ Wikipedia ที่เกี่ยวข้อง หากมี, salience และดัชนีที่เอนทิตีนี้ปรากฏในข้อความ ความระวังคือตัวเลขในช่วง [0,1] ที่หมายถึงศูนย์กลางของเอนทิตีกับข้อความโดยรวม นอกจากนี้ Natural Language API ยังจดจําเอนทิตีเดียวกันที่กล่าวถึงได้หลายวิธีด้วย ดูรายการ mentions ในการตอบกลับ โดย API สามารถบอกได้ว่า "Joanne Rowling", "Rowling", "novelist" & "Robert Galbriath" ทั้งหมดชี้ไปยังสิ่งเดียวกัน

นอกจากการดึงเอนทิตีแล้ว Natural Language API ยังให้คุณวิเคราะห์ความเห็นในบล็อกข้อความได้ด้วย คําขอ JSON จะมีพารามิเตอร์เดียวกันกับคําขอข้างต้น แต่ในครั้งนี้เราจะเปลี่ยนข้อความให้แสดงถึงความรู้สึกที่ชัดเจนยิ่งขึ้น แทนที่ไฟล์ request.json ด้วยข้อมูลต่อไปนี้ และแทนที่ content ด้านล่างด้วยข้อความของคุณเอง ดังนี้

request.json

 {
  "document":{
    "type":"PLAIN_TEXT",
    "content":"Harry Potter is the best book. I think everyone should read it."
  },
  "encodingType": "UTF8"
}

ถัดไป เราจะส่งคําขอไปยังปลายทาง analyzeSentiment ของ API

curl "https://language.googleapis.com/v1/documents:analyzeSentiment?key=${API_KEY}" \
  -s -X POST -H "Content-Type: application/json" --data-binary @request.json

การตอบกลับของคุณควรมีลักษณะดังนี้

{
  "documentSentiment": {
    "magnitude": 0.8,
    "score": 0.4
  },
  "language": "en",
  "sentences": [
    {
      "text": {
        "content": "Harry Potter is the best book.",
        "beginOffset": 0
      },
      "sentiment": {
        "magnitude": 0.7,
        "score": 0.7
      }
    },
    {
      "text": {
        "content": "I think everyone should read it.",
        "beginOffset": 31
      },
      "sentiment": {
        "magnitude": 0.1,
        "score": 0.1
      }
    }
  ]
}

โปรดสังเกตว่าเราได้รับค่าความเห็น 2 ประเภท ได้แก่ ความเห็นสําหรับเอกสารโดยรวม และความเห็นโดยแจกแจงเป็นประโยค วิธีความเห็นส่งคืนค่าสองค่า: score และ magnitude score เป็นตัวเลขตั้งแต่ -1.0 ถึง 1.0 ซึ่งบ่งชี้ว่าข้อความเชิงบวกหรือเชิงลบคืออะไร magnitude เป็นตัวเลขตั้งแต่ 0 ถึงไร้ขอบที่แสดงถึงน้ําหนักของความรู้สึกที่แสดงในใบแจ้งยอด โดยไม่คํานึงถึงค่าบวกหรือค่าลบ บล็อกข้อความที่ยาวขึ้นซึ่งมีข้อความถ่วงน้ําหนักสูงจะมีค่าขนาดที่สูงกว่า คะแนนสําหรับประโยคแรกของเราเป็นบวก (0.7) ในขณะที่คะแนนของประโยคที่สองเป็นกลาง (0.1)

นอกจากการให้รายละเอียดความเห็นในเอกสารข้อความทุกฉบับที่เราส่ง NL API แล้ว ยังแจกแจงรายละเอียดความเห็นโดยบุคคลในข้อความของเราได้ด้วย มาใช้ประโยคต่อไปนี้เป็นตัวอย่าง

ฉันชอบซูชิแต่บริการแย่มาก

ในกรณีนี้ การได้คะแนนความเห็นของทั้งประโยคดังที่ระบุไว้ข้างต้นอาจไม่มีประโยชน์มากนัก หากรีวิวนี้เป็นรีวิวร้านอาหารและมีรีวิวสําหรับร้านอาหารเดียวกันหลายร้อยรายการ เราต้องการทราบสิ่งที่ผู้คนชอบและไม่ชอบในรีวิวของตน โชคยังดีที่ NL API จะมีวิธีการที่ช่วยให้เรารับฟังความเห็นสําหรับแต่ละเอนทิตีในข้อความของเราที่ชื่อ analyzeEntitySentiment อัปเดต request.json ด้วยประโยคข้างต้นเพื่อลองใช้

request.json

 {
  "document":{
    "type":"PLAIN_TEXT",
    "content":"I liked the sushi but the service was terrible."
  },
  "encodingType": "UTF8"
}

จากนั้นเรียกใช้ปลายทาง analyzeEntitySentiment ด้วยคําสั่ง curl ต่อไปนี้

curl "https://language.googleapis.com/v1/documents:analyzeEntitySentiment?key=${API_KEY}" \
  -s -X POST -H "Content-Type: application/json" --data-binary @request.json

ในการตอบกลับ เราจะส่งคืนออบเจ็กต์เอนทิตี 2 รายการ ได้แก่ รายการหนึ่งสําหรับ "sushi" และอีกรายการสําหรับ "service." การตอบกลับ JSON แบบเต็มมีดังนี้

{
  "entities": [
    {
      "name": "sushi",
      "type": "CONSUMER_GOOD",
      "metadata": {},
      "salience": 0.52716845,
      "mentions": [
        {
          "text": {
            "content": "sushi",
            "beginOffset": 12
          },
          "type": "COMMON",
          "sentiment": {
            "magnitude": 0.9,
            "score": 0.9
          }
        }
      ],
      "sentiment": {
        "magnitude": 0.9,
        "score": 0.9
      }
    },
    {
      "name": "service",
      "type": "OTHER",
      "metadata": {},
      "salience": 0.47283158,
      "mentions": [
        {
          "text": {
            "content": "service",
            "beginOffset": 26
          },
          "type": "COMMON",
          "sentiment": {
            "magnitude": 0.9,
            "score": -0.9
          }
        }
      ],
      "sentiment": {
        "magnitude": 0.9,
        "score": -0.9
      }
    }
  ],
  "language": "en"
}

เราพบว่าคะแนนที่แสดงผลสําหรับ "sushi" เป็น 0.9 ในขณะที่ &&tt;service" ได้คะแนน -0.9 สุดยอด! นอกจากนี้ คุณอาจสังเกตเห็นว่ามีการส่งออบเจ็กต์ความรู้สึก 2 รายการสําหรับแต่ละเอนทิตี หากมีการกล่าวถึงข้อความใดข้อความหนึ่งมากกว่า 1 ครั้ง API จะส่งคะแนนความเห็นและความละเอียดที่แตกต่างกันสําหรับการพูดถึงแต่ละครั้ง รวมถึงความเห็นโดยรวมสําหรับเอนทิตี

เมื่อพิจารณาวิธีที่ 3 ของ Natural Language API &คําอธิบายประกอบคําอธิบายประกอบไวยากรณ์ เราจะเจาะลึกลงไปในรายละเอียดด้านภาษาของข้อความ analyzeSyntax คือวิธีระบุรายละเอียดแบบเต็มเกี่ยวกับองค์ประกอบทางความหมายและไวยากรณ์ของข้อความ API จะบอกชนิดของคํา (คํานาม คํากริยา คําคุณศัพท์ ฯลฯ) แต่ละคําและคําที่เกี่ยวข้องกับคําอื่นๆ ในประโยค (เป็นคํากริยารากของคําหรือไม่) ตัวแก้ไข)

มาลองใช้กับประโยคง่ายๆ กัน คําขอ JSON ของเราจะเหมือนกับคําขอด้านบน โดยเพิ่มคีย์ฟีเจอร์ การดําเนินการนี้จะบอก API ว่าเราต้องการใส่คําอธิบายประกอบไวยากรณ์ แทนที่ request.json ด้วยสิ่งต่อไปนี้

request.json

{
  "document":{
    "type":"PLAIN_TEXT",
    "content": "Hermione often uses her quick wit, deft recall, and encyclopaedic knowledge to help Harry and Ron."
  },
  "encodingType": "UTF8"
}

จากนั้นเรียกเมธอด analyzeSyntax ของ API ต่อไปนี้

curl "https://language.googleapis.com/v1/documents:analyzeSyntax?key=${API_KEY}" \
  -s -X POST -H "Content-Type: application/json" --data-binary @request.json

การตอบกลับควรแสดงออบเจ็กต์ที่คล้ายกับด้านล่างนี้สําหรับโทเค็นแต่ละรายการในประโยค ทีนี้เราจะเห็นคําตอบของคําว่า "uses"

{
  "text": {
    "content": "uses",
    "beginOffset": 15
  },
  "partOfSpeech": {
    "tag": "VERB",
    "aspect": "ASPECT_UNKNOWN",
    "case": "CASE_UNKNOWN",
    "form": "FORM_UNKNOWN",
    "gender": "GENDER_UNKNOWN",
    "mood": "INDICATIVE",
    "number": "SINGULAR",
    "person": "THIRD",
    "proper": "PROPER_UNKNOWN",
    "reciprocity": "RECIPROCITY_UNKNOWN",
    "tense": "PRESENT",
    "voice": "VOICE_UNKNOWN"
  },
    "dependencyEdge": {
      "headTokenIndex": 2,
      "label": "ROOT"
    },
    "lemma": "use"
}

มาแจกแจงคําตอบกัน partOfSpeech บอกรายละเอียดทางภาษาสําหรับแต่ละคํา (ไม่ทราบรายละเอียดเนื่องจากคําเหล่านี้ไม่ใช่ภาษาอังกฤษหรือคําเฉพาะ) tag จะให้ส่วนหนึ่งส่วนใดของคํานี้ ในกรณีนี้ นอกจากนี้ เรายังแสดงรายละเอียดเกี่ยวกับกาล, รูปแบบ และดูว่าคํานั้นๆ เป็นรูปเอกพจน์หรือพหูพจน์หรือไม่ lemma คือรูปแบบ Canonical ของคํา (สําหรับ "uses" it's "use") ตัวอย่างเช่น คําว่าวิ่ง วิ่ง เรียกใช้ และการวิ่งล้วนมี Lemma run ค่า lemma มีประโยชน์ในการติดตามรายการคําในข้อความขนาดใหญ่เมื่อเวลาผ่านไป

dependencyEdge มีข้อมูลที่คุณใช้สร้างโครงสร้างการแยกวิเคราะห์ Dependency ของข้อความได้ ซึ่งเป็นแผนภาพที่แสดงให้เห็นว่าคําต่างๆ ในประโยคมีความเกี่ยวข้องกันอย่างไร โครงสร้างการแยกวิเคราะห์แบบอ้างอิงสําหรับประโยคข้างต้นจะมีลักษณะดังนี้

headTokenIndex ในการตอบกลับของเราข้างต้นคือดัชนีของโทเค็นที่มีกราฟโค้งที่ "uses" เราสามารถมองแต่ละโทเค็นในประโยคเป็นคําในอาร์เรย์ และ headTokenIndex จาก 2 สําหรับ "uses" อ้างถึงคําว่า "มักเป็น" ซึ่งเชื่อมกันในแผนผัง

Natural Language API รองรับภาษาอื่นนอกเหนือจากภาษาอังกฤษด้วย (ดูรายการทั้งหมดได้ที่นี่) ลองใช้คําขอเอนทิตีต่อไปนี้พร้อมประโยคภาษาญี่ปุ่น

request.json

{
  "document":{
    "type":"PLAIN_TEXT",
    "content":"日本のグーグルのオフィスは、東京の六本木ヒルズにあります"
  },
  "encodingType": "UTF8"
}

โปรดสังเกตว่าเราไม่ได้บอก API ว่าข้อความของเราเป็นภาษาใด ก็จะตรวจพบ API ได้โดยอัตโนมัติ ต่อไปเราจะส่งอุปกรณ์ไปที่ปลายทาง analyzeEntities

curl "https://language.googleapis.com/v1/documents:analyzeEntities?key=${API_KEY}" \
  -s -X POST -H "Content-Type: application/json" --data-binary @request.json

และนี่คือ 2 เอนทิตีแรกในการตอบกลับของเรา

{
  "entities": [
    {
      "name": "日本",
      "type": "LOCATION",
      "metadata": {
        "mid": "/m/03_3d",
        "wikipedia_url": "https://en.wikipedia.org/wiki/Japan"
      },
      "salience": 0.23854347,
      "mentions": [
        {
          "text": {
            "content": "日本",
            "beginOffset": 0
          },
          "type": "PROPER"
        }
      ]
    },
    {
      "name": "グーグル",
      "type": "ORGANIZATION",
      "metadata": {
        "mid": "/m/045c7b",
        "wikipedia_url": "https://en.wikipedia.org/wiki/Google"
      },
      "salience": 0.21155767,
      "mentions": [
        {
          "text": {
            "content": "グーグル",
            "beginOffset": 9
          },
          "type": "PROPER"
        }
      ]
    },
    ...
  ]
  "language": "ja"
}

API จะแยกญี่ปุ่นเป็นสถานที่ตั้งและ Google เป็นองค์กร รวมทั้งหน้า Wikipedia สําหรับแต่ละโดเมน

คุณได้เรียนรู้การวิเคราะห์ข้อความด้วย Cloud Natural Language API โดยการแยกเอนทิตี การวิเคราะห์ความเห็น และทําคําอธิบายประกอบไวยากรณ์

สิ่งที่เราพูดถึง

  • การสร้างคําขอ Natural Language API และเรียก API ด้วย Curl
  • การแยกเอนทิตีและเรียกใช้การวิเคราะห์ความเห็นในข้อความด้วย Natural Language API
  • การดําเนินการวิเคราะห์ภาษาในข้อความเพื่อสร้างโครงสร้างการแยกวิเคราะห์ทรัพยากร Dependency
  • การสร้างคําขอ Natural Language API เป็นภาษาญี่ปุ่น

ขั้นตอนถัดไป