تجزیه و تحلیل موجودیت، احساسات و نحو با Cloud Natural Language API

Cloud Natural Language API به شما امکان می‌دهد موجودیت‌ها را از متن استخراج کنید، احساسات و تحلیل نحوی انجام دهید و متن را به دسته‌ها طبقه‌بندی کنید.

در این آزمایشگاه، ما یاد خواهیم گرفت که چگونه از API زبان طبیعی برای تجزیه و تحلیل موجودیت ها، احساسات و نحو استفاده کنیم.

چیزی که یاد خواهید گرفت

  • ایجاد یک درخواست API زبان طبیعی و فراخوانی API با curl
  • استخراج موجودیت ها و اجرای تجزیه و تحلیل احساسات روی متن با API زبان طبیعی
  • انجام تجزیه و تحلیل زبانی بر روی متن با API زبان طبیعی
  • ایجاد یک درخواست API زبان طبیعی به زبانی دیگر

کلاهی که نیاز دارید

چگونه از این آموزش استفاده خواهید کرد؟

فقط از طریق آن را بخوانید آن را بخوانید و تمرینات را کامل کنید

تجربه خود را با Google Cloud Platform چگونه ارزیابی می کنید؟

تازه کار متوسط مسلط

تنظیم محیط خود به خود

اگر قبلاً یک حساب Google (Gmail یا Google Apps) ندارید، باید یک حساب ایجاد کنید . به کنسول Google Cloud Platform ( consol.cloud.google.com ) وارد شوید و یک پروژه جدید ایجاد کنید:

اسکرین شات از 10/02/2016 12:45:26.png

شناسه پروژه را به خاطر بسپارید، یک نام منحصر به فرد در تمام پروژه های Google Cloud (نام بالا قبلاً گرفته شده است و برای شما کار نخواهد کرد، متأسفیم!). بعداً در این آزمایشگاه کد به عنوان PROJECT_ID نامیده خواهد شد.

در مرحله بعد، برای استفاده از منابع Google Cloud، باید صورتحساب را در کنسول Cloud فعال کنید .

گذراندن این کد نباید بیش از چند دلار هزینه داشته باشد، اما اگر تصمیم به استفاده از منابع بیشتری داشته باشید یا آنها را در حال اجرا رها کنید، ممکن است بیشتر باشد (به بخش "پاکسازی" در انتهای این سند مراجعه کنید).

کاربران جدید Google Cloud Platform واجد شرایط استفاده آزمایشی رایگان 300 دلاری هستند.

روی نماد منو در سمت چپ بالای صفحه کلیک کنید.

APIs & services را از منوی کشویی انتخاب کنید و روی داشبورد کلیک کنید

روی Enable APIs and services کلیک کنید.

سپس، "زبان" را در کادر جستجو جستجو کنید. روی Google Cloud Natural Language API کلیک کنید:

برای فعال کردن Cloud Natural Language API روی Enable کلیک کنید:

چند ثانیه صبر کنید تا فعال شود. پس از فعال شدن آن را مشاهده خواهید کرد:

Google Cloud Shell یک محیط خط فرمان است که در Cloud اجرا می شود . این ماشین مجازی مبتنی بر دبیان با تمام ابزارهای توسعه مورد نیاز شما ( gcloud ، bq ، git و موارد دیگر) بارگذاری شده است و یک فهرست اصلی 5 گیگابایتی دائمی را ارائه می دهد. ما از Cloud Shell برای ایجاد درخواست خود به Natural Language API استفاده می کنیم.

برای شروع کار با Cloud Shell، روی "فعال کردن Google Cloud Shell" کلیک کنید. اسکرین شات 08/06/2015 در ساعت 5.30.32 بعد از ظهر.png نماد در گوشه سمت راست بالای نوار هدر

یک جلسه Cloud Shell در داخل یک فریم جدید در پایین کنسول باز می شود و یک خط فرمان را نمایش می دهد. صبر کنید تا اعلان user@project:~$ ظاهر شود

از آنجایی که از curl برای ارسال درخواست به API زبان طبیعی استفاده خواهیم کرد، باید یک کلید API ایجاد کنیم تا در URL درخواست ما ارسال شود. برای ایجاد یک کلید API، به بخش اعتبارنامه ها و سرویس ها در کنسول Cloud خود بروید:

در منوی کشویی، کلید API را انتخاب کنید:

در مرحله بعد، کلیدی را که ایجاد کرده اید کپی کنید. بعداً در آزمایشگاه به این کلید نیاز خواهید داشت.

اکنون که یک کلید API دارید، آن را در یک متغیر محیطی ذخیره کنید تا از وارد کردن مقدار کلید API خود در هر درخواست اجتناب کنید. می توانید این کار را در Cloud Shell انجام دهید. مطمئن شوید که <your_api_key> با کلیدی که به تازگی کپی کرده اید جایگزین کنید.

export API_KEY=<YOUR_API_KEY>

اولین روش API زبان طبیعی که ما استفاده خواهیم کرد، analyzeEntities است. با این روش، API می تواند موجودیت ها (مانند افراد، مکان ها و رویدادها) را از متن استخراج کند. برای امتحان کردن آنالیز موجودیت API، از جمله زیر استفاده می کنیم:

جوآن رولینگ که با نام های جی کی رولینگ و رابرت گالبریث می نویسد، رمان نویس و فیلمنامه نویس بریتانیایی است که مجموعه های فانتزی هری پاتر را نوشته است.

ما درخواست خود را به 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"
}

در درخواست، به API زبان طبیعی درباره متنی که ارسال خواهیم کرد، می گوییم. مقادیر نوع پشتیبانی شده PLAIN_TEXT یا HTML هستند. در محتوا، متن را ارسال می کنیم تا برای تجزیه و تحلیل به API زبان طبیعی ارسال شود. Natural Language API همچنین از ارسال فایل های ذخیره شده در Cloud Storage برای پردازش متن پشتیبانی می کند. اگر می‌خواهیم فایلی را از فضای ذخیره‌سازی ابری ارسال کنیم، content با gcsContentUri جایگزین می‌کنیم و مقدار uri فایل متنی خود را در Cloud Storage به آن می‌دهیم. encodingType به API می گوید که از کدام نوع کدگذاری متن هنگام پردازش متن استفاده کند. API از این برای محاسبه مکان هایی که موجودیت های خاص در متن ما ظاهر می شود استفاده می کند.

اکنون می‌توانید بدنه درخواست خود را به همراه متغیر محیطی کلید API که قبلاً ذخیره کرده‌اید، با دستور curl زیر به Natural Language API ارسال کنید (همه در یک خط فرمان واحد):

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 موجودیت، نشانی اینترنتی ویکی‌پدیا مرتبط، در صورت وجود، salience ، و شاخص‌های جایی که این موجودیت در متن ظاهر شده است را دریافت می‌کنیم. Salience عددی در محدوده [0,1] است که به مرکزیت موجودیت در متن به عنوان یک کل اشاره دارد. API زبان طبیعی همچنین می تواند همان موجودیت ذکر شده را به روش های مختلف تشخیص دهد. نگاهی به لیست mentions در پاسخ بیندازید: API می‌تواند بگوید که «جوان رولینگ»، «رولینگ»، «رمان‌نویس» و «رابرت گالبریات» همگی به یک چیز اشاره می‌کنند.

علاوه بر استخراج موجودیت‌ها، 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
      }
    }
  ]
}

توجه داشته باشید که ما دو نوع ارزش احساسی دریافت می کنیم: احساس برای سند ما به عنوان یک کل، و احساس که بر اساس جمله تجزیه می شود. روش احساسات دو مقدار را برمی‌گرداند: score و magnitude . score عددی از -1.0 تا 1.0 است که نشان می‌دهد چقدر این عبارت مثبت یا منفی است. magnitude عددی از 0 تا بی نهایت است که وزن احساسات بیان شده در عبارت را بدون در نظر گرفتن مثبت یا منفی بودن نشان می دهد. بلوک‌های طولانی‌تر متن با عبارات سنگین دارای مقادیر بزرگ‌تری هستند. نمره جمله اول ما مثبت است (0.7)، در حالی که امتیاز جمله دوم خنثی است (0.1).

علاوه بر ارائه جزئیات احساسات در کل سند متنی که NL API ارسال می کنیم، همچنین می تواند احساسات موجود در متن ما را تجزیه کند. بیایید از این جمله به عنوان مثال استفاده کنیم:

من سوشی را دوست داشتم اما خدمات وحشتناکی بود .

