اسم انگلیسی نزدیک به اسم خودمون با جاوااسکریپت و الگوریتم جارو-وینکلر (jaro-winkler)

سلام به همگی.

چند مدته یه تعداد زیادی از توییت های تایملاین من شده بود مربوط به مهاجرت و خب اکثر دوستایی که دارم (مخصوصا اگه اسم عربی داشته باشن) میان میگن یه اسم انگلیسی که به اسم من شبیه باشه رو بگین. بخوام مثال بزنم اینطوری میشه که اونی که اسمش مهدی بود خب اسم متیو رو برای خودش انتخاب کرد.

حالا من داشتم فکر میکردم یه چیزی سر هم کنیم که بشه راحت تر به نتیجه رسید.(اینجا سر هم شده اش قابل مشاهده است) هم با هم یاد بگیریم.

memegenerator.netبع :
memegenerator.netبع :

خب، برای پیدا کردن این اسامی ما نیاز به یک مجموعه بزرگ از اسامی انگلیسی داریم من با یه سرچ کوتاه به این منبع رسیدم (usna.edu) که حدودا ۱۸ هزار تا اسم داخلش هست. پس برای استفاده شون هم کافی بود اونارو از فایل txt که بهمون میده بخونیم. پس:

برای شما
123const 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 میکنیم و بر اساس میزان شباهتشون به کاربر ارائه میدیم. حالا به شکل زیر کد بالا رو تکمیل کنید:

1234567891011121314const 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));

این کد توی گیت هاب در دسترستون هست و خوشحال میشم اگه مفید بود بهش ستاره بدین ::)

نویسنده مطلب: حسین محمدی پور

منبع مطلب

به فکر سرمایه‌گذاری هستی؟

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

ثبت نام و دریافت جایزه
ممکن است شما بپسندید
نظر شما درباره این مطلب

آدرس ایمیل شما منتشر نخواهد شد.