برنامه نویس سمت سرور - اغلب نودجیاس || https://hossein.link
اسم انگلیسی نزدیک به اسم خودمون با جاوااسکریپت و الگوریتم جارو-وینکلر (jaro-winkler)
سلام به همگی.
چند مدته یه تعداد زیادی از توییت های تایملاین من شده بود مربوط به مهاجرت و خب اکثر دوستایی که دارم (مخصوصا اگه اسم عربی داشته باشن) میان میگن یه اسم انگلیسی که به اسم من شبیه باشه رو بگین. بخوام مثال بزنم اینطوری میشه که اونی که اسمش مهدی بود خب اسم متیو رو برای خودش انتخاب کرد.
حالا من داشتم فکر میکردم یه چیزی سر هم کنیم که بشه راحت تر به نتیجه رسید.(اینجا سر هم شده اش قابل مشاهده است) هم با هم یاد بگیریم.
خب، برای پیدا کردن این اسامی ما نیاز به یک مجموعه بزرگ از اسامی انگلیسی داریم من با یه سرچ کوتاه به این منبع رسیدم (usna.edu) که حدودا ۱۸ هزار تا اسم داخلش هست. پس برای استفاده شون هم کافی بود اونارو از فایل txt که بهمون میده بخونیم. پس:
const fs = require('fs');
const path = require('path');
const names = fs.readFileSync(path.join(__dirname, 'names.txt'), 'utf8').split('\n');
تا اینجا ما تونستیم تمامی این اسامی رو بخونیم و اسپلیت شده به صورت آرایه توی متغیر names داشته باشیم.
حالا کاری که ما میخوایم انجام بدیم پیدا کردن فاصله بین این اسامی هستش. یعنی مثلا ali با alis چقدر فاصله دارن (این فاصله از نظر معنایی نیست) اگه ما بتونیم کلماتی با شباهت بالا بهشون رو پیدا کنیم اینطوری میتونیم توی انتخابمون دقیق تر باشیم. برای این کار من شروع به جست و جو کردم و با الگوریتم jaro-winkler آشنا شدم. آقا جارو در حقیقت یه الگوریتمی رو برای محاسبه این فاصله ها در سال ۱۹۸۹ مطرح کرده که یک سال بعدش آقای وینکلر اون رو بهبود بخشیده و نتیجه بهتر و دقیق تری گرفته. و چون موضوع بحث ما در رابطه با چگونگی این الگوریتم نیست شمارو به ویکیپدیا ارجاع میدم.
خوشبختانه این الگوریتم پکیج خوبی توی npm داشتم و ما از همون استفاده خواهیم کرد ::). برای این کار کافیه پکیج jaro-winkler رو نصب کنین و با یه حلقه فاصله اسم مورد نظرتون با همه اسم های بسنجین بعد از اون این مقادیر رو sort میکنیم و بر اساس میزان شباهتشون به کاربر ارائه میدیم. حالا به شکل زیر کد بالا رو تکمیل کنید:
const distance = require('jaro-winkler');
const fs = require('fs');
const path = require('path');
const names = fs.readFileSync(path.join(__dirname, 'names.txt'), 'utf8').split('\n');
const similarity = (yourName, percent) => {
return (names.map(name => {
const distancePercent = distance(yourName, name);
if (distancePercent > Number(percent)/100) {
return {
name,
percent: distancePercent
}} })).filter(Boolean).sort((a, b) => b.percent - a.percent);
};
console.log(similarity('hossein', 80));
این کد توی گیت هاب در دسترستون هست و خوشحال میشم اگه مفید بود بهش ستاره بدین ::)
مطلبی دیگر از این انتشارات
برنامه نویسی چیست؟ و چه کاربردی دارد؟
مطلبی دیگر از این انتشارات
فریمورک ReactJS چیست و چرا باید از آن استفاده کنیم؟
مطلبی دیگر از این انتشارات
درباره دیجیتال مارکتینگ و بازاریابی اینترنتی