در این مورد، گرفتن نمره احساس برای کل جمله همانطور که در بالا انجام دادیم ممکن است چندان مفید نباشد. اگر این یک بررسی رستوران بود و صدها نظر برای همان رستوران وجود داشت، ما می‌خواهیم بدانیم که مردم دقیقاً چه چیزهایی را دوست دارند و چه چیزهایی را در نظرات خود دوست ندارند. خوشبختانه NL API روشی دارد که به ما امکان می‌دهد احساسات هر موجودی را در متن خود دریافت کنیم، به نام analyzeEntitySentiment . درخواست.json خود را با جمله بالا به روز کنید تا آن را امتحان کنید:

request.json

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

سپس با دستور curl زیر، نقطه پایانی analyzeEntitySentiment فراخوانی کنید:

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

در پاسخ، دو شیء موجودیت را برمی‌گردانیم: یکی برای «سوشی» و دیگری برای «سرویس». در اینجا پاسخ کامل 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- را دریافت کرد. باحال همچنین ممکن است متوجه شوید که دو شیء احساسی برای هر موجودیت بازگردانده شده است. اگر هر یک از این اصطلاحات بیش از یک بار ذکر شده باشد، API برای هر ذکر امتیاز و مقدار متفاوتی را همراه با یک احساس کلی برای موجودیت بازمی‌گرداند.

با نگاهی به روش سوم Natural Language API - حاشیه نویسی نحوی - ما عمیق تر به جزئیات زبانی متن خود خواهیم پرداخت. analyzeSyntax روشی است که مجموعه کاملی از جزئیات را در مورد عناصر معنایی و نحوی متن ارائه می دهد. برای هر کلمه در متن، API قسمت گفتار (اسم، فعل، صفت و غیره) و ارتباط آن با سایر کلمات در جمله را به ما می‌گوید (آیا فعل ریشه است؟ اصلاح‌کننده؟).

بیایید آن را با یک جمله ساده امتحان کنیم. درخواست JSON ما با اضافه کردن یک کلید ویژگی، مشابه موارد بالا خواهد بود. این به API می گوید که مایلیم حاشیه نویسی نحوی را انجام دهیم. درخواست.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

پاسخ باید برای هر نشانه در جمله، یک شی مانند شکل زیر را برگرداند. در اینجا ما به پاسخ کلمه "استفاده" نگاه خواهیم کرد:

{
  "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 شکل متعارف کلمه است (برای "کاربردها" "استفاده" است). به عنوان مثال، کلمات run ، runs ، ran و running همگی دارای لم run هستند. مقدار لم برای ردیابی وقوع یک کلمه در یک قطعه بزرگ از متن در طول زمان مفید است.

dependencyEdge شامل داده هایی است که می توانید از آنها برای ایجاد درخت تجزیه وابستگی متن استفاده کنید. این نموداری است که نشان می دهد کلمات در یک جمله چگونه با یکدیگر ارتباط دارند. درخت تجزیه وابستگی برای جمله بالا به شکل زیر است:

headTokenIndex در پاسخ ما در بالا، ایندکس توکنی است که دارای قوسی است که به سمت "استفاده ها" اشاره می کند. می‌توانیم هر نشانه در جمله را به‌عنوان یک کلمه در یک آرایه در نظر بگیریم، و headTokenIndex 2 برای «استفاده‌ها» به کلمه «often» اشاره دارد که در درخت به آن متصل است.

Natural Language API از زبان‌هایی غیر از انگلیسی نیز پشتیبانی می‌کند (لیست کامل اینجا ). بیایید درخواست موجودیت زیر را با یک جمله به زبان ژاپنی امتحان کنیم:

request.json

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

توجه داشته باشید که ما به 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

و در اینجا دو نهاد اول در پاسخ ما آمده است:

{
  "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 ژاپن را به عنوان یک مکان و گوگل را به عنوان یک سازمان به همراه صفحات ویکی پدیا برای هر کدام استخراج می کند.

شما یاد گرفته اید که چگونه با استخراج موجودیت ها، تجزیه و تحلیل احساسات، و انجام حاشیه نویسی نحوی، تجزیه و تحلیل متن را با Cloud Natural Language API انجام دهید.

آنچه را پوشش داده ایم

  • ایجاد یک درخواست API زبان طبیعی و فراخوانی API با curl
  • استخراج موجودیت ها و اجرای تجزیه و تحلیل احساسات روی متن با API زبان طبیعی
  • انجام تجزیه و تحلیل زبانی روی متن برای ایجاد درخت های تجزیه وابستگی
  • ایجاد یک درخواست API زبان طبیعی به زبان ژاپنی

مراحل بعدی