Phân tích đối tượng, ý kiến và cú pháp bằng Cloud Natural Language API

Cloud Natural Language API cho phép bạn trích xuất các thực thể từ văn bản, thực hiện phân tích cú pháp và ý kiến, đồng thời phân loại văn bản thành các danh mục.

Trong phòng thí nghiệm này, chúng ta sẽ tìm hiểu cách sử dụng Natural Language API để phân tích thực thể, tình cảm và cú pháp.

Kiến thức bạn sẽ học được

  • Tạo yêu cầu Natural Language API và gọi API bằng curl
  • Trích xuất thực thể và chạy phân tích tình cảm trên văn bản bằng Natural Language API
  • Thực hiện phân tích ngôn ngữ trên văn bản bằng Natural Language API
  • Tạo yêu cầu Natural Language API bằng một ngôn ngữ khác

What you'll need

  • Một dự án trên Google Cloud Platform
  • Một trình duyệt, chẳng hạn như Chrome hoặc Firefox

Bạn sẽ sử dụng hướng dẫn này như thế nào?

Chỉ đọc Đọc và hoàn thành bài tập

Bạn đánh giá thế nào về trải nghiệm của mình với Google Cloud Platform?

Người mới bắt đầu Trung cấp Thành thạo

Thiết lập môi trường theo tốc độ của riêng bạn

Nếu chưa có Tài khoản Google (Gmail hoặc Google Apps), bạn phải tạo một tài khoản. Đăng nhập vào bảng điều khiển Google Cloud Platform (console.cloud.google.com) rồi tạo một dự án mới:

Ảnh chụp màn hình từ 2016-02-10 12:45:26.png

Hãy nhớ mã dự án, một tên duy nhất trong tất cả các dự án trên Google Cloud (tên ở trên đã được sử dụng và sẽ không hoạt động đối với bạn, xin lỗi!). Sau này trong lớp học lập trình này, chúng ta sẽ gọi nó là PROJECT_ID.

Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên của Google Cloud.

Việc thực hiện lớp học lập trình này sẽ không tốn của bạn quá vài đô la, nhưng có thể tốn nhiều hơn nếu bạn quyết định sử dụng nhiều tài nguyên hơn hoặc nếu bạn để các tài nguyên đó chạy (xem phần "dọn dẹp" ở cuối tài liệu này).

Người dùng mới của Google Cloud Platform đủ điều kiện dùng thử miễn phí 300 USD.

Nhấp vào biểu tượng trình đơn ở trên cùng bên trái màn hình.

Chọn API và dịch vụ trong trình đơn thả xuống rồi nhấp vào Trang tổng quan

Nhấp vào Bật API và dịch vụ.

Sau đó, hãy tìm "ngôn ngữ" trong hộp tìm kiếm. Nhấp vào Google Cloud Natural Language API:

Nhấp vào Bật để bật Cloud Natural Language API:

Chờ vài giây để tính năng này bật. Bạn sẽ thấy thông báo này sau khi bật tính năng:

Google Cloud Shell là một môi trường dòng lệnh chạy trên Cloud. Máy ảo dựa trên Debian này được trang bị tất cả các công cụ phát triển mà bạn cần (gcloud, bq, git và các công cụ khác) và cung cấp một thư mục chính có dung lượng 5 GB. Chúng ta sẽ sử dụng Cloud Shell để tạo yêu cầu cho Natural Language API.

Để bắt đầu sử dụng Cloud Shell, hãy nhấp vào biểu tượng "Kích hoạt Google Cloud Shell" Screen Shot 2015-06-08 at 5.30.32 PM.png ở góc trên cùng bên phải của thanh tiêu đề

Một phiên Cloud Shell sẽ mở ra trong một khung hình mới ở cuối bảng điều khiển và hiển thị một dấu nhắc dòng lệnh. Chờ cho đến khi lời nhắc user@project:~$ xuất hiện

Vì sẽ dùng curl để gửi yêu cầu đến Natural Language API, nên chúng ta cần tạo một khoá API để truyền vào URL yêu cầu. Để tạo khoá API, hãy chuyển đến phần Thông tin xác thực của API và dịch vụ trong bảng điều khiển Cloud:

Trong trình đơn thả xuống, hãy chọn Khoá API:

Tiếp theo, hãy sao chép khoá bạn vừa tạo. Bạn sẽ cần khoá này sau trong lớp học.

Giờ đây, bạn đã có khoá API, hãy lưu khoá này vào một biến môi trường để không phải chèn giá trị của khoá API vào mỗi yêu cầu. Bạn có thể thực hiện việc này trong Cloud Shell. Hãy nhớ thay thế <your_api_key> bằng khoá mà bạn vừa sao chép.

export API_KEY=<YOUR_API_KEY>

Phương thức Natural Language API đầu tiên mà chúng ta sẽ sử dụng là analyzeEntities. Với phương thức này, API có thể trích xuất các thực thể (như người, địa điểm và sự kiện) từ văn bản. Để thử phân tích thực thể của API, chúng ta sẽ sử dụng câu sau:

