הוסטס - פורום אחסון האתרים הגדול בישראל

הוסטס - פורום אחסון האתרים הגדול בישראל (https://hosts.co.il/forums/index.php)
-   פורום תיכנות (https://hosts.co.il/forums/forumdisplay.php?f=14)
-   -   מחפש דרך להשוואה בין מספר טקסטים (https://hosts.co.il/forums/showthread.php?t=79876)

intercooler3819 02-12-09 21:02

מחפש דרך להשוואה בין מספר טקסטים
 
שלום

יש לי שלושה טקסטים שהמשתמש הזין (פשוט טקסט)

אני רוצה להשוות ביניהם ולדעת מי מבין הטקסטים יותר דומה למי

יש לציין שהטקסטים בעברית

איך הייתם עושים את זה??

Slash 02-12-09 21:06

השאלה איך אתה מגדיר דומה ?

Hanan 02-12-09 21:07

הייתי מנסה עם base64_decode... או md5 אבל שוב תלוי מה אורך הטקסט...
תנסה את מה שאמרתי..

ותשווה אח"כ
PHP קוד:

if ($text1 == $text2$msg .= 'text1 same as text2';
if (
$text1 == $text3$msg .= 'text1 same as text3'

וכ'ו וכ'ו..

Daniel 02-12-09 21:24

ציטוט:

נכתב במקור על ידי Hanan (פרסם 747953)
הייתי מנסה עם base64_decode... או md5 אבל שוב תלוי מה אורך הטקסט...
תנסה את מה שאמרתי..

ותשווה אח"כ
PHP קוד:

if ($text1 == $text2$msg .= 'text1 same as text2';
if (
$text1 == $text3$msg .= 'text1 same as text3'

וכ'ו וכ'ו..

מדוע md5 או base64 יהיו קשורים?

md5 הוא אלגוריתם הצפנה וכל הרעיון באלגוריתמים כאלה שאם אני אצפין "my name is nitsan" או "my name is aitsan" (הבדל של אות אחת) הכל יהיה שונה לגמריי.

base64 בעצם מבצע העברת בסיס, למה זה יעזור?




ולנושא -

תסתכל על http://php.net/manual/en/function.similar-text.php
ועל http://www.php.net/manual/en/function.levenshtein.php

Hanan 02-12-09 22:35

אתה יודע זה לא שאני משווה טקסטים כל היום אני לא עוסק בחקר. השיטות שהצגתי אפשריות גם. כמו שאמרת "הבדל של אות אחת הכל יהיה שונה לגמריי". משמה -> עדיין אתה יכול לבדוק 2 strings האם הם זהים.

נקודה למחשבה... והצגת פונקציות יותר טובות...

AlmogBaku 03-12-09 16:08

תריץ לולאה שמשווה תו תו ובסוף רושמת כמה שוני יש בינהם.
או ללכת על משהו קיים:
http://php.net/manual/en/function.similar-text.php

השוואה בין קבצים/מסמכים:
אתה עובר על הקבצים שורה שורה ומשווה, אם יש שוני אתה יכול גם לבדוק מה השוני.

Ben Bokra 03-12-09 23:11

תשתמש במחרוזת או בביטוי רוגליים .

intercooler3819 03-12-09 23:22

אני רוצה להשוות בין 3 טקסטים.. לא 2!

או אפילו 4... כאשר אני יכול להזין מספר קבצים והאלגוריתם יראה לי טקסטים משותפים לכולם נגיד או ימרקר לי..

תודה!!

Shay Ben Moshe 04-12-09 11:46

היי ניצן, בניתי לך פונקצייה שמבוססת על הsimilar_text הזה, היא מקבל מערך של stringים ומחזירה לך מערך עם האחוזים:
PHP קוד:

function match_array_strings($array)
{
    if(!
is_array($array)) return array();
    
$count count($array);
    
$match = array();
    for(
$i=0;$i<$count;$i++)
        for(
$j=$i+1;$j<$count;$j++)
            
similar_text($array[$i],$array[$j],$match[$i.'-'.$j]);
    return 
$match;


לדוגמה, עבור:
PHP קוד:

$input[] = 'my name is shay';
$input[] = 'your name is shay';
$input[] = 'your name was shay';
$input[] = 'my name is shai';

print_r(match_array_strings($input)); 

מוחזר:
PHP קוד:

Array
(
    [
0-1] => 87.5
    
[0-2] => 78.787878787879
    
[0-3] => 93.333333333333
    
[1-2] => 91.428571428571
    
[1-3] => 81.25
    
[2-3] => 72.727272727273


בהצלחה!

עריכה: עם שינוי קטן ניתן לעשות שזה לא יהיה רק 0-1 אלא גם 1-0 וכדומה, מה שמקל על הפנייה למערך אבל יכביד על הזיכרון אם יהיו הרבה טקסטים. הפונקצייה שעושה זאת:
PHP קוד:

function match_array_strings($array)
{
    if(!
is_array($array)) return array();
    
$count count($array);
    
$match = array();
    for(
$i=0;$i<$count;$i++)
        for(
$j=$i+1;$j<$count;$j++)
        {
            
similar_text($array[$i],$array[$j],$match[$i.'-'.$j]);
            
$match[$j.'-'.$i] = $match[$i.'-'.$j];
        }
    return 
$match;



בניה 04-12-09 11:50

הוא לא מחפש משהו שיראה לו אילו מחרוזות דומות באחוזים, הוא רוצה משהו שיבדוק מילים בטקסט ויציג הבדלים.

לא נראה לי שתמצא אלגוריטם טוב לזה בPHP במיוחד לא לכמה טקסטים במקביל ובעברית.


כל הזמנים הם GMT +2. הזמן כעת הוא 16:23.

מופעל באמצעות VBulletin גרסה 3.8.6
כל הזכויות שמורות ©
כל הזכויות שמורות לסולל יבוא ורשתות (1997) בע"מ