یک برنامه وب شباهت‌یاب متن با TensorFlow.js بسازید

برخی از جعبه‌های حمام برایتون بیشتر شبیه به هم هستند. قرمزها را به من نشان دهید!
برخی از جعبه‌های حمام برایتون بیشتر شبیه به هم هستند. قرمزها را به من نشان دهید!

آیا شگفت‌زده شده‌اید که موتورهای جستجو چطور سوالات شما را درک می‌کنند و نتایج مرتبط را بازیابی می‌کنند؟ چگونه چت‌بات نیت شما را از سوالات شما بیرون می‌کشد و مناسب‌ترین پاسخ را ارائه می‌دهد؟

در این داستان، من جزئیات هر یک از بخش‌های مورد نیاز برای ایجاد یک برنامه وب تحلیل شباهت متنی را شرح خواهم داد، از جمله:

  • تعبیه کلمات (Word Embedding)
  • تعبیه جمله (Sentence Embedding)
  • تشابه کسینوسی
  • ساخت یک برنامه وب تحلیل شباهت متنی
  • تحلیل نتایج

برنامه وب تجزیه و تحلیل شباهت متنی را امتحان کنید، و در قسمت نظرات بگویید برای شما چطور کار می‌کند!

  • تعبیه کلمات (Word Embedding)

تعبیه کلمات امکان نمایش دانش را در جایی که یک بردار نشان‌دهنده یک کلمه است فراهم می‌کند. این امر توانایی شبکه‌های عصبی برای یادگیری از مجموعه داده متنی را بهبود می‌بخشد.

قبل از این که تعبیه کلمه به عنوان یک استاندارد بدیهی برای پردازش زبان طبیعی تعیین شود، یک روش رایج برای بازنمایی کلمات، استفاده از یک تبدیل تک‌گرمی (تک‌کلمه‌ای) بود. هر کلمه نشان‌دهنده یک ستون در فضای برداری است و هر جمله برداری از صفر و یک‌ها است. که یک‌ها حضور کلمه را در جمله نشان می‌دهد.

نمایش برداری One Hot
نمایش برداری One Hot

در نتیجه، این منجر به نمایش بزرگ و پراکنده می‌شود، زیرا صفرهای بیشتری نسبت به یک‌ها وجود دارند. زمانی که کلمات زیادی در واژگان وجود دارند، یک بردار کلمه بزرگ ایجاد می‌کند. این ممکن است به یک مشکل برای الگوریتم های یادگیری ماشین تبدیل شود.

تبدیل One-Hot همچنین نمی‌تواند معنای کلمات را درک کند. برای مثال، "نوشیدنی" و "نوشیدن"، اگر چه اینها دو کلمه متفاوت هستند، تعریف مشابهی دارند.

با تعبیه کلمه، کلماتی که از نظر معنایی مشابه هستند، نمایش برداری مشابهی دارند. در نتیجه، وقتی با عباراتی مانند "من دوست دارم یک نوشیدنی سفارش دهم" یا "یک نوشیدنی" نشان داده می‌شود، یک سیستم سفارش دهی می‌تواند این درخواست را به همان روش تفسیر کند.

در گذشته

در سال ۲۰۰۳، یوشع بنجیو و همکاران مفهوم مدل زبانی را معرفی کردند. تمرکز این مقاله یادگیری نمایش‌هایی برای کلمات بود که به مدل امکان پیش‌بینی کلمه بعدی را می‌دهد.

این مقاله بسیار مهم است و منجر به توسعه و کشف تعبیه کلمه می‌شود. یوشع جایزه تورینگ را به همراه جفری هینتون و یان لکون دریافت کرد.

توالی ورودی ویژگی‌های بردارها برای کلمات، توزیع احتمال شرطی روی کلمات، برای پیش‌بینی کلمه بعدی
توالی ورودی ویژگی‌های بردارها برای کلمات، توزیع احتمال شرطی روی کلمات، برای پیش‌بینی کلمه بعدی

