Newsgroup: it.comp.www.php
Titolo: Problema su elaborazione di un testo

Ciao, sto realizzando uno studio sulle potenzialità del PHP nell'analisi
di un testo. In pratica devo realizzare uno script che mi permetta di
individuare gli argomenti di blocchi di frasi all'interno di questo
testo.
Il primo problema che ho incontrato è il seguente.
Ho riempito un array con le frasi che compongono il .txt attraverso la
funzione explode(".", $arg) e fin qui OK, poi devo formare blocchi da
tre-quattro frasi e fin qui OK con l'utilizzo del semplice operatore di
concatenazione ".", e poi di questi blocchi (depurati dalle parole
inutili tipo articoli, congiunzioni preposizioni attraverso
array_filter) devo vedere quali sono le parole che li compongono e qui
ho il problema. Se io ho due frasi separate da punto che però non vanno
a capo lui mi individua tutte le parole ma se ho due frasi che vanno a
capo lui mi considera l'ultima della prima legata alla prima della
seconda. Es per chiarire:
Se ho:
Oggi mangio. Domani dormo
l'analisi mi da questo responso
[0]=Oggi
[1]=mangio
[2]=Domani
[3]=dormo
ma se ho:
Oggi mangio. (a capo)
Domani dormo
mi da
[0]=Oggi
[1]=mangio Domani
[2]=dormo
e da dire che la funzione explode in ambo i casi mi individua due frasi
diverse e per individuare le parole delle frasi utilizzo di nuovo
explode(" ", $frasi)
Qualche idea?
Grazie fin da ora
P.S.: posto il codice per completezza:
<?php
$fd=fopen("tesi2.txt","rb");
$riga=fread($fd,filesize("tesi2.txt"));
//pulisco le righe lette dai simboli di punteggiatura, forse dovrei
pulirle
da parentesi, virgolette....
$riga=str_replace(",","",$riga);
$riga=str_replace(";","",$riga);
$riga=str_replace(":","",$riga);
//l'array "array" contiene le frasi fino al punto
$array=explode(".",$riga);
$dim=count($array)-1;
for ($i=0;$i<$dim;$i++) {
print $i;
print "=";
print $array[$i];
print "<br>";
}
print "<p>";
$blocco[0]=$array[0].$array[1].$array[2].$array[3];
$parole_frase=explode(" ",$blocco[0]);
//ho costruito una funzione che mi "depura" l'array delle stopword
questo
è solo un primo elenco, inoltre c'è anche il problema che gli elementi
dell'array
sono case sensitive
function stopword($var) {
return ($var != "di"
&& $var != "a"
&& $var != "da"
&& $var != "in"
&& $var != "con"
&& $var != "su"
&& $var != "per"
&& $var != "tra"
&& $var != "fra"
&& $var != "nel"
&& $var != "nello"
&& $var != "nella"
&& $var != "nei"
&& $var != "della"
&& $var != "che"
&& $var != "più"
&& $var != "anche"
&& $var != "un"
&& $var != "una"
&& $var != "uno"
&& $var != "dei"
&& $var != "allo"
&& $var != "alla"
&& $var != "ai"
&& $var != "sulla"
&& $var != "sullo"
&& $var != "sui"
&& $var != "e"
&& $var != "o"
&& $var != "il"
&& $var != "le"
&& $var != "la"
&& $var != "gli"
&& $var != "i"
&& $var != "lo"
&& $var != "Lo"
&& $var != "Il"
&& $var != "Le"
&& $var != "La"
&& $var != "Gli"
&& $var != "I"
&& $var != "sui"
&& $var != "sulla"
&& $var != "sullo"
&& $var != "sul"
&& $var != "dalla"
&& $var != "dai"
&& $var != "dallo"
&& $var != "è"
&& $var != "era"
&& $var != "ha"
&& $var != "hanno"
&& $var != "questo"
&& $var != "questa"
&& $var != "quei"
&& $var != "del"
&& $var != "Ci"
&& $var != "ci"
&& $var != "Quasi"
&& $var != "quasi"
&& $var != "sono"
&& $var != "qualche"
&& $var != "si"
/*
&& $var != "di"
&& $var != "di"
*/
);
}
//applico la funzione che elimina le stop-word e ottengo l'array
$parole_filter
depurato dalle stop-word
$parole_filter=array_filter($parole_frase, "stopword");
//ho la necessità di ordinarlo per sistemare gli indici, alla fine
ottengo
$array_f che è un array surrogato della mia frase iniziale
asort($parole_filter);
$i=0;
while (list($chiave,$valore) = each($parole_filter)) {
//echo "$chiave=$valore";
//echo "<br>";
$array_f[$i]=$valore;
$i=$i+1;
}
//faccio una prova di stampa: OK!
while (list($chiave1,$valore1) = each($array_f)) {
echo "$chiave1=$valore1";
echo "<br>";
}
print "<p>";
//questa funzione restituisce la frequenza delle chiavi presenti
nell'array
$array_freq=array_count_values($array_f);
//$array_freq non è altro che un array che contiene le frequenze delle
varie
parole nelle frasi
while (list($chiave1,$valore1) = each($array_freq)) {
echo "$chiave1=$valore1";
echo "<br>";
}
fclose($fd);
?>

 explode(" ", $frasi)
Usa
  $lista=preg_split("/[\s\.;]+/s",$frasi);
e ti crea un array diviso tra . e qualsiasi tipo di whitespace (tab,
linefeed, spazio).
Caso estremo:
  $lista=preg_split("/[^a-z]+/is",$frasi);
che divide tutto cio' che non sia una lettera del alfabeto (quindi ignora
anche (){}[],;.?! ecc.)