Comment extraire le Document Terme de Vecteur dans Lucene 3.5.0
Je suis à l'aide de Lucene 3.5.0 et je veux pour une sortie en terme de vecteurs de chaque document. Par exemple, je veux savoir la fréquence d'un terme dans tous les documents et dans chaque document.
Mon code d'indexation est:
import java.io.FileFilter;
import java.io.FileReader;
import java.io.IOException;
import java.io.File;
import java.io.FileReader;
import java.io.BufferedReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.Document;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
public class Indexer {
public static void main(String[] args) throws Exception {
if (args.length != 2) {
throw new IllegalArgumentException("Usage: java " + Indexer.class.getName() + " <index dir> <data dir>");
}
String indexDir = args[0];
String dataDir = args[1];
long start = System.currentTimeMillis();
Indexer indexer = new Indexer(indexDir);
int numIndexed;
try {
numIndexed = indexer.index(dataDir, new TextFilesFilter());
} finally {
indexer.close();
}
long end = System.currentTimeMillis();
System.out.println("Indexing " + numIndexed + " files took " + (end - start) + " milliseconds");
}
private IndexWriter writer;
public Indexer(String indexDir) throws IOException {
Directory dir = FSDirectory.open(new File(indexDir));
writer = new IndexWriter(dir,
new StandardAnalyzer(Version.LUCENE_35),
true,
IndexWriter.MaxFieldLength.UNLIMITED);
}
public void close() throws IOException {
writer.close();
}
public int index(String dataDir, FileFilter filter) throws Exception {
File[] files = new File(dataDir).listFiles();
for (File f: files) {
if (!f.isDirectory() &&
!f.isHidden() &&
f.exists() &&
f.canRead() &&
(filter == null || filter.accept(f))) {
BufferedReader inputStream = new BufferedReader(new FileReader(f.getName()));
String url = inputStream.readLine();
inputStream.close();
indexFile(f, url);
}
}
return writer.numDocs();
}
private static class TextFilesFilter implements FileFilter {
public boolean accept(File path) {
return path.getName().toLowerCase().endsWith(".txt");
}
}
protected Document getDocument(File f, String url) throws Exception {
Document doc = new Document();
doc.add(new Field("contents", new FileReader(f)));
doc.add(new Field("urls", url, Field.Store.YES, Field.Index.NOT_ANALYZED));
doc.add(new Field("filename", f.getName(), Field.Store.YES, Field.Index.NOT_ANALYZED));
doc.add(new Field("fullpath", f.getCanonicalPath(), Field.Store.YES, Field.Index.NOT_ANALYZED));
return doc;
}
private void indexFile(File f, String url) throws Exception {
System.out.println("Indexing " + f.getCanonicalPath());
Document doc = getDocument(f, url);
writer.addDocument(doc);
}
}
quelqu'un peut-il m'aider dans l'écriture d'un programme pour le faire? merci.
OriginalL'auteur orezvani | 2012-01-08
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, vous n'avez pas besoin de stocker terme vecteurs pour savoir uniquement la fréquence du terme dans les documents. Lucene magasins de ces numéros néanmoins de l'utilisation de TF-IDF de calcul. Vous pouvez accéder à cette information en appelant
IndexReader.termDocs(term)
et d'itération sur le résultat.Si vous avez un autre but à l'esprit, et vous avez réellement besoin pour accéder à l'expression des vecteurs, alors vous devez dire à Lucene pour les stocker, en passant
Field.TermVector.YES
comme le dernier argument deField
constructeur. Ensuite, vous pouvez récupérer les vecteurs par exemple avecIndexReader.getTermFreqVector()
.Il aide à trouver tf-idf ?
Désolé, que voulez-vous dire?
Je veux dire une fonction qui est calculée ici: stackoverflow.com/questions/9189179/...
TF-IDF est un acronyme pour "la fréquence des termes"-"inverse document frequency" et c'est fondamental métrique utilisée par défaut, la fonction de similarité dans Lucene. C'est toujours calculée par Lucene pour son usage interne.
OriginalL'auteur Artur Nowak
Je suis sur Lucene core 3.0.3, mais j'attends de l'API sera très similaire. Cette méthode sera au total jusqu'à un terme de fréquence de la carte pour un ensemble donné de numéros de Document et une liste de champs d'intérêt, en ignorant les mots vides.
merci beaucoup, et est-il possible de calculer la tf-idf valeurs à l'intérieur de ces chiffres? stackoverflow.com/questions/9189179/...
ne fonctionne pas avec lucene 4.x
OriginalL'auteur Steve Jones