У меня следующая проблема: есть несколько текстовых документов, которые мне нужно разобрать и создать индекс, но без стоп-слов и для определения терминов. Я могу сделать это вручную, но я слышал от коллеги о Lucene, который может делать это автоматически. Я искал в Интернете и нашел много примеров, которые я пробовал, но каждый пример использует другую версию lucene и разные методы, и ни один из примеров не является полным. В конце этого процесса мне нужно рассчитать tf/idf для каждого термина в моей коллекции.
обновление: на данный момент я создал индекс с одним документом. Документ не содержит стоп-слов и имеет основу. как рассчитать tf/idf для этого документа с помощью lucenc? (Я добавлю больше документов после того, как выясню, как сделать расчет)
Любая помощь с Lucene будет оценена по достоинству. Спасибо.
import java.io.*;
import java.util.HashSet;
import org.apache.lucene.analysis.*;
import org.apache.lucene.analysis.tokenattributes.*;
import org.apache.lucene.analysis.standard.*;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.*;
import org.apache.lucene.analysis.snowball.*;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
public class Stemmer
{
static HashSet<String> stopWordsList = null;
public static String Stem(String text, String language) throws IOException
{
parse p = new parse();
stopWordsList = p.readStopWordsFile();
StringBuffer result = new StringBuffer();
if (text!=null && text.trim().length()>0)
{
StringReader tReader = new StringReader(text);
// Analyzer analyzer = new StopAnalyzer(Version.LUCENE_36,stopWordsList);
@SuppressWarnings("deprecation")
Analyzer analyzer = new SnowballAnalyzer(Version.LUCENE_35,"English",stopWordsList);
// disk index storage
Directory directory = FSDirectory.open(new File("d:/index"));
@SuppressWarnings("deprecation")
IndexWriter writer = new IndexWriter(directory, analyzer, true, new IndexWriter.MaxFieldLength(25000));
TokenStream tStream = analyzer.tokenStream("contents", tReader);
@SuppressWarnings("deprecation")
TermAttribute term = tStream.addAttribute(TermAttribute.class);
try {
while (tStream.incrementToken())
{
result.append(term.term());
result.append(" ");
}
Document doc = new Document();
String title = "DocID";
// adding title field
doc.add(new Field("title", title, Field.Store.YES, Field.Index.ANALYZED));
String content = result.toString();
// adding content field
doc.add(new Field("content", content, Field.Store.YES, Field.Index.ANALYZED));
// writing new document to the index
writer.addDocument(doc);
writer.close();
System.out.println("Reult is: " + result);
}
catch (IOException ioe)
{
System.out.println("Error: "+ioe.getMessage());
}
}
// If, for some reason, the stemming did not happen, return the original text
if (result.length()==0)
result.append(text);
return result.toString().trim();
} //end stem
public static void main (String[] args) throws IOException
{
Stemmer.Stem("Michele Bachmann amenities pressed her allegations that the former head of her Iowa presidential bid was bribed by the campaign of rival Ron Paul to endorse him, even as one of her own aides denied the charge.", "English");
}
}//end class