2013-11-19 2 views
1

Я пытаюсь классифицировать текстовые документы с помощью lucene 4.4. Для этого я использую класс KNearestNeighbour (назовите его KNN для удобства). Я проиндексировал все документы, но я застрял с использованием метода поезда класса KNN, который принимает AtomicReader в качестве аргумента (наряду с еще тремя аргументами). Я передал IndexReader (с/без ввода типа в AtomicReader) в качестве аргумента, но он дает ошибку. AtomicReader является подклассом IndexReader. Возможно, это проблема.Метод AtomicReader и KNearestNeighbour train()

Но мой вопрос заключается в том, как создать объект AtomicReader и передать его методу поезда. Мне кажется, что способ создания AtomicReader по индексу отличается от создания IndexReader. (Atomic reader - абстрактный класс, поэтому мы возможно, придется использовать объект своего подкласса).

Ниже приведен фрагмент кода. {indexLoc} - путь к каталогу, в котором я создал свой индекс. {knn} - объект класса KNearestNeighbour, который является членом данных моего класса.

public void startClassification() { 

    try { 
      StandardAnalyzer analyzer1 = new StandardAnalyzer(Version.LUCENE_44); 
      FSDirectory index = FSDirectory.open(new File(indexLoc)); 

      /*(???how to create an appropriate AtomicReader object)*/ 
      IndexReader reader = DirectoryReader.open(index); 

      knn = new KNearestNeighborClassifier(k); 
      knn.train(reader, "content", "category", analyzer1); 
      classifyTestData(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

ответ

2

Вы можете получить AtomicReader перебором leaves из ваших IndexReader:

for (AtomicReaderContext context : reader.leaves()) { 
    final AtomicReader atomicReader = context.reader(); 
    knn.train(atomicReader, "content", "category", analyzer1); 
} 

Хотя DirectoryReader является IndexReader, который имеет один или несколько дополнительных читателей - для каждого сегмента указательным - AtomicReader - это IndexReader, у которого нет поддиректоров. Таким образом, AtomicReader рассматривает документы только из одного сегмента и содержит «глобальные» docIds от context.docBase до context.docBase + reader.maxDoc()

+0

Спасибо. Существует ли какая-либо надлежащая документация по использованию для класса KNearestNeighbour? Я выполнил свою программу, следуя ее резюме. Два начальных класса - 1. одежда (~ 180 экземпляров поездов, 10 примеров испытаний) 2. автомобильная (~ 180 экземпляров поездов, 10 тестовых примеров). фрагмент кода - ClassificationResult thisclass = knn.assignClass (siteText); System.out.println (thisclass.getAssignedClass()); System.out.println (thisclass.getScore()); Выход is- [61 75 74 6f 6d 6f 74 69 76 65] 1.0 Как интерпретировать этот результат на {одежда/автомобиль)? – user2673652

+0

Спасибо. Мое выше сомнение теперь очищается. knn.assignClass (siteText) возвращает объект BytesRef и для просмотра результата мы должны преобразовать кодировку. – user2673652

Смежные вопросы