Joanne Rowling, người viết sách dưới bút danh J. I.K. Rowling và Robert Galbraith, là một tiểu thuyết gia và nhà biên kịch người Anh, người đã viết bộ truyện giả tưởng Harry Potter.

Chúng ta sẽ tạo yêu cầu cho Natural Language API trong tệp request.json. Trong môi trường Cloud Shell, hãy tạo tệp request.json bằng mã bên dưới. Bạn có thể tạo tệp bằng một trong các trình chỉnh sửa dòng lệnh mà bạn muốn (nano, vim, emacs) hoặc sử dụng trình chỉnh sửa Orion tích hợp trong 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"
}

Trong yêu cầu này, chúng ta sẽ cho Natural Language API biết về văn bản mà chúng ta sẽ gửi. Giá trị loại được hỗ trợ là PLAIN_TEXT hoặc HTML. Trong nội dung, chúng ta sẽ truyền văn bản để gửi đến Natural Language API để phân tích. Natural Language API cũng hỗ trợ gửi các tệp được lưu trữ trong Cloud Storage để xử lý văn bản. Nếu muốn gửi một tệp từ Cloud Storage, chúng ta sẽ thay thế content bằng gcsContentUri và đặt giá trị là uri của tệp văn bản trong Cloud Storage. encodingType cho API biết loại mã hoá văn bản cần sử dụng khi xử lý văn bản của chúng ta. API sẽ dùng thông tin này để tính toán vị trí xuất hiện của các thực thể cụ thể trong văn bản của chúng tôi.

Giờ đây, bạn có thể truyền nội dung yêu cầu cùng với biến môi trường khoá API mà bạn đã lưu trước đó đến Natural Language API bằng lệnh curl sau (tất cả trong một dòng lệnh):

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

Phần đầu của câu trả lời sẽ có dạng như sau:

{
  "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"
        }
      ]
    },

    ...
  ]
}

Đối với mỗi thực thể trong phản hồi, chúng ta sẽ nhận được thực thể type, URL Wikipedia được liên kết (nếu có), salience và chỉ mục về vị trí xuất hiện của thực thể này trong văn bản. Mức độ nổi bật là một số trong phạm vi [0,1] cho biết mức độ quan trọng của thực thể đối với văn bản nói chung. Natural Language API cũng có thể nhận dạng cùng một thực thể được đề cập theo nhiều cách. Hãy xem danh sách mentions trong phản hồi: API có thể cho biết rằng "Joanne Rowling", "Rowling", "tiểu thuyết gia" và "Robert Galbriath" đều chỉ đến cùng một người.

Ngoài việc trích xuất các thực thể, Natural Language API còn cho phép bạn phân tích ý kiến về một khối văn bản. Yêu cầu JSON của chúng ta sẽ bao gồm các tham số giống như yêu cầu ở trên, nhưng lần này chúng ta sẽ thay đổi văn bản để đưa vào nội dung có cảm xúc mạnh mẽ hơn. Thay thế tệp request.json bằng nội dung sau và bạn có thể thay thế content bên dưới bằng văn bản của riêng mình:

request.json

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

Tiếp theo, chúng ta sẽ gửi yêu cầu đến điểm cuối analyzeSentiment của API:

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

Phản hồi của bạn sẽ có dạng như sau:

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

Lưu ý rằng chúng ta nhận được hai loại giá trị cảm xúc: cảm xúc cho toàn bộ tài liệu và cảm xúc được phân tích theo từng câu. Phương thức sentiment trả về hai giá trị: scoremagnitude. score là một số từ -1,0 đến 1,0 cho biết mức độ tích cực hoặc tiêu cực của câu. magnitude là một số từ 0 đến vô cùng, thể hiện trọng số của cảm xúc được thể hiện trong câu, bất kể là tích cực hay tiêu cực. Các khối văn bản dài hơn có những câu được nhấn mạnh sẽ có giá trị độ lớn cao hơn. Điểm số cho câu đầu tiên là tích cực (0,7), trong khi điểm số cho câu thứ hai là trung lập (0,1).

Ngoài việc cung cấp thông tin chi tiết về tình cảm cho toàn bộ tài liệu văn bản mà chúng tôi gửi đến NL API, API này cũng có thể phân tích tình cảm theo các thực thể trong văn bản của chúng tôi. Hãy dùng câu này làm ví dụ:

Tôi thích món sushi nhưng dịch vụ thì quá tệ.

Trong trường hợp này, việc nhận được điểm số cảm xúc cho toàn bộ câu như chúng ta đã làm ở trên có thể không hữu ích. Nếu đây là một bài đánh giá nhà hàng và có hàng trăm bài đánh giá cho cùng một nhà hàng, thì chúng tôi muốn biết chính xác những điều mà mọi người thích và không thích trong các bài đánh giá của họ. May mắn là NL API có một phương thức cho phép chúng ta nhận được cảm xúc cho từng thực thể trong văn bản, được gọi là analyzeEntitySentiment. Cập nhật request.json bằng câu trên để dùng thử:

