основные слова и создать индекс без стоп-слов с помощью 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    

person user1864229    schedule 04.01.2013    source источник


Ответы (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.

Для определения основы посмотрите это сообщение SO.

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

person mindas    schedule 04.01.2013
comment
mindas, спасибо. это код, который я пробовал до сих пор, он удаляет только стоп-слова (как мне добавить свой собственный набор стоп-слов?) попробовал ссылку, которую вы разместили, но import porterStemmer не виден (на самом деле не знаю, что такое смысл этого) У меня есть банка lucene 3.6 только в моем пути сборки. - person user1864229; 04.01.2013
comment
StopAnalyzer имеет еще один конструктор, в котором вы можете указать свой собственный набор стоп-слов. Что касается стемминга, то porterStemmer нужно скачивать отдельно, взгляните на анализаторы Lucene. баночка. - person mindas; 04.01.2013