2014-11-20 3 views
1

У меня есть большое количество документов (более миллиона), которые мне нужно регулярно проверять и сопоставлять с 100 «ключевыми словами с несколькими словами» (т. Е. Не только такие ключевые слова, как «фильмы» «но и« северный американец »). У меня есть следующий код, который отлично работает с одиночными словами ключевыми словами (то есть «книга»):Сканирование большого количества документов для десятков слов

/** 
* Scan a text for certain keywords 
* @param keywords the list of keywords we are searching for 
* @param text the text we will be scanning 
* @return a list of any keywords from the list which we could find in the text 
*/ 
public static List<String> scanWords(List<String> keywords, String text) { 

    // prepare the BreakIterator 
    BreakIterator wb = BreakIterator.getWordInstance(); 
    wb.setText(text); 

    List<String> results = new ArrayList<String>(); 

    // iterate word by word 
    int start = wb.first(); 
    for (int end = wb.next(); end != BreakIterator.DONE; start = end, end = wb.next()) { 

     String word = text.substring(start, end); 

     if (!StringUtils.isEmpty(word) && keywords.contains(word)){ 

      // we have this word in our keywords so return it 
      results.add(word); 
     } 
    } 

    return results; 
} 

Примечание: Мне нужен этот код, чтобы быть как можно более эффективными, поскольку количество документов очень велико.

В моем текущем коде не найдено ни одного из двух ключевых слов ключевого слова. Любая идея о том, как исправить? Я также прекрасно понимаю совершенно другой подход.

+3

Почему бы вам не попробовать [Lucene] (http://lucene.apache.org/) для такой задачи? –

+0

Да, вероятно, было бы лучше использовать систему индексирования, которая поддерживает файлы. Кстати, какой текст вам нужен миллион файлов? Если каждый содержит 10 слов, это 10 миллионов слов. Представьте себе ввод-вывод, чтобы открыть или закрыть их. – sln

+0

Мне нужно хранить только найденные ключевые слова в моем db. Индексирование не является решением. – checklist

ответ

3

Сканирование каждого документа не масштабируется вовсе. Лучше проиндексируйте свой документ в inverted index Или как в комментарии используйте Lucene.

+0

Индексирование не подходит для моей задачи. – checklist

-1

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

Scanner scanner=new Scanner(text); 
while(scanner.hasNext()){ 
    scanner.findInLine(String pattern); 
    scanner.next(); 
} 

Scanner класс хорош для делать вещи, как это, и я считаю, что это будет работать нормально, для чего вам это нужно.

+0

Основная проблема заключается в том, что он должен искать много разных ключевых слов/фраз в каждом документе. Вы предлагаете ему сбросить Сканер и выполнить поиск всего документа один раз для каждого шаблона? Вы не можете действительно знать, пока не попытаетесь, но я был бы очень удивлен, если бы он работал достаточно хорошо. И что вы делаете с этим вызовом 'findInLine()'? Для меня это не имеет смысла. –

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