Cloud Natural Language API ช่วยให้คุณแยกเอนทิตีจากข้อความ วิเคราะห์ความเห็นและไวยากรณ์ รวมถึงจัดประเภทข้อความเป็นหมวดหมู่ได้
ใน Lab นี้ เราจะเรียนรู้วิธีใช้ Natural Language API เพื่อวิเคราะห์เอนทิตี ความรู้สึก และไวยากรณ์
สิ่งที่คุณจะได้เรียนรู้
- การสร้างคำขอ Natural Language API และการเรียกใช้ API ด้วย curl
- การแยกเอนทิตีและการวิเคราะห์ความเห็นในข้อความด้วย Natural Language API
- การวิเคราะห์ภาษาศาสตร์ในข้อความด้วย Natural Language API
- การสร้างคำขอ Natural Language API ในภาษาอื่น
สิ่งที่ต้องมี
คุณจะใช้บทแนะนำนี้อย่างไร
คุณจะให้คะแนนประสบการณ์การใช้งาน Google Cloud Platform เท่าไร
การตั้งค่าสภาพแวดล้อมแบบเรียนรู้ด้วยตนเอง
หากยังไม่มีบัญชี Google (Gmail หรือ Google Apps) คุณต้องสร้างบัญชี ลงชื่อเข้าใช้คอนโซล Google Cloud Platform (console.cloud.google.com) แล้วสร้างโปรเจ็กต์ใหม่โดยทำดังนี้
โปรดจดจำรหัสโปรเจ็กต์ ซึ่งเป็นชื่อที่ไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมด (ชื่อด้านบนถูกใช้ไปแล้วและจะใช้ไม่ได้ ขออภัย) ซึ่งจะเรียกว่า PROJECT_ID ในภายหลังใน Codelab นี้
จากนั้นคุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร Google Cloud
การทำ Codelab นี้ไม่ควรมีค่าใช้จ่ายเกิน 2-3 ดอลลาร์ แต่ก็อาจมีค่าใช้จ่ายมากกว่านี้หากคุณตัดสินใจใช้ทรัพยากรเพิ่มเติมหรือปล่อยให้ทรัพยากรทำงานต่อไป (ดูส่วน "การล้างข้อมูล" ที่ท้ายเอกสารนี้)
ผู้ใช้ใหม่ของ Google Cloud Platform มีสิทธิ์ทดลองใช้ฟรี$300
คลิกไอคอนเมนูที่ด้านซ้ายบนของหน้าจอ

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

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

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

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

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

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

เซสชัน Cloud Shell จะเปิดในเฟรมใหม่ที่ด้านล่างของคอนโซลและแสดงข้อความแจ้งบรรทัดคำสั่ง รอจนกว่าพรอมต์ user@project:~$ จะปรากฏขึ้น
เนื่องจากเราจะใช้ Curl เพื่อส่งคำขอไปยัง 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
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 ของวิกิพีเดียที่เชื่อมโยง (หากมี), 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 ประเภท ได้แก่ ความรู้สึกสำหรับเอกสารโดยรวม และความรู้สึกที่แยกตามประโยค เมธอดความรู้สึกจะแสดงผล 2 ค่า ได้แก่ score และ magnitude score คือตัวเลขตั้งแต่ -1.0 ถึง 1.0 ที่บ่งบอกว่าข้อความนั้นเป็นบวกหรือลบมากน้อยเพียงใด magnitude คือตัวเลขตั้งแต่ 0 ถึงอนันต์ที่แสดงถึงน้ำหนักของความรู้สึกที่แสดงในข้อความ ไม่ว่าจะเป็นบวกหรือลบ บล็อกข้อความที่ยาวขึ้นซึ่งมีข้อความที่มีน้ำหนักมากจะมีค่า Magnitude สูงขึ้น คะแนนของประโยคแรกเป็นบวก (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 รายการ ได้แก่ รายการหนึ่งสำหรับ "ซูชิ" และอีกรายการหนึ่งสำหรับ "บริการ" นี่คือการตอบกลับ 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"
}
เราจะเห็นว่าคะแนนที่แสดงผลสำหรับ "ซูชิ" คือ 0.9 ในขณะที่ "บริการ" ได้คะแนน -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" คือ "use") ตัวอย่างเช่น คำว่า run, runs, ran และ running มีคำหลักเป็น run ค่า Lemma มีประโยชน์ในการติดตามการเกิดของคำในข้อความขนาดใหญ่เมื่อเวลาผ่านไป
dependencyEdge มีข้อมูลที่คุณใช้สร้างแผนผังการแยกวิเคราะห์การพึ่งพาของข้อความได้ นี่คือแผนภาพที่แสดงความสัมพันธ์ของคำในประโยค แผนผังการแยกวิเคราะห์การพึ่งพาสำหรับประโยคด้านบนจะมีลักษณะดังนี้

headTokenIndex ในคำตอบด้านบนคือดัชนีของโทเค็นที่มีส่วนโค้งชี้ไปที่ "uses" เราสามารถคิดว่าโทเค็นแต่ละรายการในประโยคเป็นคำในอาร์เรย์ และ headTokenIndex ของ 2 สำหรับ "uses" หมายถึงคำว่า "often" ซึ่งเชื่อมต่อกับคำว่า "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
- ทำการวิเคราะห์ทางภาษาศาสตร์กับข้อความเพื่อสร้างแผนผังการแยกวิเคราะห์การพึ่งพา
- การสร้างคำขอ Natural Language API เป็นภาษาญี่ปุ่น
ขั้นตอนถัดไป
- ดูบทแนะนำเกี่ยวกับ Natural Language API ในเอกสารประกอบ
- ลองใช้ Vision API และ Speech API