در سال ۲۰۰۸، رونان و جیسون روی یک شبکه عصبی کار کردند که می‌توانستند شناسایی کلمات مشابه را یاد بگیرند. کشف آن‌ها امکانات زیادی برای پردازش زبان طبیعی ایجاد کرده‌است. جدول زیر لیستی از کلمات و ده واژه مشابه را نشان می‌دهد.

شکل چپ: معماری شبکه عصبی برای جمله ورودی داده‌شده، احتمالات کلاس خروجی. جدول راست: ۵ کلمه انتخاب‌شده و ۱۰ کلمه بسیار مشابه.
شکل چپ: معماری شبکه عصبی برای جمله ورودی داده‌شده، احتمالات کلاس خروجی. جدول راست: ۵ کلمه انتخاب‌شده و ۱۰ کلمه بسیار مشابه.

در سال ۲۰۱۳، توماس میکولوف و همکاران یادگیری بردارهای کلمات با کیفیت بالا از مجموعه داده با میلیاردها کلمه را معرفی کردند. آن‌ها نام این کلمه را Word2Vec گذاشتند و شامل میلیون ها کلمه در فرهنگ لغت است.

از آن زمان به بعد، Word2Vec محبوب شده‌است. امروزه کلمه «تعبیه» در تمام چارچوب‌های یادگیری عمیق محبوب است.

مثال

در مدل پیش آموزش‌دیده Word2Vec گوگل، آن‌ها حدود ۱۰۰ میلیارد کلمه از مجموعه داده اخبار گوگل را آموزش دادند. کلمه "گربه" نزدیک‌ترین معانی را به "گربه"، "سگ"، "موش" و "حیوان خانگی" دارد.

نزدیکی هندسی کلمه
نزدیکی هندسی کلمه "گربه" به کلمات"گربه"، "سگ"، "موش"، "حیوان خانگی"

تعبیه کلمه همچنین ارتباط بین کلمات را تشخیص می‌دهد. یک مثال کلاسیک، روابط نقش جنسیتی بین کلمات است. برای مثال، شباهت "مرد" به "زن" شبیه "پادشاه" به "ملکه" است.

روابط جالب بین کلمات آموخته‌شده از الگوریتم یادگیری بدون نظارت GloVe
روابط جالب بین کلمات آموخته‌شده از الگوریتم یادگیری بدون نظارت GloVe

عمیق‌تر بدانید

گالینا اولجنیک یک کار عالی برای توصیف انگیزه از تعبیه کلمات ارایه کرده است. از کدگذاری One-Hot و TF-IDF گرفته تا GloVe و Poincare.

با توجه به قدیمی بودن مقاله در حال حاضر روی وبلاگ ترجمیار منتشر نشده اما می‌توانید با کمک مقاله‌خوان ترجمیار این مقاله را به فارسی بخوانید. استفاده از مقاله‌خوان برای این فایل رایگان است.

یک مقاله جامع ۲۹ دقیقه‌ای در مورد مدل‌های مختلف زبانی توسط دیپانجان سارکار نیز وجود دارد. او Word2Vec، GloVe و FastText را پوشش می‌دهد؛ اگر قصد دارید روی "تعبیه کلمه" کار کنید، این مقاله را هم را بررسی کنید.

مقاله دیپانجان سارکار هم روی وبلاگ ترجمیار منتشر نشده اما می‌توانید با کمک مقاله‌خوان ترجمیار آن را به صورت رایگان به فارسی بخوانید.

خودتان انجام دهید

تنسورفلو یک برنامه آموزشی در مورد تعبیه کلمه و کدها در این دفترچه یادداشت کولاب فراهم کرده‌است.شما می‌توانید دست به کد شوید و از آن برای آموزش تعبیه کلمات استفاده کنید. این کار قطعا می‌تواند به شما کمک کند که شروع کنید.

برای کسانی که از انیمیشن لذت می‌برد، یک تصویر سازی تعبیه جالب بر روی حامل لایه‌بندی وجود دارد. هر نقطه نشان‌دهنده یک کلمه است و شما می‌توانید کلمات مشابه معنایی را در یک فضای سه‌بعدی تصور کنید.

تصویر سه بعدی از نمایشگر سه بعدی  تعبیه کلمات. هر نقطه‌ای که می‌بینید یک کلمه را نشان می‌دهد.
تصویر سه بعدی از نمایشگر سه بعدی تعبیه کلمات. هر نقطه‌ای که می‌بینید یک کلمه را نشان می‌دهد.

ما برای نشان دادن معانی کلمات، بردارهایی از کلمات داریم؛ جملات چطور؟

کدگذار جهانی جمله

همانند تعبیه کلمه، کدگذار جهانی جمله یک مدل تعبیه جمله است که متن را به نمایش برداری با طول ثابت معنا دار تبدیل می‌کند.

کدگذار جهانی جمله متن را در بردارهای با ابعاد بالا کدگذاری می‌کند
کدگذار جهانی جمله متن را در بردارهای با ابعاد بالا کدگذاری می‌کند

این بردارها تولید شده توسط کدگذار جهانی جمله، اطلاعات معنایی غنی را بدست می‌آورند. می‌توانیم از آن برای وظایف مختلف پردازش زبان طبیعی، برای آموزش طبقه‌بندی کننده‌ها مانند عقیده‌کاوی و تحلیل شباهت متنی استفاده کنیم.

دو مدل عمومی کدگذار جهانی جمله توسط گوگل ارایه شده است. یکی از آن‌ها مبتنی بر معماری ترانسفورمر و دیگری مبتنی بر شبکه متوسط‌گیر عمیق است.

در ترنسفرمر، تعبیه جمله، نمایش آگاه از بافت را برای هر کلمه ایجاد می‌کند تا تعبیه جمله را تولید کند. این روش برای دقت بالاتر طراحی شده‌است، اما کدگذاری به حافظه و زمان محاسباتی بیشتری نیاز دارد. این برای طبقه‌بندی احساسات مفید است که در آن کلماتی مانند "نه" می‌توانند معنی را تغییر دهند و قادر به کنترل منفی دوگانه مانند "نه بد" هم می‌شود.

در شبکه متوسط‌گیر عمیق، تعبیه کلمات ابتدا با هم میانگین گیری شده و سپس از طریق شبکه عصبی فیدفوروارد برای تولید تعبیه جمله استفاده می‌شود. متاسفانه، با میانگین‌گیری از بردارها، ما زمینه جمله و توالی کلمات در جمله در این فرآیند از دست می‌دهیم. این روش برای سرعت و کارآیی طراحی شده‌است و در برخی موارد دقت قربانی می‌شود (به خصوص در کنایه و نفی دوگانه). یک مدل عالی برای طبقه‌بندی موضوع و دسته‌بندی مقالات طولانی به گروه‌ها.

جملات در صورتی از نظر معنایی مشابه هستند که با پاسخ‌های یک‌سان پاسخ داده شوند.
جملات در صورتی از نظر معنایی مشابه هستند که با پاسخ‌های یک‌سان پاسخ داده شوند.

یانگ و همکارانش روشی برای یادگیری نمایش جمله با استفاده از داده‌های محاوره‌ای معرفی می‌شود.

برای مثال، «چند سالته؟» و «سنت چقدره؟» هردو از نظر معنایی یکی هستند و یک چت‌بات می تواند پاسخ بدهد «۲۰ سالمه»

در مقابل، در حالی که «How are you» و «How old are you» کلمات یکسانی دارند معانی کاملا متفاوتی دارند. یک چت‌بات باید سوال را بفهمد و پاسخ مناسب را ارائه دهد.
این نقشه، شباهت بین سه جمله را نشان می‌دهد:

  • How old are you?
  • What is your age?
  • How are you?”.
دو جمله “How are you?” و “How old are you?” تنها ۳۳٪ مشابهت دارند علی‌رغم مشترک بودن کلمات آن‌ها
دو جمله “How are you?” و “How old are you?” تنها ۳۳٪ مشابهت دارند علی‌رغم مشترک بودن کلمات آن‌ها