request.json

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

Sau đó, gọi điểm cuối analyzeEntitySentiment bằng lệnh curl sau:

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

Trong phản hồi, chúng ta nhận được hai đối tượng thực thể: một cho "sushi" và một cho "service" (dịch vụ). Sau đây là phản hồi JSON đầy đủ:

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

Chúng ta có thể thấy điểm số trả về cho "sushi" là 0,9, trong khi "dịch vụ" nhận được điểm số là -0,9. Tuyệt! Bạn cũng có thể nhận thấy rằng có 2 đối tượng cảm xúc được trả về cho mỗi thực thể. Nếu một trong hai cụm từ này được đề cập nhiều lần, API sẽ trả về điểm số và mức độ cảm xúc khác nhau cho mỗi lần đề cập, cùng với cảm xúc tổng hợp cho thực thể.

Xem xét phương thức thứ ba của Natural Language API – chú thích cú pháp – chúng ta sẽ tìm hiểu sâu hơn về các chi tiết ngôn ngữ của văn bản. analyzeSyntax là một phương thức cung cấp đầy đủ thông tin chi tiết về các phần tử ngữ nghĩa và cú pháp của văn bản. Đối với mỗi từ trong văn bản, API sẽ cho chúng ta biết từ loại (danh từ, động từ, tính từ, v.v.) và mối quan hệ của từ đó với các từ khác trong câu (Đó có phải là động từ gốc không? Một đối tượng sửa đổi?).

Hãy thử với một câu đơn giản. Yêu cầu JSON của chúng ta sẽ tương tự như các yêu cầu ở trên, có thêm một khoá tính năng. Thao tác này sẽ cho API biết rằng chúng ta muốn thực hiện chú thích cú pháp. Thay thế request.json bằng nội dung sau:

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

Sau đó, hãy gọi phương thức analyzeSyntax của API:

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

Phản hồi sẽ trả về một đối tượng như đối tượng bên dưới cho mỗi mã thông báo trong câu. Sau đây là phản hồi cho từ "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"
}

Hãy phân tích câu trả lời. partOfSpeech cung cấp cho chúng ta thông tin chi tiết về ngôn ngữ của từng từ (nhiều thông tin không xác định vì chúng không áp dụng cho tiếng Anh hoặc từ cụ thể này). tag cho biết từ loại của từ này, trong trường hợp này là động từ. Chúng tôi cũng nhận được thông tin chi tiết về thì, phương thức và liệu từ đó là số ít hay số nhiều. lemma là dạng chính tắc của từ (đối với "uses" thì đó là "use"). Ví dụ: các từ run, runs, ranrunning đều có từ gốc là run. Giá trị từ gốc rất hữu ích để theo dõi số lần xuất hiện của một từ trong một đoạn văn bản lớn theo thời gian.

dependencyEdge bao gồm dữ liệu mà bạn có thể dùng để tạo cây phân tích cú pháp phụ thuộc của văn bản. Đây là sơ đồ cho thấy mối quan hệ giữa các từ trong một câu. Cây phân tích cú pháp phụ thuộc cho câu trên sẽ có dạng như sau:

headTokenIndex trong phản hồi ở trên là chỉ mục của mã thông báo có một cung trỏ vào "uses" (sử dụng). Chúng ta có thể coi mỗi mã thông báo trong câu là một từ trong mảng và headTokenIndex là 2 cho "uses" đề cập đến từ "often" (thường xuyên), được kết nối với từ này trong cây.

Natural Language API cũng hỗ trợ các ngôn ngữ khác ngoài tiếng Anh (xem danh sách đầy đủ tại đây). Hãy thử yêu cầu thực thể sau đây bằng một câu tiếng Nhật:

request.json

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

Xin lưu ý rằng chúng ta không cho API biết ngôn ngữ của văn bản, API có thể tự động phát hiện ngôn ngữ. Tiếp theo, chúng ta sẽ gửi yêu cầu này đến điểm cuối analyzeEntities:

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

Và đây là 2 thực thể đầu tiên trong câu trả lời của chúng tôi:

{
  "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 này trích xuất Nhật Bản làm vị trí và Google làm tổ chức, cùng với các trang Wikipedia cho từng vị trí và tổ chức.

Bạn đã tìm hiểu cách phân tích văn bản bằng Cloud Natural Language API bằng cách trích xuất thực thể, phân tích ý kiến và chú thích cú pháp.

Nội dung đã đề cập

  • Tạo yêu cầu Natural Language API và gọi API bằng curl
  • Trích xuất thực thể và chạy phân tích tình cảm trên văn bản bằng Natural Language API
  • Thực hiện phân tích ngôn ngữ trên văn bản để tạo cây phân tích cú pháp phụ thuộc
  • Tạo yêu cầu Natural Language API bằng tiếng Nhật

Bước tiếp theo