ویژگی تصویر

تابع soundex() در PHP

  /  PHP   /  تابع soundex() در PHP
بنر تبلیغاتی الف
آموزش PHP

تابع soundex() در PHP یک روش ساده و سریع برای تبدیل رشته‌ها به یک کد فونتیک (phonetic key) است که هدفش گروه‌بندی کلماتی است که تقریباً مشابه تلفظ می‌شوند. این تابع به‌ویژه برای جستجوی فازی، تطبیق نام‌ها و کاهش خطاهای تایپی مفید است. در ادامه از مبانی تا پیاده‌سازی‌های عملی و راهکار برای زبان‌های غیرلاتین مانند فارسی را بررسی می‌کنیم.

چگونه soundex کار می‌کند؟

الگوریتم Soundex حرف اول کلمه را نگه می‌دارد و سپس به هر حرف عددی نسبت می‌دهد تا در نهایت یک کد با فرمت حرف-رقم-رقم-رقم تولید شود. در PHP کافی است نام تابع را فراخوانی کنید:

<?php
echo soundex("Robert");   // R163
echo soundex("Rupert");   // R163
echo soundex("Ashcraft"); // A261
?>

در این مثال‌ها می‌بینید که Robert و Rupert کد یکسانی تولید می‌کنند که نشان‌دهندهٔ تشابه صوتی است. تابع برای حروف لاتین طراحی شده و برای متن‌های غیرلاتین (مثل فارسی) نیاز به پیش‌پردازش دارد.

مثال‌های عملی و نحوه مقایسه

برای مقایسهٔ دو نام می‌توان به‌سادگی کدهای حاصل از soundex را مقایسه کرد یا برای جستجوی نزدیک‌ترین‌ها در یک لیست از soundex استفاده نمود:

<?php
$names = ["Robert", "Rupert", "Rubin", "Ashcraft", "Ashcroft"];
$target = "Rupert";
$targetCode = soundex($target);

$matches = array_filter($names, function($n) use ($targetCode) {
    return soundex($n) === $targetCode;
});

print_r($matches);
?>

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

کابردهای رایج تابع soundex()

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

محدودیت‌ها — به‌خصوص برای زبان فارسی

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

  • ترانسلیت (ترجمهٔ حروف به حروف لاتین) و سپس اعمال soundex
  • استفاده از آنالیز صوتی/فونی اختصاصی برای فارسی
  • ترکیبِ soundex با الگوریتم‌هایی مانند levenshtein و metaphone

نمونه: اعمال soundex روی نام‌های فارسی (ترانسلیت ساده)

<?php
function persian_to_latin($str) {
    $map = [
        'ا'=>'a','ب'=>'b','پ'=>'p','ت'=>'t','ث'=>'s','ج'=>'j','چ'=>'ch',
        'ح'=>'h','خ'=>'kh','د'=>'d','ذ'=>'z','ر'=>'r','ز'=>'z','ژ'=>'zh',
        'س'=>'s','ش'=>'sh','ص'=>'s','ض'=>'z','ط'=>'t','ظ'=>'z','ع'=>'a',
        'غ'=>'gh','ف'=>'f','ق'=>'q','ک'=>'k','گ'=>'g','ل'=>'l','م'=>'m',
        'ن'=>'n','و'=>'v','ه'=>'h','ی'=>'y','أ'=>'a','ء'=>''
    ];
    $str = preg_replace('/s+/u', ' ', trim($str));
    $out = '';
    $chars = preg_split('//u', $str, null, PREG_SPLIT_NO_EMPTY);
    foreach ($chars as $c) {
        $out .= $map[$c] ?? $c;
    }
    return $out;
}

$name = "محمد رضایی";
$latin = persian_to_latin($name);
echo $latin . "n";
echo soundex($latin) . "n";
?>

در این مثال تابعی ساده برای نگاشت حروف فارسی به معادل لاتین نوشته شده است. سپس با استفاده از soundex روی نتیجهٔ ترانسلیت کد فونتیک تولید می‌شود. توجه کنید که نگاشت‌ها تقریبی و heuristics هستند و برای دقت بالاتر باید نگاشت‌ها و قواعد را مطابق نیاز خود تنظیم کنید.

استفاده از افزونهٔ intl برای ترانسلیت دقیق‌تر

اگر اکستنشن Intl در دسترس باشد، می‌توان از transliterator_transliterate برای تبدیل بهتر استفاده کرد:

<?php
if (function_exists('transliterator_transliterate')) {
    $persian = "محمد رضایی";
    $latin = transliterator_transliterate("Any-Latin; Latin-ASCII", $persian);
    echo $latin . "n";
    echo soundex($latin) . "n";
}
?>

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

بهترین شیوه‌ها و پیشنهادهای فنی

  • در جستجوهای حساس از ترکیب soundex و levenshtein استفاده کنید: ابتدا با soundex صفحهٔ نتایج را محدود کنید، سپس با Levenshtein بهترین شباهت را بیابید.
  • برای داده‌های فارسی یا عربی از ترانسلیت بومی یا کتابخانه‌های مخصوص زبان استفاده کنید.
  • در دیتابیس MySQL نیز تابع SOUNDEX() وجود دارد؛ می‌توان پیش‌فیلتر را در سمت دیتابیس انجام داد و سپس رکوردها را با معیارهای محاسباتی بیشتر رتبه‌بندی کرد.
  • آزمایش با مجموعه‌های واقعی نام و ارزیابی نرخ خطا (precision/recall) برای انتخاب استراتژی مناسب ضروری است.

جدول نمونه: خروجی soundex برای چند نام انگلیسی

نامکد soundex
RobertR163
RupertR163
AshcraftA261
AshcroftA261

جمع‌بندی و نتیجه‌گیری

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

اگر می‌خواهید منبع دقیق‌تری برای ترانسلیت یا نمونه‌های واقعی (ایجاد نقشهٔ حروف کامل فارسی) آماده کنم، بگویید تا کدهای بهبود یافته و تست‌شده با دیتاست‌های نمونه را ارائه دهم.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: