Медленная производительность маркировки POS. Могу ли я сделать какое-то предварительное прогревание?
Я использую NLTK для POS-тегов в твитах твитов в веб-запросе. Как вы знаете, Django создает экземпляр обработчика запросов для каждого запроса.
Я заметил это: для запроса (~ 200 твитов) для первого твита требуется ~ 18 секунд для тега, а для всех последующих твитов требуется ~ 120 миллисекунд для тега. Что я могу сделать, чтобы ускорить процесс?
Можно ли выполнить "запрос предварительного нагрева", чтобы данные модуля уже загружались для каждого запроса?
class MyRequestHandler(BaseHandler):
def read(self, request): #this runs for a GET request
#...in a loop:
tokens = nltk.word_tokenize( tweet)
tagged = nltk.pos_tag( tokens)
Ответы
Ответ 1
Эти первые 18 секунд - это теггер POS, который не загружается с диска в оперативную память. Если вы хотите обойти это, загрузите теггер самостоятельно вне функции запроса.
import nltk.data, nltk.tag
tagger = nltk.data.load(nltk.tag._POS_TAGGER)
Затем замените nltk.pos_tag
на tagger.tag
.
Компромисс заключается в том, что запуск приложения теперь займет + 18 секунд.
Ответ 2
Как указывалось ранее, NLTK разбрасывается каждый раз, когда вы используете стандартный метод pos_tag. Для NLTK 3.1, если вы довольны тегом по умолчанию NLTK (PerceptronTagger), для меня работает следующий метод:
Сначала загрузите теггер:
from nltk.tag.perceptron import PerceptronTagger
tagger = PerceptronTagger()
Затем каждый раз вам нужно пометить текст:
tagset = None
tokens = nltk.word_tokenize('the mat sat on the cat')
tags = nltk.tag._pos_tag(tokens, tagset, tagger)
Это в основном обходит основной метод. Ускорьте вещи сто раз для меня. Я предполагаю, что тот же самый метод работает для любого из тегов.
Ответ 3
nltk POS-теггер очень медленный:
Для меня я могу сделать 13739 твитов за 243 секунды:
- sent_tokenize 1.06190705299
- word_tokenize 4.86865639687
- pos_tag 233.487122536
- chunker 3.05982065201
См. http://honnibal.wordpress.com/2013/09/11/a-good-part-of-speechpos-tagger-in-about-200-lines-of-python/
но для подведения итогов:
Tagger | Accuracy | Time (130k words)
-----------+----------+------------------
CyGreedyAP | 97.1% | 4s
NLTK | 94.0% | 3m56s
Pattern | 93.5% | 26s
PyGreedyAP | 96.8% | 12s