Προς το περιεχόμενο

php search 'εύελικτο'? (να καταλαβαίνει τις πτώσεις, ενικό, πλυθηντικό, κεφαλαία-μικρά κλπ)


heisenberg

Προτεινόμενες αναρτήσεις

καλημέρα,

 

φτιάχνω ένα website που θα έχει και "Αναζήτηση".

 

παίρνει τη λέξη που γράφει ο χρήστης, ψάχνει στη βάση να βρει σχετικό κείμενο ( με LIKE %input%) , και γυρνάει τις εγγραφές.

 

(βρήκα και ενσωμάτωσα αυτό το script: http://www.iamcal.com/publish/articles/php/search/ Αλλά το θέμα μου είναι άσχετο με αυτό το script.)

 

Το θέμα είναι ότι η αναζήτηση αυτή, δεν διακρίνει τις πτώσεις, μικρά-κεφαλαία, ενικό-πληθυντικό κλπ.

 

Υπάρχει κάποια λύση σε αυτό; Για ελληνικό κείμενο.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

ISO-8859-7??? Το 2011? Έλεος...

 

Επι τη ευκαιρία φυσικά και ΔΕΝ παίζει γενικά έτσι όπως είναι και χωρίς καθόλου οδηγίες χρήσεως (το 8859-7 που λέγαμε).

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

καλημέρα,

 

φτιάχνω ένα website που θα έχει και "Αναζήτηση".

 

παίρνει τη λέξη που γράφει ο χρήστης, ψάχνει στη βάση να βρει σχετικό κείμενο ( με LIKE %input%) , και γυρνάει τις εγγραφές.

 

(βρήκα και ενσωμάτωσα αυτό το script: http://www.iamcal.com/publish/articles/php/search/ Αλλά το θέμα μου είναι άσχετο με αυτό το script.)

 

Το θέμα είναι ότι η αναζήτηση αυτή, δεν διακρίνει τις πτώσεις, μικρά-κεφαλαία, ενικό-πληθυντικό κλπ.

 

Υπάρχει κάποια λύση σε αυτό; Για ελληνικό κείμενο.

 

Η αναγωγή λέξεων στις ρίζες τους λέγεται stemming. Το πρόβλημα που έχεις μπροστά σου όμως είναι πάρα πολύ δύσκολο να λυθεί (μετάφραση: από τη στιγμή που χρειάζεται να ρωτήσεις δεν υπάρχει περίπτωση να καταφέρεις να το λύσεις), γιατί περιλαμβάνει πολύ περισσότερα υπο-προβλήματα από το stemming (που ήδη είναι δύσκολο και δεν μπορεί να γίνει μόνο γράφοντας κώδικα) και την αφαίρεση διακριτικών σημείων κλπ (που είναι γελοίο).

 

Για παράδειγμα θα σου πω το εξής απλό. Έστω ότι τα έχεις καταφέρει να λύσεις όλα αυτά τα θέματα, ας πούμε δηλαδή ότι τόσο στη βάση σου όσο και στην είσοδο από το χρήστη έχεις μόνο ουσιαστικά στο πρώτο πρόσωπο του ενικού, κεφαλαία και χωρίς τόνους. Σου γράφω "ΜΕΓΑΛΟ ΔΕΝΤΡΟ ΠΡΑΣΙΝΟ ΜΕ ΜΙΚΡΟΥΣ ΚΑΡΠΟΥΣ ΚΑΙ ΜΙΑ ΚΟΥΦΑΛΑ". Τι θα κάνεις μ' αυτό;

 

Αν σ' ενδιαφέρει να το προσπαθήσεις, δες τι open source fulltext search engines υπάρχουν (π.χ. Apache Lucene) και πώς θα μπορέσεις να βάλεις PHP front-end σε κάποιο απ' αυτά.

 

Είπα κι εγώ, δε θα βγει να μας την πει;:-(

 

Συγγνώμη που δεν έδωσα τα εύσημα για μια απάντηση η οποία

 

* πρώτα απ' όλα δεν λύνει το πρόβλημα

* διαιωνίζει την κατάρα των ANSI encodings

* δεν δίνει στο παλικάρι από πάνω να καταλάβει ποιές είναι οι έννοιες που θα συναντήσει αν τον ενδιαφέρει να λύσει το πρόβλημά του και ποιά είναι η έκταση του προβλήματος

* ακόμα και γι' αυτό που κάνει θα μπορούσε να γραφτεί στο 1/2 της έκτασης ή και λιγότερο

* και όταν δε θα δουλέψει δε θα υπάρχει και μια εξήγηση για το τι πήγε στραβά

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δε γυρεύω εύσημα φίλε μου, το ξέρω ότι πολλά πράγματα τα κάνω λάθος και γι' αυτό ψάχνω πάντα τρόπους να τα κάνω καλύτερα - όπως καταλαβαίνεις οι λέξεις "έλεος" και "φυσικά δεν παίζει" δεν βοηθάνε ιδιαίτερα...Κατανοώ (εκ των υστέρων βέβαια) ότι έκανα λάθος που δεν έβαλα σχόλια σε μια συνάρτηση που εξυπηρετεί διαφορετικό σκοπό, αλλά και ο τρόπος που το υπέδειξες δεν ήταν και ο πιο κόσμιος - θα μπορούσες εξαρχής να δώσεις τη τελευταία σου απάντηση και να είμαστε όλοι ευτυχισμένοι;)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δε γυρεύω εύσημα φίλε μου, το ξέρω ότι πολλά πράγματα τα κάνω λάθος και γι' αυτό ψάχνω πάντα τρόπους να τα κάνω καλύτερα - όπως καταλαβαίνεις οι λέξεις "έλεος" και "φυσικά δεν παίζει" δεν βοηθάνε ιδιαίτερα...Κατανοώ (εκ των υστέρων βέβαια) ότι έκανα λάθος που δεν έβαλα σχόλια σε μια συνάρτηση που εξυπηρετεί διαφορετικό σκοπό, αλλά και ο τρόπος που το υπέδειξες δεν ήταν και ο πιο κόσμιος - θα μπορούσες εξαρχής να δώσεις τη τελευταία σου απάντηση και να είμαστε όλοι ευτυχισμένοι;)

 

Με συγχωρείς λοιπόν και μένα που ήμουν απότομος. Είναι μερικά πράγματα τα οποία πραγματικά δεν αντέχω να τα βλέπω (όπως τα ANSI encodings). Ειδικά στην περίπτωση του κώδικα που έδωσες, ο οποίος επιπλέον ήταν χωρίς κανένα σχόλιο και μια σελίδα μήκος για κάτι που στην τελική μπορεί να γίνει μέχρι σε και 1 γραμμή με την strtr, μου δόθηκε η εντύπωση πως πρόκειται για copy/paste απο και γω δεν ξέρω πού.

 

Όσο μιλάμε τέλος πάντων για encodings, πολύ απλά δεν υπάρχει τίποτα άλλο εκτός από UTF-8 εκτός αν είσαι CJK (Chinese/Japanese/Korean) οπότε το συζητάμε. Δές κι αυτό εδώ το άρθρο αν θέλεις, από το 2003(!!!) (που ακόμα ο Joel έγραφε ωραία πράγματα).

 

Και τέλος, δυστυχώς εδώ σε θέματα προγραμματισμού υπάρχουν 4-5 άτομα που ξέρουν τι τους γίνεται, και κατά τα άλλα άστα να πάνε. Τέτοιο περιβάλλον δε σου δημιουργεί και τη μεγαλύτερη όρεξη να κάτσεις να γράψεις κάτι σωστό.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ευχαριστώ,

 

δε θέλω (και δεν μπορώ) να εγκαταστήσω software στο server.

 

Χρειάζομαι μια λύση προγραμματιστική (php + mysql)

 

π.χ. μια μερική λύση θα ήταν να κόβω το τελευταίο γράμμα από τη λέξη και να την ψάχνω με LIKE %input%

για παράδειγμα: αν ο χρήστης γράψει τη λέξη καπέλο , δε θα βρει τη λέξη καπέλα

αλλά αν κόψω το τελευταίο γράμμα και ψάξω για %καπέλ% θα βρει και το καπέλα.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Τότε, βάλε επίπεδα στην αναζήτησή σου. Π.χ., πρώτο επίπεδο να είναι ακριβώς όπως είναι η λέξη (χωρίς τόνους και με τόνους), δεύτερο επίπεδο χωρίς το τελευταίο γράμμα κ.ο.κ.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Με τις λέξεις που αλλάζουν τον τονισμό κατά την κλίση τους (πχ άνθρωπος -> ανθρώπου), τί θα κάνεις; Και, εάν αγνοείς τον τονισμό, με το λήμμα "μαλακό" θα επιστρέφεις και το αποτέλεσμα "μαλάκας", σε αυτή την περίπτωση τί κάνεις;

 

Η μόνη λύση που μπορώ να σκευτώ που θα δουλεύει 100%, αν και σχεδόν ακατόρθωτη αν δεν υπάρχει κάπου έτοιμη, είναι να χρησιμοποιήσεις κάποιο λεξικό που με κάποιο τρόπο να έχει τις συσχετίσεις. Τώρα, πού θα το βρεις, εάν υπάρχει, είναι άλλου παπά ευαγγέλιο...

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Η μόνη λύση που μπορώ να σκευτώ που θα δουλεύει 100%, αν και σχεδόν ακατόρθωτη αν δεν υπάρχει κάπου έτοιμη, είναι να χρησιμοποιήσεις κάποιο λεξικό που με κάποιο τρόπο να έχει τις συσχετίσεις. Τώρα, πού θα το βρεις, εάν υπάρχει, είναι άλλου παπά ευαγγέλιο...

 

Ακόμα κι αυτό μόνο στη θεωρία δουλεύει.

 

Όπως ξαναείπα νωρίτερα: ας υποθέσουμε ότι υπάρχει και το έχει κανείς στα χέρια του. Να τον δω να γράφει PHP/SQL για να πετύχει το επιθυμητό αποτέλεσμα... απλά δεν γίνεται έτσι.

 

δε θέλω (και δεν μπορώ) να εγκαταστήσω software στο server.

 

Χρειάζομαι μια λύση προγραμματιστική (php + mysql)

 

BTW σκέφτηκες να βάλεις Google Search στο site σου αντί να το γράψεις μόνος σου; Αν το δεις με κριτήριο το λόγο αποτελέσματος/προσπάθειας είναι έτη φωτός μπροστά.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

ναι το σκέφτηκα για google search, αλλά το δωρεάν βγάζει διαφημίσεις.

και δε θέλω διαφημίσεις.

 

και ήθελα να αποφύγω τα 100$ κάθε χρόνο για το επι πληρωμή, αν υπήρχε κάτι έτοιμο.

 

όμως δεν είναι τόσο τα λεφτά, όσο το ότι το google search θα βρίσκει σε όλο το website, ενώ εγώ θέλω από συγκεκριμένο πίνακα της βάσης (ένα μέρος του website).

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Θα συμφωνήσω με τον Timonkaipumpa. Να κάνεις την αναζήτηση σου με επίπεδα. Ακόμα και αν δεν είναι πολύ σωστή η αντιστοιχία (π.χ. ψάχνω για γερός και μου φέρνει γέρος) πάλι, στα αποτελέσματα σου, τα κείμενα που θέλεις θα υπάρχουν μέσα. Και αυτό είναι το πιο σημαντικό. Οπότε, αν δεν σε πειράζουν τα σκουπίδια στα αποτελέσματα σου, δεν είναι και τόσο κακή προσέγγιση.

 

Ακόμα κι αυτό μόνο στη θεωρία δουλεύει.

 

Όπως ξαναείπα νωρίτερα: ας υποθέσουμε ότι υπάρχει και το έχει κανείς στα χέρια του. Να τον δω να γράφει PHP/SQL για να πετύχει το επιθυμητό αποτέλεσμα... απλά δεν γίνεται έτσι.

 

Εφόσον έχεις μία σωστή αντιστοιχία των λέξεων (που ναι, είναι πολύ δύσκολο να φτιαχτεί) νομίζω πως η υλοποίηση της αναζήτησης είναι εφικτή.

 

Π.χ. έστω πως αποθηκεύω τα κείμενα μου στον πίνακα pages (id,title, text). Προσθέτω ένα επιπλέον πεδίο searchtext και εκεί βάζω τις "διορθωμένες" λέξεις από τα title και text. Μετά, η αναζήτηση γίνεται πάνω στο πεδίο searchtext, όπου πρώτα τα keywords της αναζήτησης έχουν "διορθωθεί".

 

Μένει να φτιάξεις τη function() για τη διόρθωση. Εγώ θα έλεγα να τα έχεις όλα μικρά, χωρίς τόνους, να διώχνεις μικρές λέξεις (π.χ. άρθρα) και να κόβεις τα 2 τελευταία γράμματα από κάθε λέξη. Σίγουρα το αποτέλεσμα δεν θα είναι 100% ικανοποιητικό, αλλά θα είναι καλύτερο από πριν.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...