rafinos Δημοσ. 4 Νοεμβρίου 2014 Μέλος Δημοσ. 4 Νοεμβρίου 2014 string.split(/[\wα-ζΑ-ΖάέήίόώϊΐΆΈΉΊΌΏΪ]/g).filter(function(t){ return t != '' }); Αυτό είναι καταστροφικό. ΥΓ2: Βεβαίως δε χρειάζεται καμία filter, απλά να ξέρεις τα βασικά από regex για να προσθέσεις ένα +: /\W+/g Αυτό δουλεύει τέλεια (μόνο με λατινικά) απλά μάλλον έχω κάτι στο κείμενο μου (το κείμενο δεν είναι standar) που επιστρέφει ένα κενό άρα πάλι θέλει filter για καλό και για κακό... Επειδή η javascript είναι κάπως μαλωμένη με τα unicode μήπως τελικά να το στέλνω έτσι σε άλλο αρχείο <input type="hidden" id="hidden_element2" name="hidden_element2" value="<?php echo htmlentities(nl2br($kv_texts)); ?>"> και εν συνεχεία να κάνω το παρακάτω; $a = strip_tags($_POST['hidden_element2']); $a = preg_replace('!\s+!', ' ', $a); $a = preg_split("/\W+/u", $a); $a = array_filter($a); Το κείμενο το παίρνω από docx και το περνάω σε div ... το βάζω μήπως έχει κάποιο θέμα ο τρόπος μεταφοράς του κειμένου... <?php function kv_read_word($input_file){ $kv_strip_texts = ''; $kv_texts = ''; if(!$input_file || !file_exists($input_file)) return false; $zip = zip_open($input_file); if (!$zip || is_numeric($zip)) return false; while ($zip_entry = zip_read($zip)) { if (zip_entry_open($zip, $zip_entry) == FALSE) continue; if (zip_entry_name($zip_entry) != "word/document.xml") continue; $kv_texts .= zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)); zip_entry_close($zip_entry); } zip_close($zip); $kv_texts = str_replace('</w:r></w:p></w:tc><w:tc>', " ", $kv_texts); $kv_texts = str_replace('</w:r></w:p>', "\r\n", $kv_texts); $kv_strip_texts = strip_tags($kv_texts); return $kv_strip_texts; } //Έλέγχος για το αν υπάρχει ένα αρχείο στον φάκελο $folder = 'uploads'; if($handle = opendir($folder)){ $filecount = 0; while (false !== ($file = readdir($handle))){ if ($file<>"." AND $file<>".."){ if (is_file($folder.'/'.$file)){ $filecount++; } } } } //Αν υπάρχει ένα αρχείο επέστρεψε το όνομα του if($filecount === 1){ foreach(glob("uploads/*.docx") as $file){ $filename = $file; } } if(isset($filename)){ $kv_texts = kv_read_word($filename); if($kv_texts !== false) { echo "<div id='text'>"; $kv_texts = trim($kv_texts); echo nl2br($kv_texts); echo "</div>"; }else{ echo "Δεν μπορεί να διαβαστεί το αρχείο!"; } }else{ echo "Δεν υπάρχει αρχείο!"; } ?>
defacer Δημοσ. 4 Νοεμβρίου 2014 Δημοσ. 4 Νοεμβρίου 2014 Αν έχεις δυνατότητα να το κάνεις σε PHP (γενικά με κάτι άλλο εκτός από JS) οι επιλογές σου είναι πολύ καλύτερες, π.χ. δεδομένου ότι το κείμενό σου είναι σε utf-8 τότε μ' αυτό preg_split('/\P{L}+/u', 'foo bar', -1, PREG_SPLIT_NO_EMPTY) θα σου δουλέψει σωστά σχεδόν σε όλες τις περιπτώσεις ανεξαρτήτως γλώσσας (και κινέζικα έχω). Και με το "σχεδόν όλες" εννοώ "θεωρητικά μπορείς να κατασκευάσεις είσοδο τέτοια που να μη δουλεύει σωστά αλλά στην πράξη δεν πρόκειται να δεις τέτοιο πράγμα εσύ".
rafinos Δημοσ. 4 Νοεμβρίου 2014 Μέλος Δημοσ. 4 Νοεμβρίου 2014 Ευχαριστώ πάρα πολύ! Όντως δουλεύει ρολόι!
rafinos Δημοσ. 6 Νοεμβρίου 2014 Μέλος Δημοσ. 6 Νοεμβρίου 2014 Μάλλον το όλο μου εγχείρημα ήταν λάθος. Από τον πίνακα με τις λέξεις που δημιουργήθηκε θέλω να αφερώ τα stopwords. Τα stopwords είναι αποθηκευμένα σε έναν πίνακα όπως αυτόν εδώ. Το πρόβλημα που προκύπτει είναι το εξής... ας πούμε στον πίνακα υπάρχει η λεξη couldnt ενώ κανονικά είναι couldn't. Αν πριν από το διαχωρισμό των λέξεων αφαιρέσω πρώτα τα single quotes θα μου το σβήσει χωρίς πρόβλημα (το couldn't θα γίνει couldnt). Σε αυτή την περίπτωση όμως δημιουργείτε πάλι πρόβλημα. Στη λίστα υπάρχει το what. Αν εγώ έχω στο κείμενο what's (και με τις μετατροπές γίνει whats) πολύ απλά δεν το σβήνει γιατί είναι διαφορετική λέξη. Τώρα έδωσα απλά ένα παράδειγμα δύο λέξεων... όπως όλοι ξέρουμε δεν είναι μόνο δύο οι λέξεις όμως. Η λύση με διαγραφή των single quotes είναι αυτή.... $str = str_replace("'", "", $str); $allwords = preg_split('/\P{L}+/u', $str , -1, PREG_SPLIT_NO_EMPTY); $words = array_diff($allwords, $stopwords); Έχει κανείς να προτείνει κάτι;
defacer Δημοσ. 6 Νοεμβρίου 2014 Δημοσ. 6 Νοεμβρίου 2014 Το πρόβλημα ποιό είναι μ' αυτό που έχεις τώρα; Προφανώς είναι μπακάλικη λύση αλλά θα έπρεπε να δουλεύει όπως το περιγράφεις.
akis_fc Δημοσ. 6 Νοεμβρίου 2014 Δημοσ. 6 Νοεμβρίου 2014 Αν κατάλαβα καλά έχεις έναν πίνακα με λέξεις και θέλεις να σβήσεις κι αυτές τις οποίες εσύ ξέρεις ότι είναι ίδιες μαυτές αλλά διαφέρουν κατά ένα ή δύο γράμματα και η μηχανή δεν το καταλαβαίνει; Όχι πολύ έμπιστα μπορείς να το λύσεις με ποσοστό πχ ότι η λέξη που έχεις στον πίνακα βρίσκεται στην αρχή της λέξης που τσεκάρεις και ταυτόχρονα αποτελεί το 90% πχ της λέξεις αυτής. Για οποιαδήποτε σοβαρή υλοποίηση πέραν αυτής, στην οποία εγώ έχω καταφέρει να καταλήξω (μπορεί να υπάρχει και να την αγνοώ) είναι να μάθεις ρίζες λέξεων, καταλήξεις κλπ στην μηχανή. Το οποίο θα σε βοηθήσει αρκετά να κάνεις χειριστείς κείμενο γενικότερα πέρα από τα stopwords.
rafinos Δημοσ. 6 Νοεμβρίου 2014 Μέλος Δημοσ. 6 Νοεμβρίου 2014 @defacer: Αν ας πούμε το κείμενο έχει μέσα για παράδειγμα το "couldn't" όπως ανέφερα ... το σβήνει κανονικά γιατί σβήνω όλα τα single quotes. Αν όμως γράφει "he's" τότε αυτό μένει ως έχει γιατί πολύ απλά έγινε "hes". @akis_fc αυτό με το ποσοστό πως μπορεί να γίνει; (με την similar_text()); Αν τελικά βρω έναν πίνακα που να έχει σωστές τις λέξεις (με single quotes) υπάρχει τρόπος να παραμένουν οι λέξεις που περιέχουν απόστροφο ή single quote στο παραπάνω preg_split και να μην τις διαχωρίζει σε δύο;
akis_fc Δημοσ. 6 Νοεμβρίου 2014 Δημοσ. 6 Νοεμβρίου 2014 Με την similar_text http://php.net/manual/en/function.similar-text.php. Αλλά να σου επισημάνω ακόμη μια ότι δεν είναι και πολύ αξιόπιστη από μόνη της γιατί υπάρχουν αρκετές λέξεις που μοιάζουν αλλά δεν θέλεις να τις βάλεις στο ίδιο τσουβάλι.
defacer Δημοσ. 6 Νοεμβρίου 2014 Δημοσ. 6 Νοεμβρίου 2014 Ρε συ rafinos μη τα βγάζουμε με το τσιγκέλι. Το he's τι θα έπρεπε να γίνει τελικά;
rafinos Δημοσ. 6 Νοεμβρίου 2014 Μέλος Δημοσ. 6 Νοεμβρίου 2014 Συγγνώμη σας έχω μπερδέψει (τρελάνει) και εσάς! Καταρχήν να πω ότι πλέον οι απαιτήσεις έχουν αλλάξει και μιλάμε μόνο για αγγλικά. Αρχικά δεν είχα σκεφτεί τις αποστρόφους καθόλου (μέγα λάθος)! Αυτό που θέλω είναι όταν μέσα στη λέξη περιέχετε απόστροφος να την καταλαβαίνει ως μία λέξη ενώ όταν περιέχετε λέξη μέσα σε αποστρόφους όχι. π.χ. το he's να το κρατάω έτσι ως μία λέξη ενώ από το 'rafinos' να κρατάει μόνο αυτό. Κάπως καλύτερα τώρα; Το θέμα με τα stopwords ας το αφήσουμε προς στιγμής γιατί αν δε λυθεί αυτό με τις αποστρόφους δουλειά δε γίνεται.
alou Δημοσ. 6 Νοεμβρίου 2014 Δημοσ. 6 Νοεμβρίου 2014 Πρώτα πρέπει να σκεφτείς τη λογική που θες να υλοποιήσεις. Έτσι όπως το λες, μια σκέψη θα ήταν να κάνεις replace τα single quotes' ή αποστρόφους΄ όταν δεν ακολυθεί γράμμα (space, tab, new line, quotes,...). Ισχύει αυτό;
defacer Δημοσ. 6 Νοεμβρίου 2014 Δημοσ. 6 Νοεμβρίου 2014 /(^|(?!'\p{L}))\P{L}+/uΗ απόστροφος θα χρειαστεί quoting αν μπει μέσα σε μονά εισαγωγικά. 'He's a good man', said the barkeep, 'but his brother isn't'. 'Do we have a deal?' I asked. 'Done' he replied. Το αστείο "I know, I'll use regular expressions!" / you now have two problems ισχύει αλλά για κάτι τέτοιες περιπτώσεις είναι τρελλό value for money.
rafinos Δημοσ. 6 Νοεμβρίου 2014 Μέλος Δημοσ. 6 Νοεμβρίου 2014 Στο τέλος θα βλέπεις τo nick μου και θα πατάς logout! Ευχαριστώ πάρα πολύ!
t(o.ot) Δημοσ. 7 Νοεμβρίου 2014 Δημοσ. 7 Νοεμβρίου 2014 Κλασσική περίπτωση Site: XY problem ; Δεν περιγράφεις καλύτερα ποιος είναι ο λόγος που θες να διαχωρίσεις τις λέξεις;
rafinos Δημοσ. 11 Νοεμβρίου 2014 Μέλος Δημοσ. 11 Νοεμβρίου 2014 (επεξεργασμένο) Κλασσική περίπτωση Site: XY problem ; Δεν περιγράφεις καλύτερα ποιος είναι ο λόγος που θες να διαχωρίσεις τις λέξεις; Παίρνω από ένα docx αρχείο το κείμενο και ξεχωρίζω τις λέξεις για να δω τη βαρύτητα κάθε μιας λέξης στο κείμενο (πόσες φορές εμφανίζεται). Απλά δε θέλω τις λέξεις από τον $stopwords απλά υπάρχει θέμα με τα stopwords γιατί μπορεί κάτι να περιέχει single_quote στο κείμενο ενώ στον πίνακα όχι... Μια λύση που σκέφτηκα (τέρμα χωριάτικος τρόπoς ) είναι αυτός: function remove_words($a,$b,$array){ $x = levenshtein($a,$; if($x === 0){ unset($array[$a]); return true; }else if($x === 1){ $a_len = strlen($a); $b_len = strlen($; if($a_len != $b_len){ $pos_a = strpos($a,"'"); $pos_b = strpos($b,"'"); if($pos_a != false && $pos_b != false){ return false; }else if($pos_a != false || $pos_b != false){ unset($array[$a]); return true; } } }else{ return false; } } Είναι σωστό; (Το σκεπτικό πιο πολύ παρά ο κώδικας) Αρχικά είχα σκεφτεί να τσεκάρω ένα ένα τα γράμματα αν είναι ίδια και στα δύο string μέχρι να φτάσω σε ένα από τα δύο σε single_quote αλλά δεν ήξερα πως να το κάνω Επεξ/σία 11 Νοεμβρίου 2014 από rafinos
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα