PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : مقایسه دو رشته فارسی چند کلمه ای با هم و دریافت درصد تشابه



naghmesra
March 28th, 2017, 23:07
سلام و درود

دو تا رشته داریم که شما فرض کنید عنوان دو مطلب خبری هست.

من یه تابعی میخوام که بتونه این دو رشته فارسی رو کلمه به کلمه با هم مقایسه کنه و درصد تشابه بده.

لطفا راهنمایی کنید.

تشکر

naghmesra
March 30th, 2017, 02:31
بچه ها هیچ کدی به نظرتون نمیاد که باهاش بتونم درصد بگیرم از تشابه دو عبارت فارسی؟

MJmoonwalk
March 30th, 2017, 08:58
رشته بزرگتر رو با استفاده از strlen پیدا کن
با explode هر رشته رو به آرایه ای از کلمه در بیار
با حلقه for یا while کلمه های رشته کوچکتر رو در بزرگتر جستجو کن و برابری رو پیدا کن
درصد رو بر حسب تعداد برابری در تعداد کلمات رشته دوم بدست بیار.

naghmesra
March 31st, 2017, 02:21
درود

راستش طبق چیزهایی که گفتید من یه کدی نوشتم.

https://pastebin.com/hv5bztvx

ولی توی while اش موندم.

میشه یه راهنمایی بکنید؟

MJmoonwalk
March 31st, 2017, 02:56
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;
}


امتحانش نکردم همینجوری نوشتم.

omid1991
March 31st, 2017, 03:30
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;
}


امتحانش نکردم همینجوری نوشتم.
لاین 27


متغییر $word1
وجود نداره تو لاین 23 درستش کنید
return فانکشن یادتون رفته


اگه اینارو درست کنید کار میکنه

phpcoding
March 31st, 2017, 04:00
سلام و درود

دو تا رشته داریم که شما فرض کنید عنوان دو مطلب خبری هست.

من یه تابعی میخوام که بتونه این دو رشته فارسی رو کلمه به کلمه با هم مقایسه کنه و درصد تشابه بده.

لطفا راهنمایی کنید.

تشکر

ساده ترین و بهترین راه تابعیه که از پیش رزرو شده و توسط خود php تهیه شده : similar_text
نمونه :


$brothers=array();
$brothers[0]="amirali esteki";
$brothers[1]="amirabas esteki";
similar_text($brothers[0],$brothers[1],$output);
echo $output;

پارامتر اول کلمه یا جمله اول . پارامتر دوم کلمه یا جمله دوم . پارامتر سوم درصد تشابه جمله که در کش ذخیره میشه و میتونید هر جا و هر زمان صداش بزنید

با تشکر

naghmesra
March 31st, 2017, 12:56
سلام و درود

بله تابع ارسالی توسط MJmoonwalk (http://www.webhostingtalk.ir/member.php?u=27328) البته با نکات omid1991 (http://www.webhostingtalk.ir/member.php?u=84707) کار کرد.
فقط نفهمیدم دلیل استفاده از تابع trim چی هست؟


ساده ترین و بهترین راه تابعیه که از پیش رزرو شده و توسط خود php تهیه شده : similar_text


به نظر شما از تابع similar_text استفاده کنم یا تابع ارسالی توسط دوستان؟
توجه کنید ما دو عبارت فارسی داریم.

تشکر

phpcoding
March 31st, 2017, 14:41
سلام و درود

بله تابع ارسالی توسط MJmoonwalk (http://www.webhostingtalk.ir/member.php?u=27328) البته با نکات omid1991 (http://www.webhostingtalk.ir/member.php?u=84707) کار کرد.
فقط نفهمیدم دلیل استفاده از تابع trim چی هست؟



به نظر شما از تابع similar_text استفاده کنم یا تابع ارسالی توسط دوستان؟
توجه کنید ما دو عبارت فارسی داریم.

تشکر

دلیل استفاده از trim به احتمال زیاد این بوده که کاراکتر های اضافی حذف بشن
و اما در مورد سوالتون خطاب به من :
مسلما چیزی که خود php طراحی کرده باشه تا تابع دست نویس دوستان زمین تا آسمون فرقشه . به قول داداش دوقلوی من فرقش مث پیکانو پیکان وانته :d
تابع دست نویس دوستان هم خوبه به نظرم . من طرز کد نویسیشون رو یه بررسی جزئی کردم . اگر کد رو واقعا خودشون نوشتن باشن کارشون خوبه کدشون هم خوبه مشکلی نداره
ولی در این مورد : خود من به شخصه به عنوان یه برنامه نویس تا زمانی که تابع similar_text هست و میشه ازش استفاده کرد هیچ موقع اقدام به نوشتن توابع دست نویس نمیکنم
برای عبارت فارسی هم بسیار کار راحتیه . اصلا مشکلی نیست که . کلمات خود را از تابع mb_strtolower رد کنید و پارامتر دومش رو هم utf-8 قرار بدید . اینم نمونه کد نوشته شده توسط خودم + توضیحاتی که دادم :


$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;

naghmesra
April 1st, 2017, 12:56
درود


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;
}

کد بالا گاها درصد بالای 100 در 100 میده.
مثلا اگر عبارت اول رو بزنید "سلام درود سلام" و عبارت دوم رو بزنید "درود سلام درود" درصد میشه 133 درصد.
کاریش میشه کرد؟

تشکر

MJmoonwalk
April 1st, 2017, 14:59
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;
}

$length = 0;
$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($word == $word2) $same_found++;
}
}
$length = $big_count + $small_count;
var_dump($length, $same_found);
$percent = ($same_found*100)/$length;
return $percent;
}

phpcoding
April 2nd, 2017, 00:52
درود


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;
}

کد بالا گاها درصد بالای 100 در 100 میده.
مثلا اگر عبارت اول رو بزنید "سلام درود سلام" و عبارت دوم رو بزنید "درود سلام درود" درصد میشه 133 درصد.
کاریش میشه کرد؟

تشکر

از تابعی که بنده پیشنهاد کردم استفاده کنیم خروجی دو کلمه "سلام درود سلام" و درود "سلام درود سلام" میشه : 65.384615384615
که میتونید با توابعی مثل round یا ceil و floor روندش کنید . اینم نمونه کد :
من سه بار این نمونه کدو به شما دادم ولی شما بازم دنبال کد های دست ساز و کم مصرف و غیر اصولی سایر دوستانید . دلیلش چیز خاصیه ؟


<?php
$brothers=array();
$brothers[0]="سلام درود سلام";
$brothers[1]="درود سلام درود";
similar_text(mb_strtolower($brothers[0],"utf-8"),mb_strtolower($brothers[1],"utf-8"),$output);
echo $output;