Является ли countvectorizer потоком? - PullRequest
0 голосов
/ 25 ноября 2018

Я использую sklearn countvectorizer (ngram из 4 слов) в моем проекте, где я загружаю уже подогнанную модель и использую ее для преобразования текста.Методы, которые я использую в своих проектах: transform, inverse_transform, vocabulary_.keys().

При его использовании я понял, что inverse_transform занимает время (примерно 2,7 секунды для экземпляра), в то время какВесь процесс занимает около 3 секунд.После этого я вставил свою модель в класс, который использует много потоков (около 30 потоков), чтобы использовать эту модель с другими моделями, я проверил время, затраченное только на этот процесс, и обнаружил, что время можно увеличить до 15 секунд.

Мои вопросы:

  1. Почему процесс занимает в классе гораздо больше времени?

  2. Безопасен ли векторизация счетчика??Я не смог найти четкого ответа на этот вопрос

  3. Если я заменил метод inverse_transform на что-то еще, это ускорит процесс в классе?

Спасибо

РЕДАКТИРОВАТЬ

Вот код

for true_label, text in zip(labels, texts):
   splitted_text = text.split(" ")  # split text to remove features
   boolean_text = [False] * len(splitted_text)  # boolean list where the ith element is for the ith feature

   ngrams = list(map(lambda x: ' '.join(x), zip(splitted_text, splitted_text[1:], splitted_text[2:], splitted_text[3:])))
   doc_vocab = set(ngrams)
   non_religious_tokens = doc_vocab - set(vectorizer.vocabulary_.keys())
   print("non religious tokens:", non_religious_tokens)

   if len(splitted_text) > 3 and non_religious_tokens == set():
       print("Religious")
       print("--- prediction time: %s seconds ---" % (time.time() - start_time))
       continue

   print("******* 2nd Filter ********")
   # transform text
   vectorized_data = vectorizer.transform([text])
   terms = vectorizer.inverse_transform(vectorized_data)  # get features of text
   terms = terms[0]

   maybe_religious = not (len(terms) == 0)
   # for each feature
   for term in terms:

       splitted_term = term.split(" ")  # split term (splitted to four pieces in out case)

       # find 1st word index in text
       # match the other 3 words
       # set their indecies to true
       for i, word in enumerate(splitted_text):
           try:
               # find the piece of text that match this feature and highlight all the words as true (so they're removed
            #  later)
               if splitted_term[0] == splitted_text[i] and splitted_term[1] == splitted_text[i+1] and \
                    splitted_term[2] == splitted_text[i+2] and splitted_term[3] == splitted_text[i+3]:

                   boolean_text[i] = True
                   boolean_text[i+1] = True
                   boolean_text[i+2] = True
                   boolean_text[i+3] = True
           except IndexError:
               pass



   non_religious_text = ""
   # store non religious text (didn't match any feature in the text)
   for i, b in enumerate(boolean_text):
       if b is False:
           non_religious_text += " " + splitted_text[i]

   non_religious_text = remove_religious_stopwords(non_religious_text)

   # if all the features are removed, it's religious!
   if maybe_religious and (non_religious_text == "" or non_religious_text is None):
       print("Religious")
   # if the number of words remaining are lower than the limit
   # it's religious
   elif maybe_religious and (len(non_religious_text.split(" "))-1 <= max_non_religious):
       print("Religious")
   # other of that it's non religious
   else:
       print("Non Religious")


   print("--- prediction time: %s seconds ---" % (time.time() - start_time))
...