تجزیه و تحلیل موجودیت، احساسات و نحو با 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، به بخش اعتبارنامه‌های APIها و خدمات در کنسول Cloud خود بروید:

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

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

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

export API_KEY=<YOUR_API_KEY>

اولین روش Natural Language 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 فایل متنی خود را در فضای ذخیره‌سازی ابری به آن می‌دهیم. 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 زیر، endpoint 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 زبان طبیعی به زبان ژاپنی

مراحل بعدی