Autore |
Discussione |
|
antonellaInf
Nuovo Arrivato
4 Messaggi |
Inserito il - 04 settembre 2008 : 12:33:21
|
ciao a tutti,sto lavorando su un progetto che richiede di usare il software statistico R. Mi trovo a dover usare rJava per richiamare un programma java da questo ambiente; la classe che invoco mi crea una matrice termine-documento. il codice che uso è questo:
.jinit(parameters=c("-Xmx1024m")) .jinit(classpath = "C:\\thesis.jar") .jaddClassPath("C:\\Documents and Settings\\ADAMS\\workspace1\\PROJECT\\bin") .jaddClassPath("C:\\plugins") .jaddClassPath("C:\\plugins\\lucene-core-2.3.2.jar") .jaddClassPath("C:\\plugins\\lucene-snowball-2.3.0.jar") .jconstructors("org.rJava/TbDManagement") a <- .jnew("org.rJava/TbDManagement") .jmethods(a) matrix <- .jcall(a, "[[B", "createTbDMatrix") matrix<-as.matrix(matrix) matrix
ora il problema è che se stampo a video il risultato della classe java da eclipse, la frequenza dei termini in ogni documento viene visualizzata in modo corretto, quando invece richiamo l'oggetto da R tramite il comando "matrix" al posto del valore della frequanza mi viene fuori un punto interrogativo. Premettendo che è la prima volta che uso R, qualcuno potrebbe dirmi a cosa è dovuto questo problema e magari saprebbe darmi anche una mano a trovare una soluzione?
|
|
|
data
Nuovo Arrivato
Prov.: Torino
Città: Torino
89 Messaggi |
|
antonellaInf
Nuovo Arrivato
4 Messaggi |
Inserito il - 04 settembre 2008 : 14:18:18
|
ciao, prima di tutto ti ringrazio per avermi risposto. cn as.matrix forzo l'oggetto java a diventare una matrice, mentre per leggerlo uso il comando matrix <- .jcall(a, "[[B", "createTbDMatrix") per cui non credo sia un problema di lettura, anche perchè mi sono accorta che nonostante la dimensione reale della matrice sia 6086x40650 , quando in R uso il comando dim(matrix) il risultato è 40650x1. sono giorni che ci sbatto la testa, ma non riesco a capire quale potrebbe essere il problema |
|
|
data
Nuovo Arrivato
Prov.: Torino
Città: Torino
89 Messaggi |
Inserito il - 04 settembre 2008 : 14:32:14
|
Quello che mi perplime e` che [[B dovrebbe dire che il metodo a.createTbDMatrix torna un array 2d di raw byte, se ho letto bene...questo potrebbe essere un problema per as.matrix che a quanto mi dicono altri R espertosi qui si aspetta i dati gia` formattati come matrice. |
http://www.medito.eu.org/vodka/odierno |
|
|
antonellaInf
Nuovo Arrivato
4 Messaggi |
Inserito il - 04 settembre 2008 : 14:44:08
|
hai perfettamente ragione! il metodo createTbDMatrix restituisce un array di byte a due dimensioni. Ho fatto stamapare in un file .txt la matrice e poi l'ho passata ad R tramite il comando read.table() Il problema però è che quando chiedo la dimensione, mi dice che la matrice letta ha una sola righa, per cui il prblema rimane. |
|
|
antonellaInf
Nuovo Arrivato
4 Messaggi |
Inserito il - 04 settembre 2008 : 14:47:47
|
inserisco il codece della classe java, magari può aiutarvi a capirci qualcosa in più.
public class TbDManagement { public static void main(String[] args) { TbDManagement p = new TbDManagement(); p.createTbDMatrix(); } public byte[][] createTbDMatrix(){ byte[][] termByDocumentMatrix = null; String index = "C:/TESI/IndexLucene"; try { IndexReader reader = IndexReader.open(index); for(int j=0;j<reader.maxDoc();j++){ System.out.println(reader.document(j).getField("title").toString()); Field name=reader.document(j).getField("title"); } int numDocs = reader.maxDoc(); SortedSet<String> vocabulary = new TreeSet<String>(); for (int i = 0; i < numDocs; i++) { // prendo i termini dell'i-esimo documento String[] terms = reader.getTermFreqVectors(i)[0].getTerms(); // li inserisco nel vocabolario for (int k = 0; k < terms.length; k++) { vocabulary.add(terms[k]); //System.out.println(terms[k]); } } Object[] vocArray = vocabulary.toArray(); Arrays.sort(vocArray); int numTerms = vocabulary.size(); System.out.println(numDocs+ " X " + numTerms); termByDocumentMatrix = new byte[numTerms][numDocs]; for (int i = 0; i < numDocs; i++) { //System.out.println((i+1)+ " di " + numDocs); // prendo i termini dell'i-esimo documento String[] terms = reader.getTermFreqVectors(i)[0].getTerms(); // prendo le occorrenze dei termini int[] freqs = reader.getTermFreqVectors(i)[0].getTermFrequencies();
// li inserisco nella matrice for (int k = 0; k < terms.length; k++) { int rowTerm = Arrays.binarySearch(vocArray, terms[k]); termByDocumentMatrix[rowTerm][i] = (byte) freqs[k]; //termByDocumentMatrix[rowTerm][i] = (int) freqs[k]; } } // Scrivo su file FileWriter fileWriter = new FileWriter("C:/TESI/matrix.txt"); for (int i = 0; i < numTerms; i++) { fileWriter.write(vocArray[i] + ";"); for (int j = 0; j < numDocs; j++) { fileWriter.write(termByDocumentMatrix[i][j] + ";"); } fileWriter.write("\n"); } fileWriter.close(); System.out.println(termByDocumentMatrix.length + " " + termByDocumentMatrix[0].length ); } catch (CorruptIndexException e) { e.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } return termByDocumentMatrix;
} } |
|
|
|
Discussione |
|