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

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

Δημοσ.
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 "Δεν υπάρχει αρχείο!";
	}
?>
Δημοσ.

Αν έχεις δυνατότητα να το κάνεις σε PHP (γενικά με κάτι άλλο εκτός από JS) οι επιλογές σου είναι πολύ καλύτερες, π.χ. δεδομένου ότι το κείμενό σου είναι σε utf-8 τότε μ' αυτό

 

preg_split('/\P{L}+/u', 'foo bar', -1, PREG_SPLIT_NO_EMPTY)

 

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

Δημοσ.

Μάλλον το όλο μου εγχείρημα ήταν λάθος.

Από τον πίνακα με τις λέξεις που δημιουργήθηκε θέλω να αφερώ τα 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);

Έχει κανείς να προτείνει κάτι;

Δημοσ.

Το πρόβλημα ποιό είναι μ' αυτό που έχεις τώρα; Προφανώς είναι μπακάλικη λύση αλλά θα έπρεπε να δουλεύει όπως το περιγράφεις.

Δημοσ.

Αν κατάλαβα καλά έχεις έναν πίνακα με λέξεις και θέλεις να σβήσεις κι αυτές τις οποίες εσύ ξέρεις ότι είναι ίδιες μαυτές αλλά διαφέρουν κατά ένα ή δύο γράμματα και η μηχανή δεν το καταλαβαίνει;

 

Όχι πολύ έμπιστα μπορείς να το λύσεις με ποσοστό πχ ότι η λέξη που έχεις στον πίνακα βρίσκεται στην αρχή της λέξης που τσεκάρεις και ταυτόχρονα αποτελεί το 90% πχ της λέξεις αυτής.

 

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

Δημοσ.

@defacer:

Αν ας πούμε το κείμενο έχει μέσα για παράδειγμα το "couldn't" όπως ανέφερα ... το σβήνει κανονικά γιατί σβήνω όλα τα single quotes.

Αν όμως γράφει "he's" τότε αυτό μένει ως έχει γιατί πολύ απλά έγινε "hes".

 

@akis_fc αυτό με το ποσοστό πως μπορεί να γίνει; (με την similar_text());

 

Αν τελικά βρω έναν πίνακα που να έχει σωστές τις λέξεις (με single quotes) υπάρχει τρόπος να παραμένουν οι λέξεις που περιέχουν απόστροφο ή single quote στο παραπάνω preg_split και να μην τις διαχωρίζει σε δύο;

Δημοσ.

Συγγνώμη σας έχω μπερδέψει (τρελάνει) και εσάς!

 

Καταρχήν να πω ότι πλέον οι απαιτήσεις έχουν αλλάξει και μιλάμε μόνο για αγγλικά.

Αρχικά δεν είχα σκεφτεί τις αποστρόφους καθόλου (μέγα λάθος)!

Αυτό που θέλω είναι όταν μέσα στη λέξη περιέχετε απόστροφος να την καταλαβαίνει ως μία λέξη ενώ όταν περιέχετε λέξη μέσα σε αποστρόφους όχι.

 

π.χ. το he's να το κρατάω έτσι ως μία λέξη ενώ από το 'rafinos' να κρατάει μόνο αυτό.

 

Κάπως καλύτερα τώρα;

 

Το θέμα με τα stopwords ας το αφήσουμε προς στιγμής γιατί αν δε λυθεί αυτό με τις αποστρόφους δουλειά δε γίνεται.

Δημοσ.

Πρώτα πρέπει να σκεφτείς τη λογική που θες να υλοποιήσεις.

Έτσι όπως το λες, μια σκέψη θα ήταν να κάνεις replace τα single quotes' ή αποστρόφους΄ όταν δεν ακολυθεί γράμμα (space, tab, new line, quotes,...).

 

Ισχύει αυτό;

Δημοσ.

/(^|(?!'\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.

Δημοσ. (επεξεργασμένο)

Κλασσική περίπτωση Link.png Site: XY problem ; Δεν περιγράφεις καλύτερα ποιος είναι ο λόγος που θες να διαχωρίσεις τις λέξεις;

Παίρνω από ένα docx αρχείο το κείμενο και ξεχωρίζω τις λέξεις για να δω τη βαρύτητα κάθε μιας λέξης στο κείμενο (πόσες φορές εμφανίζεται). Απλά δε θέλω τις λέξεις από τον $stopwords απλά υπάρχει θέμα με τα stopwords γιατί μπορεί κάτι να περιέχει single_quote στο κείμενο ενώ στον πίνακα όχι...

 

Μια λύση που σκέφτηκα (τέρμα χωριάτικος τρόπoς :P) είναι αυτός:

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 αλλά δεν ήξερα πως να το κάνω :P

Επεξ/σία από rafinos

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

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