لاگزواران و همکاران، یک چارچوب برای یادگیری نمایش جملات از داده‌های بدون برچسب معرفی کردند. در این مقاله، رمزگشا (جعبه نارنجی) مورد استفاده در روش‌های قبلی با یک طبقه‌بندی کننده جایگزین می‌شود که جمله هدف را از مجموعه‌ای از جملات کاندید (جعبه‌های سبز) انتخاب می‌کند؛ عملکرد سیستم سوال و پاسخ را بهبود می‌بخشد.

جایگزینی رمزگشای روش‌های قبلی با یک طبقه‌بندی کننده که جمله هدف را از مجموعه‌ای از جملات کاندید انتخاب می‌کند
جایگزینی رمزگشای روش‌های قبلی با یک طبقه‌بندی کننده که جمله هدف را از مجموعه‌ای از جملات کاندید انتخاب می‌کند

بازهم اگر می‌خواهید عمیق‌تر بدانید!

دیپانجان سارکار توسعه هر یک از مدل‌های تعبیه را توضیح داده است. اگر شما مشتاق به ایجاد طبقه‌بندی کننده متن هستید، مقاله او هر مرحله را برای انجام تجزیه و تحلیل احساسات بر روی مجموعه داده‌های مرور فیلم به تفصیل شرح می‌دهد.

مقاله جذاب سارکار در مورد ایجاد یک طبقه‌کننده با استفاده از تعبیه‌گر‌های جهانی را می‌توانید با مقاله‌خوان ترجمیار به صورت رایگان همزمان به فارسی و انگلیسی بخوانید. این مقاله به دلیل قدیمی بودن در وبلاگ ترجمیار منتشر نخواهد شد.

اگر شما برای کشف دیگر مدل‌های زبانی کنجکاو هستید، پراتیک بهاوسر عملکرد مدل‌های مختلف زبانی مانند BERT, ELMo, USE, Siamese و InferSent را مقایسه می‌کند. یادگیری انتخاب صحیح نتیجه شما را بهبود خواهد بخشید.

مقاله پراتیک بهاوسر در مورد انواع کدگذارها برای پردازش زبان طبیعی را هم می‌توانید به رایگان در مقاله‌خوان ترجمیار به رایگان به صورت همزمان به فارسی و انگلیسی مطالعه کنید. این مقاله هم در وبلاگ منتشر نخواهد شد.

خودتان انجام دهید

تنسورفلو یک برنامه آموزشی، یک مدل از پیش آموزش‌دیده و یک دفتر یادداشت از کدگذار جمله جهانی تهیه کرده‌است. اگر در مورد ایجاد طبقه‌بندی کننده متن خود فکر می‌کنید قطعا این را بررسی کنید.


با استفاده از بردارهای معنایی برای هر جمله، چگونه می‌توانیم شباهت بین جملات را اندازه‌گیری کنیم؟

شباهت کسینوسی

شباهت کسینوسی با محاسبه زاویه کسینوسی بین دو بردار، یک معیار شباهت است. اگر دو بردار مشابه باشند، زاویه بین آن‌ها کوچک است و مقدار تشابه کسینوسی به ۱ نزدیک‌تر است.

با توجه به دو بردار A و B، شباهت کسینوسی، cos (θ)، با استفاده از یک ضرب و طول بردار نشان داده می‌شود.
با توجه به دو بردار A و B، شباهت کسینوسی، cos (θ)، با استفاده از یک ضرب و طول بردار نشان داده می‌شود.

در اینجا ما جملات را وارد رمزگذار جهانی جمله می‌کنیم و آن به ما بردارهای تعبیه جمله برمی گرداند.

با این بردارها می‌توانیم شباهت‌های کسینوسی بین بردارها را در نظر بگیریم. برای هر جفت جمله A و B می‌توانیم شباهت کسینوسی بردارهای A و B را محاسبه کنیم.

شباهت معنایی معیاری برای میزان این است که دو قطعه متن دارای یک معنی هستند.
شباهت معنایی معیاری برای میزان این است که دو قطعه متن دارای یک معنی هستند.

ما می‌توانیم با هم حداقل آستانه را برای گروه بندی جمله تعیین کنیم. از آنجا که امتیاز تشابه بین ۰ تا ۱ قرار می‌گیرد، شاید ما بتوانیم ۰.۵ را در نیمه راه انتخاب کنیم. این بدان معنی است که هر جمله‌ای که بیش از ۰.۵ شباهت داشته باشد با هم جمع می‌شوند.

عمیق‌تر بدانید

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

به مانند مقالات بیرونی قبلی این مقاله با عنوان چگونه فاصله‌ها را در یادگیری ماشین بسنجیم را نیز در مقاله‌خوان ترجمیار به رایگان و به دو زبان فارسی و انگلیسی بخوانید.

ساختن بلوک‌های تحلیل شباهت متنی برنامه وب

در این پروژه، من از این کتابخانه‌ها استفاده خواهم کرد:

  • تنسورفلو نسخه جاوا اسکریپت (TensorFlow.js)
  • کدگذار جهانی جمله
  • آنگولار

تنسورفلو نسخه جاوا اسکریپت (TensorFlow.js)

تنسورفلو نسخه جاوا اسکریپت چارچوبی ساخته‌شده توسط گوگل است که یادگیری ماشین را در جاوااسکریپت ممکن می‌سازد. می‌توانیم مدل‌های یادگیری ماشین را توسعه دهیم و آن‌ها را در مرورگر وب و Node.js قرار دهیم.
از آنجایی که از توسعه برنامه‌های کاربردی وب لذت می‌برم، وقتی TensorFlow.js در سال ۲۰۱۸ منتشر شد بسیار خوشحال شدم.

شروع آن آسان است و ما می‌توانیم TensorFlow.js را با npm نصب کنیم.

$ npm install @tensorflow/tfjs

یک مثال از یک مدل رگرسیون خطی ساده شبیه این خواهد بود.

import * as tf from '@tensorflow/tfjs';const model = tf.sequential();
model.add(tf.layers.dense({units: 1, inputShape: [1]}));model.compile({loss: 'meanSquaredError', optimizer: 'sgd'});const xs = tf.tensor2d([1, 2, 3, 4], [4, 1]);
const ys = tf.tensor2d([1, 3, 5, 7], [4, 1]);model.fit(xs, ys, {epochs: 10}).then(() => {
  model.predict(tf.tensor2d([5], [1, 1])).print();
});

کدگذار جهانی جمله

من از بسته کدگذار جمله عمومی TensorFlow.js استفاده خواهم کرد. ما می‌توانیم کدگذار جهانی جمله را با استفاده از npm نصب کنیم.

$ npm install @tensorflow-models/universal-sentence-encoder

این مثالی است برای نشان دادن اینکه چگونه می‌توانیم تعبیه را از هر جمله با استفاده از کدگذار جمله جهانی استخراج کنیم.

import * as use from '@tensorflow-models/universal-sentence-encoder';use.load().then(model => {
  const sentences = [
    'Hello.',
    'How are you?'
  ];
  model.embed(sentences).then(embeddings => {
    embeddings.print(true /* verbose */);
  });
});

آنگولار

آنگولار یک چارچوب کاربردی وب است که توسط گوگل برای ایجاد برنامه‌های تک صفحه‌ای پویا ساخته شده‌است.

برای این پروژه، من از آنگولار ۸ استفاده می‌کنم. من از ساختن ساختار آنگولار برای الگوی طراحی مدل - نما - کنترل‌کننده آن لذت می‌برم. من از اولین نسخه آنگولار برای بیشتر پروژه‌های توسعه وب خود استفاده کرده‌ام. اما از آنجایی که آن‌ها هر نیم سال یکبار، نسخه‌های جدید را منتشر می‌کنند، احساس می‌کنم که کار من منسوخ خواهد شد (شاید؟ نمی‌دانم) React یک چارچوب UI محبوب است، بنابراین شاید یک روز به واکنش تغییر کنم. کسی چه می‌داند؟

شباهت کسینوسی

یک تابع برای محاسبه شباهت دو بردار با استفاده از فرمول تشابه کسینوسی ایجاد کنید.

similarity(a, b) {
  var magnitudeA = Math.sqrt(this.dot(a, a));
  var magnitudeB = Math.sqrt(this.dot(b, b));
  if (magnitudeA && magnitudeB)
    return this.dot(a, b) / (magnitudeA * magnitudeB);
  else return false
}

یک تابع دیگر برای محاسبه امتیاز شباهت برای هر جفت جمله به صورت زیر است.

cosine_similarity_matrix(matrix){
  let cosine_similarity_matrix = [];
  for(let i=0;i<matrix.length;i++){
    let row = [];
    for(let j=0;j<i;j++){
      row.push(cosine_similarity_matrix[j][i]);
    }
    row.push(1);
    for(let j=(i+1);j<matrix.length;j++){
      row.push(this.similarity(matrix[i],matrix[j]));
    }
    cosine_similarity_matrix.push(row);
  }
  return cosine_similarity_matrix;
}

همه چیز را با هم ترکیب کنید

من تمام مولفه‌های اصلی مورد نیاز برای این پروژه را معرفی کرده‌ام. حالا ما فقط باید آن‌ها را مثل چینه‌های لگو جمع کنیم، بسته‌بندی کنیم و به گیت‌هاب منتقل کنیم.

عالیه! ما یک برنامه وب برای یک دموی زنده دریافت می‌کنیم.

فهرستی از جملات برای شباهت معنایی وارد کنید
فهرستی از جملات برای شباهت معنایی وارد کنید

ما فهرستی از جملات داریم، و اینها وارد رمزگذار جهانی جمله می‌شوند. خروجی، تعبیه هر جمله خواهد بود. سپس شباهت بین هر جمله را محاسبه می‌کنیم.

نتایج

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

این نقشه نشان می‌دهد که هر جمله چقدر به جملات دیگر شبیه است. هر چه رنگ سبز بیشتر باشد، شباهت به ۱ نزدیک‌تر است که به این معنی است که جملات بیشتر شبیه یکدیگر هستند.

ما می‌توانیم مقدار را برای تعیین حداقل آستانه شباهت به جملات گروهی با هم تنظیم کنیم. این جملات با ارزش بیش از ۰.۵ گروه‌بندی شده‌اند.

برنامه وب ما با تشخیص "گروه ۱" که مسایل مربوط به آب و هوا است، کار بسیار خوبی انجام داد. با وجود این که هر دو جمله کلمات همپوشان ندارند.

همچنین توانست تشخیص دهد که "طوفان‌ها" و "گرم شدن جهانی هوای کره زمین" مربوط به آب و هوا هستند، اما به طریقی نتوانست "برف" را در این دسته دسته‌بندی کند.

متاسفانه، "Johnny bit the dog" و "The dog bit Johnny" دارای ۸۷ % شباهت شناخته‌شده‌اند. بیچاره جانی، نمی‌دانم کدام بهتر است.

به همین ترتیب برای "گربه موش را می‌خورد" و "موش گربه را می‌خورد"، من انتظار دارم که دو بردار شباهت متضاد داشته باشند.


منتشرشده در: سایت datasciencedojo به تاریخ ۱۶ فوریه ۲۰۲۰
لینک مقاله اصلی: https://towardsdatascience.com/how-to-build-a-textual-similarity-analysis-web-app-aa3139d4fb71

این مقاله توسط مترجم هوشمند مقالات علمی تخصصی انگلیسی به فارسی ترجمه شده و بمورد ویرایش انسانی قرار گرفته است. این متن می‌تواند به صورت محدود دارای اشکالات ترجمه باشد.