2014-01-23 5 views
0

Я должен извлечь репрезентативные термины с веб-сайта организации, используя дамп данных статьи-ссылки wikipedia. Для достижения этой цели Я -Как улучшить производительность при работе с данными в википедии и огромным нет. веб-страниц?

  1. Просканировано веб-страниц & загружающие организации. (~ 110 000)
  2. Создал словарь с идентификатором и термином/названием wikipedia. (~ 40 млн записей)

Теперь я должен обрабатывать каждый из веб-страниц с использованием словаря распознавать термины и отслеживать их срока IdS & частот.

Чтобы словарь вписывался в память, я разделил словарь на более мелкие файлы. Основываясь на моем эксперименте с небольшим набором данных, время обработки для выше будет около 75 дней.

И это только для 1 организации. Я должен сделать то же самое для более чем 40 из них.

Реализация -

  • HashMap для хранения словаря в памяти.
  • Прокрутка каждой записи карты для поиска термина на веб-странице с использованием реализации поиска Boyer-Moore.
  • Повторяя приведенное выше для каждой веб-страницы и сохраняя результаты в HashMap.

Я попытался оптимизировать код и настроить JVM для лучшей производительности.

Может кто-нибудь, пожалуйста, посоветуйте более эффективный способ реализовать вышеизложенное, сократив время обработки до нескольких дней.

Возможно ли использовать Hadoop?

+0

Вы должны обязательно использовать Lucene для выполнения этой задачи. –

+0

Спасибо @MarkoTopolnik. Я проведу Lucene. – user3227868

ответ

0

Основываясь на ваш вопрос:

Number of Documents = 110000 

Dictionary => List of [TermID, Title Terms] = 40million entries 

Size of documents = 11000 * 1KB per document on an average = 26.9GB 
(1KB per document on an average) 

Size of dictionary = 40million * 256bytes = 9.5GB of raw data 
(256bytes per entry on an average) 

Как вы пришли к оценке 75 дней?

Есть ряд целевых показателей:

  • Как вы хранения документов?
  • Как вы храните/извлекаете словарь? (предполагая не все это в памяти, если вы не можете позволить себе)
  • Сколько машин вы используете?
  • Выполняется ли поиск по словарю параллельно? (Из курса при условии, словарь неизменен, как только вы уже обработали всю Википедию)

Вот набросок того, что я считаю, что вы делаете:

dictionary = read wikipedia dictionary 
document = a sequence of documents 
documents.map { doc => 
    var docTermFreq = Map[String, Int]() 
    for(term <- doc.terms.map if(dictionary.contains(term))) { 
    docTermFreq = docTermFreq + (term -> docTermFreq.getOrElse(term, 0) + 1) 
    } 
    // store docTermFreq map 
} 

Что это, по существу, делает разваливается каждый документ в токены, а затем выполняет поиск в словаре википедии для его существования.

Это именно то, что делает Lucene Analyzer.

A Lucene Tokenizer преобразует документ в токены. Это происходит до того, как термины индексируются в люцен. Итак, все, что вам нужно сделать, это реализовать анализатор, который может искать словарь Википедии, для того, является ли токен в словаре.

Я хотел бы сделать это следующим образом:

  • Возьмите каждый документ и подготовить маркер потока (используя анализатор описано выше) Index
  • условия документа.
  • На данный момент у вас будут только условия википедии, в индексе Lucene.

Когда вы сделаете это, вы будете иметь готовые статистические данные из индекса Lucene, такие как:

Есть много вещей, которые вы можете сделать для повышения производительности. Например:

  • Распараллеливать обработку потока документов.
  • Вы можете сохранить словарь в базе данных с ключом, например BerkeylyDB или в кабинете Киото, или даже в хранилище ключей для хранения в памяти, например Redis или Memcache.

Я надеюсь, что это поможет.

+0

спасибо за ваш ответ. Я использовал [monq library] (http://monqjfa.berlios.de/), чтобы сделать то же самое, но это кажется довольно сложным. Итак, я планирую использовать Lucene. У меня Googled для создания пользовательского анализатора, но это будет здорово, если вы можете направить меня на хороший ресурс. Кроме того, я хочу указать, что словарь в Википедии содержит многословные термины (фразы). Большое спасибо! – user3227868

0

Один из способов, которые используют только МР для:

Предполагая, что у вас уже есть N словарей меньшего размера, которые подходят к памяти вы можете: Запуск N «на карте только» рабочие места, которые будут сканировать все ваши данные (каждый из которых содержит только один словарь) и выводит smth, например {pageId, termId, появление и т. д.} в папку/your_tmp_folder/N/ . В результате у вас будут файлы N * M, где M - количество картографов на каждом этапе (должно быть одинаковым).

Затем вторая работа просто проанализирует ваши объекты {pageId, termId, появление и т. Д.} И построит статистику на идентификатор страницы.

Работы с картами должны быть очень быстрыми в вашем случае. Если нет - вставьте свой код.