Αναζήτηση και παραπλήσια λέξη

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
zeppos
Δημοσιεύσεις: 431
Εγγραφή: 26 Μαρ 2006 10:43
Τοποθεσία: Kyklades
Επικοινωνία:

Αναζήτηση και παραπλήσια λέξη

Δημοσίευση από zeppos » 26 Ιούλ 2008 21:21

Παρακαλώ αν γνωρίζει κάποιος για την function levenshtein() της php
Έστω οτι έχουμε ένα πρόγραμμα που ψάχνει σε txt file για ομοιότητες με λέξεις που δίνονται από χρήστη. Αν γραφτεί με λάθος ορθογραφία η λέξη το πρόγραμμα δεν βρίσκει ομοιότητες αλλά θέλουμε να βρεί παρόμοια λέξη και να προτείνει. Χρησιμοποιούμε λοιπόν την levenshtein().
Το πρόβλημά μου είναι οτι έχω μια βάση σε text file με διπλή λέξη, δηλαδή ελληνική| αγγλική
(ποτέ|never) και πρέπει να βάλω τις λέξεις σε array πρώτα και μετά να τις συγκρίνω με το search string...

Αν γράψω "πο" θα έπρεπε να μου προτείνει την "ποτέ" αλλά αυτό πάει και βρίσκει πάντα την τελευταία στη σειρά.. έστω και αν δεν έχει σχέση με το search string
Το πρόχειρο script :
<?php
$word = $_POST['word'];
if($word ==''){
error('Please Co Back and write a word');
}
$word=strip_tags($word);

$action = $_GET['action'];
switch ($action)
{
case 1:
$file ="lexicon.txt";
$data = file($file);
foreach($data as $element) {
$element = trim($element);
$row = explode("|", $element);

$str = array($row[0]);
$shortest = -1;

foreach($str as $words) {
$words = trim($words);

}
$lev = levenshtein($word, $words);
if ($lev == 0) {
$closest = $words;
$shortest = 0;
break;
}
if ($lev <= $shortest || $shortest < 0) {

$closest = $words;
$shortest = $lev;
}
}
echo "<center><h4>Input word = <u> $word</u><br><br>";

if ($shortest == 0) {
echo "Exact match found = <u>" . $closest . "</u><br>";
echo "Englich word = <u>" . $row[1] . "</u><br><br>Please <a href=\"lexicon_form.php\"><b>Go Back</b></a> ";
} else {
echo "Non exact match found...<br>Did you mean: <u>$closest ?\n</u><br><br>Please <a href=\"lexicon_form.php\"><b>Go Back</b></a> ";
}
break;
}
?>
Που υπάρχει η .. πατάτα;
Ή κάτι καλύτερο;
Εικόνα

Άβαταρ μέλους
dik_
Δημοσιεύσεις: 476
Εγγραφή: 07 Ιουν 2007 11:28

Αναζήτηση και παραπλήσια λέξη

Δημοσίευση από dik_ » 27 Ιούλ 2008 01:15

Κάπου έχεις μπερδευτεί, το foreach σου ας πούμε δεν κάνει και πολλά πράγματα. Δοκίμασε κάτι τέτοιο, αν πρέπει να αποθηκεύσεις τις ελληνικές λέξεις σε array πρώτα όπως λες:

Κώδικας: Επιλογή όλων

$data = file&#40;$file&#41;;
$dictionary = array&#40;&#41;;
foreach&#40;$data as $line&#41;&#123;
	$w = explode&#40;"|", trim&#40;$line&#41;&#41;;
	$dictionary&#91;&#93; = $w&#91;0&#93;;
&#125;

$min = 999999;
$bestmatch = "";

foreach&#40;$dictionary as $d&#41;&#123;
	$lev = levenshtein&#40;$word, $d&#41;;
	if &#40;$d == 0&#41;&#123;
		echo "exact match found&#58; ".$d;
		break;
	&#125;
	else if &#40;$lev < $min&#41;&#123;
		$min = $lev;
		$bestmatch = $d;
	&#125;
&#125;

echo "best match found&#58; ".$bestmatch." &#40;".$min."&#41;";
αλλιώς κάτι τέτοιο:

Κώδικας: Επιλογή όλων

$data = file&#40;$file&#41;;
$min = 999999;
$bestmatch = "";

foreach&#40;$data as $line&#41;&#123;
	$w = explode&#40;"|", trim&#40;$line&#41;&#41;;
	$lev = levenshtein&#40;$word, $w&#91;0&#93;&#41;;
	if &#40;$d == 0&#41;&#123;
		echo "exact match found&#58; ".$d;
		break;
	&#125;
	else if &#40;$lev < $min&#41;&#123;
		$min = $lev;
		$bestmatch = $d;
	&#125;
&#125;

echo "best match found&#58; ".$bestmatch." &#40;".$min."&#41;";

zeppos
Δημοσιεύσεις: 431
Εγγραφή: 26 Μαρ 2006 10:43
Τοποθεσία: Kyklades
Επικοινωνία:

Αναζήτηση και παραπλήσια λέξη

Δημοσίευση από zeppos » 27 Ιούλ 2008 09:01

@dik_
Φχαριστώ για την απάντηση. Δυστυχώς δεν βγάζει αυτό που ζητώ. Δεν ξέρω αν το δοκίμασες αλλά το πρώτο δίνει πάντα την πρώτη σειρά-λέξη από τον κατάλογο και συχρόνως προτείνει (999999)
Και το δεύτερο τα ίδια (έλειπε η δήλωση του $d)

Έως τώρα το σενάριο που έδωσα κάνει καλά την δουλειά του όταν υπάρχει η λέξη της αναζήτησης ακριβώς. Δίνει και την ελληική και την αγγλική (το αντίθετο σε άλλη φόρμα : case 2)
Πρώτο: Όταν δεν είναι ακριβώς η λέξη όμως δεν δίνει την πλησιέστερη αλλά την τελευταία στον κατάλογο άσχετα με την αναζήτηση. (Κάπου στην ανάλυση-κατάταξη του array είναι το λάθος)
πχ: Όταν έχει τόνους η λέξη και ο χρήστης δεν τους βάζει, βγάζει λάθος, οτι δεν υπάρχει. Αν βγάλω τους τόνους από το search string ($patterns[0] = "/ά/";$replacements[0] = "α"; ) κλπ
τότε δεν βρίσκει τις λέξεις που έχουν τα ίδια γράμματα αλλά άλλο τονισμό, (ποτέ- πότε) .. και πάει και δίνει πάντα αυτή που είναι πιο ψηλά στον κατάλογο από τις ίδιες, πχ: 'ποτέ' . Δηλαδή ο χρήστης γράφει "πότε" και του επιστρέφει "ποτέ=never" !!

Θα ήθελα λοιπόν να προτείνει τις παραπλήσιες για να ξεπεραστεί αυτό το πρόβλημα..
Εικόνα

Άβαταρ μέλους
dik_
Δημοσιεύσεις: 476
Εγγραφή: 07 Ιουν 2007 11:28

Αναζήτηση και παραπλήσια λέξη

Δημοσίευση από dik_ » 27 Ιούλ 2008 14:59

Λοιπόν έχεις δίκιο, σε 2 επίπεδα. Πρώτον, έκανα κάποια λάθη στο παραπάνω, και δεύτερον, η levenshtein() προφανώς δεν είναι multibyte safe και δεν δουλεύει με ελληνικούς χαρακτήρες σωστά.

Για το εξής dictionary:

Κώδικας: Επιλογή όλων

ποτέ|never
μπλα|blah
πότε|when
το εξής script:

Κώδικας: Επιλογή όλων

<?
$data = file&#40;"dic.dat"&#41;;
$min = 999999;
$bestmatch = "";

$word = "whe";

foreach&#40;$data as $line&#41;&#123;
   $w = explode&#40;"|", trim&#40;$line&#41;&#41;;
   $lev = levenshtein&#40;$word, $w&#91;1&#93;&#41;;
   if &#40;$lev == 0&#41;&#123;
	  $min = 0;
      $bestmatch = $w&#91;1&#93;;
      break;
   &#125;
   else if &#40;$lev < $min&#41;&#123;
      $min = $lev;
      $bestmatch = $w&#91;1&#93;;
   &#125;
&#125;

echo &#40;$min == 0 ? "exact" &#58; "best"&#41;." match found&#58; ".$bestmatch." &#40;".$min."&#41;";
?>
δίνει σωστά "best match found: when (1)". Αν όμως αλλάξεις τα 3 $w[1] σε $w[0] και το $word = "whe"; σε οτιδήποτε, τότε παίρνεις πάντα: "best match found: ποτέ ( 8 )".

Οπότε απ' ό,τι καταλαβαίνω η levenshtein() δεν σου κάνει για ελληνικά string... :/

zeppos
Δημοσιεύσεις: 431
Εγγραφή: 26 Μαρ 2006 10:43
Τοποθεσία: Kyklades
Επικοινωνία:

Αναζήτηση και παραπλήσια λέξη

Δημοσίευση από zeppos » 27 Ιούλ 2008 21:40

Καλησπέρα
Δοκιμάζω εδώ και αρκετή ώρα την similar_text(), αλλά πάλι ενώ βρίσκει την σωστή, (100% ταιριάζειι) και αν βάλω να μου δείχνει την 85% και πάνω σαν υπόδειξη, τα χαλάει όλα στην αναζήτηση των παρα κάτω σειρών στον κατάλογο...
Την βαρέθηκα και θα πιάσω από αύριο..
Εικόνα

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες