Как я могу развернуть веб-приложение carrot2, кластеризующее мои собственные данные с помощью индекса lucene

Когда я использовал веб-приложение carrot2 для кластеризации своих данных с индексом lucene, я обнаружил, что результаты не совпадают с моими ожиданиями.

ошибка 1: [В списке результатов справа перечислены только имена файлов кластера без соответствующих текстовых отрывков и местоположений файлов. not Я не уверен, что вызвало проблему, я думаю, возможно, когда я использую lucene для создания формата файла индекса, неправильно, или моя конфигурация проекта веб-приложения carrot2 есть проблема, я надеюсь, что кто-то может сказать мне ответ][извините, я не могу показать свою фотографию для этого, вы можете посмотреть изображение в ошибке два.]

ошибка вторая: я обнаружил, что мои результаты поиска показали, что "другие темы" не только конкретная тема, это беспокоит меня. Я думаю, что может быть проблема с кластеризацией алгоритма или тема тестовых данных, которую я предоставил слишком мало причин.

Когда я использую алгоритм кластеризации K-средних results, в результате появилось много тем, но нет конкретного имени темы, а только имя файла.

Если кто-то может ответить на мои сомнения, я буду очень признателен, и ваш ответ будет вам полезен.

это мой код для создания файлов индекса Lucene:

  package test2;

import org.apache.lucene.index.IndexFileNames;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.LongField;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.Directory;
import org.apache.lucene.util.Version;
import org.carrot2.source.lucene.SimpleFieldMapper;

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.io.FileReader;


//lucene 4.9
public class LuceneDemo2 {
    public static void main(String[] args) throws Exception {
        String indexDir = "D:\\data\\lucene\\odp\\index-all";
        String dataDir = "D:\\data";

        long start = System.currentTimeMillis();
        LuceneDemo2 indexer = new LuceneDemo2(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 LuceneDemo2(String indexDir) throws IOException {
        // TODO Auto-generated constructor stub
        Directory directory = FSDirectory.open(new File(indexDir));
        Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_4_9);
        IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_4_9,analyzer);
        config.setOpenMode(OpenMode.CREATE);
        writer = new IndexWriter(directory,config);
    }

    public void close() throws IOException {
        writer.close();
    }

    public int index (String dataDir,FileFilter filter) throws Exception {
        File[] files = new File(dataDir).listFiles();

        //if(files == null) return writer.numDocs();
        for(File f: files) {
            if(!f.isDirectory()&&
                !f.isHidden()&&
                f.exists()&&
                f.canRead()&&
                (filter == null || filter.accept(f))) {
                indexFile(f);
            }
        }

        /*
        if(files == null) return writer.numDocs();
        for(int i=0;i<files.length&&files!=null;i++) {
            if(!files[i].isDirectory()&&
                !files[i].isHidden()&&
                files[i].exists()&&
                files[i].canRead()&&
                (filter == null || filter.accept(files[i]))) {
                indexFile(files[i]);
            }
        }
        */
        return writer.numDocs();
    }

    private static class TextFilesFilter implements FileFilter {
        public boolean accept(File path) {
            return path.getName().toLowerCase().endsWith(".txt");
        }   
    }

    private Document getDocument(File f) throws Exception {
        // TODO Auto-generated method stub
        Document document = new Document();
        document.add(new StringField("path",  f.getAbsolutePath(), Field.Store.YES));
        document.add(new LongField("modified", f.lastModified(), Field.Store.NO)); 
        document.add(new TextField("content", new FileReader(f)));
        document.add(new TextField("title", f.getName(), Field.Store.YES));

        return document;
    }

    private void indexFile(File f) throws Exception {
        // TODO Auto-generated method stub
        System.out.println("Indexing "+ f.getCanonicalPath());
        Document document = getDocument(f);
        writer.addDocument(document);
    }   
}

это мой код индексации файлов PDF (часть этого):

private void indexFile(File f) throws Exception {
        // TODO Auto-generated method stub
        System.out.println("Indexing "+ f.getCanonicalPath());
        //Document d = LucenePDFDocument.getDocument(f);
        String executeStr = "D:\\xpdf\\xpdfbin-win-3.04\\bin64\\pdftotext.exe";
        String[] cmd = new String[]{executeStr,"-enc","UTF-8","-q",f.getAbsolutePath(),"-"};  
        String str = null ; 
        Process p = null ;     
        BufferedReader br = null ;  
        StringBuffer sb = new StringBuffer() ;
        try {  
            p = Runtime.getRuntime().exec(cmd) ;               
            br = new BufferedReader(new InputStreamReader(p.getInputStream(),"UTF-8")) ;    
            while((str = br.readLine() ) != null ){  
                sb.append(str).append("\n") ;  
            }               
        } catch (IOException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        } finally{  
            if (br != null){  
                try {  
                    br.close() ;  
                } catch (IOException e) {  
                    // TODO Auto-generated catch block  
                    e.printStackTrace();  
                }  
            }  
        }  
        String content = sb.toString();
        Document document = new Document();
        document.add(new StringField("url",  f.getAbsolutePath(), Store.YES));
        document.add(new TextField("content", content,Store.YES));
        document.add(new TextField("title", f.getName(), Store.YES));
        writer.addDocument(document);
    }   

1 ответ

Алгоритмы Carrot2 работают с необработанным текстом документов, поэтому все поля содержимого, которые вы хотите кластеризовать, должны быть сохранены (Field.Store.YES). Чтобы ваше поле "содержимого" сохранялось в индексе, самым простым решением было бы прочитать содержимое соответствующего файла в String а затем использовать строковый конструктор TextField учебный класс.

Как только вы переиндексируете свой контент и установите Carrot2 в кластер на основе полей "title" и "content", вы должны увидеть несколько значимых кластеров.

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