در چند سال اخیر هوش مصنوعی و یادگیری ماشین بیشتر شکل و قالب وب را به خود گرفتهاند. بخشی از این قضیه مربوط به توسعهدهندگانی میشود که شور و اشتیاق زیادی در این رابطه دارند. من یک متخصص یادگیری ماشین نیستم اما تا حدی در پروژههای توسعه این حوضه مشارکت داشتهام. انجام کارها در این حالت به هوشمندی خاصی نیاز دارد.
برای اینکه واضح باشم باید بگویم که ما در این مطلب قصد داریم موضوع و نمونه سادهای از یادگیری ماشین را به شما بگوییم که البته باید گفت در اصل موضوع پردازش زبان طبیعی یکی از موارد پیچیده و البته هیجان انگیز است که در پروژهها با آن برخورد میکنید. مثالهایی از کاربرد این قضیه را میتوان در زیر مشاهده کنید:
- نتایج و پیشنهادات جستجوی هوشمندانهتر
- ادغام سازی چتباتها برای درک بهتر از ورودیها و مکالمات کاربران
- ادغام سازی متن به صوت
- ویژگی ویرایش محتوا برای تولید کنندگان محتوا
NLP چیست؟
پردازش زبان طبیعی براساس نامی که دارد در ویکیپدیا اشاره دارد به: اپلیکیشنی که تکنیک محاسباتی برای آنالیز و تفکیک زبان طبیعی و گفتار دارد. بیاید این تعریف را بهتر زیر نظر بگیریم.
یک کتابخانه NLP به شما کمک میکند که بتوانید دادههای پیچیده مربوط به همدیگر را از یک رشته استخراج کنید. تا به حال شده که در گوگل به صورت اشتباه یک کلمه را بنویسید؟ تا به حال متوجه این قضیه شده اید که گوگل بعد از آن، کلمه اشتباهی را برای شما اصلاح میکند؟ خب این موضوع به نحوی همان NLP است. فرم جستجو گوگل در صفحه اصلی واقعا مورد پیچیدهای است که میتواند چیزهایی که ما به عنوان انسان وارد میکنیم را آنالیز کند.
NLP را معمولا روی یک رشته از کلمات به اجرا در میآورند.
به عنوان یک توسعه دهنده از این طریق کتابخانه NLP میتوانم اطلاعات بسیاری را از چیزهای مختلف استخراج کنم. در این مطلب قصد دارم با استفاده از متدهای بسیار سادهای شما را با اصل قضیه آشنا سازم.
بررسی کردن کل یک رشته، یک حالت است، اما ما قصد داریم که این متدها را روی کلمات منحصر به فردی اجرا کنیم، تا بتوانیم دادههای بیشتری را از آنها دریافت نماییم. خوشبختانه ما برای این کار میتوانیم از یک tokenizer استفاده کنیم. برای این موضوع توکن زیر نگاه کنید:
var nlp = require('natural');
var tokenizer = new nlp.WordTokenizer();
console.log(tokenizer.tokenize("The Secret Designer: First Job Horror"));
این توکن برای ما یک آرایه را از برنامهای که نوشتهایم به صورت زیر برمیگرداند:
[ 'The', 'Secret', 'Designer', 'First', 'Job', 'Horror' ]
متد WordTokenizer به ما این قابلیت را میدهد که بتوانیم یک رشته را به کلمات متعدد تبدیل کنمی و متدها را روی آن به اجرا دربیاوریم. کتابخانه Natural همراه با tokenizerهای مختلفی ارائه میشود.
در Natural الگوریتمهای متعددی قرار گرفته شده که همگی توسط افراد هوشمندی نوشته شده اند. در این پست قصد داریم با برخی موارد از این کتابخانه آشنا شویم. اما اگر قصد دارید که اطلاعات کاملتری در این رابطه داشته باشید بد نیست که نگاهی به صفحه گیتهاب Natural بیاندازید.
فاصله رشته
در کتابخانه Natural برای اینکه متوجه شویم دو رشته با همدیگر مطابقت دارند از الگوریتم Levenshtein distances استفاده میکنیم:
var nlp = require('natural');
console.log(natural.LevenshteinDistance("Daine","Dane"));
کد بالا به ما خروجی ۱ را نشان میدهد که به معنی مطابقت داشتن دو رشته در محتوای الگوریتم است. همانطور که مشاهده میکنید راههای مختلفی برای تلفظ «Daine» وجود دارد و الگوریتم به صورت پیچیدهای در تشخیص آن از پارامترهای متفاوتی استفاده می کند:
- درج کردن
- جایگزین کردن
- حذف کردن
در مثال بالا ما یک i را اضافه کردهایم پس الگوریتم محتوا را براساس حالت اولی یعنی درج کردن محاسبه میکند. این متد برای زمانی که بخواهید در بین مواردی که اشتباه نوشته شده است پیشنهادی ارائه دهید بسیار مفید است.
تطبیق رشته به صورت تقریبی
یکی دیگر از کارکردهای این کتابخانه که واقعا میتواند میتواند به اپلیکیشنتان چاشنی جدیدی بزند، تطبیق رشته به صورت تقریبی یا Approximate String Matching است. درست شبیه به حالت قبلی است، در حقیقت در از این مورد برای پیاده سازی الگوریتم Levenshtein استفاده میشود. این مورد برای رشتهای با محتوای زیاد و یا ورودیهای منحصر به فرد که ممکن است اشتباه تلفظ شود بسیار مناسب است.
PHONETICS
برای کلماتی که در تلفظ به یک شکل هستند، اما مفاهیم متفاوتی دارند متد metaphone.compare() بسیار مفید است.
var nlp = require('natural');
var metaphone = nlp.Metaphone;
if(metaphone.compare('see', 'sea')) {
console.log('Phonetically they match!');
}
SPELLCHECK
این متد میتواند به صورتی پویا استفاده شود این صورت از کارایی برای زمانی که بخواهید کارایی بازنویسی مجدد را فراهم کنید بسیار مفید است و حتی شاید بخواهید که یک ابزار پردازش متن را ایجاد کنید.
var checks = ['something', 'soothing']; // Known as a corpus
var spellcheck = new nlp.Spellcheck(checks);
میتوانیم بعد از این به صورت زیر آن را اجرا کنیم:
spellcheck.getCorrections('soemthing', 1); // ['something']
DICTIONARY
Wordnet یکی از آخرین ادغامسازیها در کتابخانه Natural به حساب میآید. این مورد یک بانک اطلاعاتی دیکشنری است که توسط دانشگاه پرینستون توسعه داده شده و با استفاده از آن به سرعت میتوانید به کلمات و جزئیات آنها نگاه کنید.
برای استفاده کردن از Wordnet نیاز است که از طریق مدیریت پکیج NPM پکیج wordnet-db را دریافت کنید. شما میتوانید این پکیج را از طریق دستور زیر نصب نمایید:
npm install wordnet-db
این بانک اطلاعاتی عظیم به ما کمک میکند که بتوانیم دیکشنری محلی استانداردی را در اختیار داشته باشیم و آن را در برنامهها استفاده کنیم.
مثال
بعد از معرفی برخی موارد داخل این کتابخانه چطور است که یک مثال کلی را حل کنیم؟ بیاید یک ابزار CLI ساده را که از ما یک کلمه دریافت میکند و جزئیات آن را از طریق دیکشنری برمیگرداند را بسازیم. البته این نکته را در نظر بگیرید که من در این پست قصد ندارم برای بررسیها و مدیریت خطاها کاری را انجام دهم. از آن جایی که نودجیاس از promiseها پشتیبانی میکند، افزودن این مورد به جریان منطقی ساده است.
ابتدا، یک پوشته جدید درست میکنیم و سپس وارد پوشه میشویم و دستور زیر را اجرا میکنیم.
npm init -y
این مورد باعث میشود که یک فایل package.json خالی برای ما ایجاد شود. یک خاصیت در اینجا وجود دارد که برای انجام کارمان اهمیت دارد، با استفاده از این خاصیت میتوانیم به نودجیاس اعلام کنیم که اپلیکیشن را از طریق یک فایل اجرا کند. این فایل را ما index.js نام گذاری کردیم و آن را در پوشه اصلی خود قرار دادیم. میتوانیم این کار را در CLI خود با استفاده از دستور زیر انجام دهید:
touch index.js
بعد از این مورد نیاز است که مستقلاتی را به پروژه اضافه کنیم.
npm install --save commander wordnet-db natural
Commander.js یک پکیج قدرتمند NPM است که باعث میشود نوشتن اپلیکیشنهای مبتنی بر CLI بسیار سریع ایجاد کنیم.
حال فایل index.js خود را باز کنید و کد زیر را در ابتدای آن قرار دهید:
#!/usr/bin/env node
این خط کد به نود میگوید که وقتیNPM اپلیکیشن دیکشنری ما را به usr/local/bin متصل کرد فایل را اجرا کند. البته این کار با استفاده از یک پرچم یا نماد انجام میشود. برای مثال:
dictionary lookup “HTML”
بیایید دو خاصیت دیگر را به پکیج Json خود اضافه کنیم:
"preferGlobal": true,
"bin": "./index.js"
preferGlobal به ما این اجازه را میدهد که در هر جایی از سیستم عاملمان پکیجمان را اجرا کنیم. همچنین bin به NPM Link میگوید که دقیقا چه فایلی را اجرا کند. مطمئن شوید که داخل پوشه پروژهتان هستید و خط کد زیر را اجرا میکنید:
npm link
من package.json و index.js را به صورت کامل در Gist زیر اضافه کردهام که میتوانید استفاده نمایید:
https://gist.github.com/dainemawer/d4dc972fd2c0db5e58615c13c17ca8aa
در پایان قصد دارم به صورت ساده کارهایی را که انجام دادم را توضیح دهم:
- ابتدا، ما commander، wordnet و natural را از node_modules فراخوانی کردیم.
- بعد از آن به تابع wordNetLookup برگشتیم.
- ما میتوانیم برنامه را چندین با به اجرا در بیاوریم، در این اپلیکیشن من آن را سه بار فراخوانی کردم.
- در اولین فراخوانی نسخه و توضیحات قرار گرفت.
- بعد از آن ما یک دستور را پیادهسازی کردیم. این دستور یک پارامتر را دریافت میکند: <word>
- بعد از این ما یک نام مستعار را تشکیل دادیم که نیازی نداشته باشید تا هر بار lookup را تایپ کنید.
- بعد از این توضیحاتی را برای کاری که دستور انجام میدهد اضافه کردم و در نهایت action() را اجرا نمودم.
- متد action از یک تابع برگشتی تغذیه میکند، این متد به عنوان پارامتر کلمهای را که کاربر در ترمینال نوشته است، قبول میکند. در داخل این تابع برگشتی ما wordNetLookup() را اجرا میکنیم که پارامتر را برمیگرداند و عملیات جستجو را اجرا میکند.
حال ما میتوانیم اپلیکیشن را اجرا کنیم و کلماتی که هم اکنون در بانک اطلاعاتی WordNet وجود دارد را مشاهده کنیم.
دیدگاه و پرسش
در حال دریافت نظرات از سرور، لطفا منتظر بمانید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید