سلام و درود
دو تا رشته داریم که شما فرض کنید عنوان دو مطلب خبری هست.
من یه تابعی میخوام که بتونه این دو رشته فارسی رو کلمه به کلمه با هم مقایسه کنه و درصد تشابه بده.
لطفا راهنمایی کنید.
تشکر
نمایش نسخه قابل چاپ
سلام و درود
دو تا رشته داریم که شما فرض کنید عنوان دو مطلب خبری هست.
من یه تابعی میخوام که بتونه این دو رشته فارسی رو کلمه به کلمه با هم مقایسه کنه و درصد تشابه بده.
لطفا راهنمایی کنید.
تشکر
بچه ها هیچ کدی به نظرتون نمیاد که باهاش بتونم درصد بگیرم از تشابه دو عبارت فارسی؟
رشته بزرگتر رو با استفاده از strlen پیدا کن
با explode هر رشته رو به آرایه ای از کلمه در بیار
با حلقه for یا while کلمه های رشته کوچکتر رو در بزرگتر جستجو کن و برابری رو پیدا کن
درصد رو بر حسب تعداد برابری در تعداد کلمات رشته دوم بدست بیار.
درود
راستش طبق چیزهایی که گفتید من یه کدی نوشتم.
https://pastebin.com/hv5bztvx
ولی توی while اش موندم.
میشه یه راهنمایی بکنید؟
امتحانش نکردم همینجوری نوشتم.کد PHP:
function similar_check ($str1, $str2) {
$str1_len = mb_strlen($str1, 'UTF-8');
$str2_len = mb_strlen($str2, 'UTF-8');
if ($str1_len > $str2_len) {
$big_str = $str1;
$small_str = $str2;
}
else {
$big_str = $str2;
$small_str = $str1;
}
$big_arr = explode (" ", $big_str);
$small_arr = explode (" ", $small_str);
$big_count = count ($big_arr);
$small_count = count ($small_arr);
$same_found = 0;
foreach($small_arr as $word)
{
$word = trim($word);
foreach($big_arr as $word2)
{
$word2 = trim($word2);
if($word1 == $word2) $same_found++;
}
}
$percent = ($same_found/$big_count)*100;
}
ساده ترین و بهترین راه تابعیه که از پیش رزرو شده و توسط خود php تهیه شده : similar_text
نمونه :
پارامتر اول کلمه یا جمله اول . پارامتر دوم کلمه یا جمله دوم . پارامتر سوم درصد تشابه جمله که در کش ذخیره میشه و میتونید هر جا و هر زمان صداش بزنیدکد PHP:
$brothers=array();
$brothers[0]="amirali esteki";
$brothers[1]="amirabas esteki";
similar_text($brothers[0],$brothers[1],$output);
echo $output;
با تشکر
سلام و درود
بله تابع ارسالی توسط MJmoonwalk البته با نکات omid1991 کار کرد.
فقط نفهمیدم دلیل استفاده از تابع trim چی هست؟
به نظر شما از تابع similar_text استفاده کنم یا تابع ارسالی توسط دوستان؟نقل قول:
ساده ترین و بهترین راه تابعیه که از پیش رزرو شده و توسط خود php تهیه شده : similar_text
توجه کنید ما دو عبارت فارسی داریم.
تشکر
دلیل استفاده از trim به احتمال زیاد این بوده که کاراکتر های اضافی حذف بشن
و اما در مورد سوالتون خطاب به من :
مسلما چیزی که خود php طراحی کرده باشه تا تابع دست نویس دوستان زمین تا آسمون فرقشه . به قول داداش دوقلوی من فرقش مث پیکانو پیکان وانته :d
تابع دست نویس دوستان هم خوبه به نظرم . من طرز کد نویسیشون رو یه بررسی جزئی کردم . اگر کد رو واقعا خودشون نوشتن باشن کارشون خوبه کدشون هم خوبه مشکلی نداره
ولی در این مورد : خود من به شخصه به عنوان یه برنامه نویس تا زمانی که تابع similar_text هست و میشه ازش استفاده کرد هیچ موقع اقدام به نوشتن توابع دست نویس نمیکنم
برای عبارت فارسی هم بسیار کار راحتیه . اصلا مشکلی نیست که . کلمات خود را از تابع mb_strtolower رد کنید و پارامتر دومش رو هم utf-8 قرار بدید . اینم نمونه کد نوشته شده توسط خودم + توضیحاتی که دادم :
کد PHP:
$brothers=array();
$brothers[0]="amirali esteki";
$brothers[1]="amirabas esteki";
similar_text(mb_strtolower($brothers[0],"utf-8"),mb_strtolower($brothers[1],"utf-8"),$output);
echo $output;
درود
کد بالا گاها درصد بالای 100 در 100 میده.کد PHP:
function similar_check ($str1, $str2) {
$str1_len = mb_strlen($str1, 'UTF-8');
$str2_len = mb_strlen($str2, 'UTF-8');
if ($str1_len > $str2_len) {
$big_str = $str1;
$small_str = $str2;
}
else {
$big_str = $str2;
$small_str = $str1;
}
$big_arr = explode (" ", $big_str);
$small_arr = explode (" ", $small_str);
$big_count = count ($big_arr);
$small_count = count ($small_arr);
$same_found = 0;
foreach($small_arr as $word)
{
$word = trim($word);
foreach($big_arr as $word2)
{
$word2 = trim($word2);
if($word1 == $word2) $same_found++;
}
}
$percent = ($same_found/$big_count)*100;
}
مثلا اگر عبارت اول رو بزنید "سلام درود سلام" و عبارت دوم رو بزنید "درود سلام درود" درصد میشه 133 درصد.
کاریش میشه کرد؟
تشکر