Стволовые слова и создание индекса без стоп-слов с помощью Lucene 4.0

У меня следующая проблема: есть несколько текстовых документов, которые мне нужно проанализировать и создать индекс, но без стоп-слов и для определения терминов. Я могу сделать это вручную, но я слышал от коллеги о 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    

1 ответ

Чтобы отфильтровать стоп-слова, используйте StopAnalyzer. Это удалит следующие слова:

  "a", "an", "and", "are", "as", "at", "be", "but", "by",
  "for", "if", "in", "into", "is", "it",
  "no", "not", "of", "on", "or", "such",
  "that", "the", "their", "then", "there", "these",
  "they", "this", "to", "was", "will", "with"

Анализатор может поставляться, если вы используете addDocument(Iterable<? extends IndexableField> doc, Analyzer analyzer) метод, а также во время поиска. Посмотрите Javadoc для большего количества вариантов и деталей.

Для stemming, посмотрите на этот пост.

Трудно советовать больше, потому что вы не объясняете, что именно не удалось.

Другие вопросы по тегам