Я использую sklearn
countvectorizer
(ngram из 4 слов) в моем проекте, где я загружаю уже подогнанную модель и использую ее для преобразования текста.Методы, которые я использую в своих проектах: transform
, inverse_transform
, vocabulary_.keys()
.
При его использовании я понял, что inverse_transform
занимает время (примерно 2,7 секунды для экземпляра), в то время какВесь процесс занимает около 3 секунд.После этого я вставил свою модель в класс, который использует много потоков (около 30 потоков), чтобы использовать эту модель с другими моделями, я проверил время, затраченное только на этот процесс, и обнаружил, что время можно увеличить до 15 секунд.
Мои вопросы:
Почему процесс занимает в классе гораздо больше времени?
Безопасен ли векторизация счетчика??Я не смог найти четкого ответа на этот вопрос
Если я заменил метод 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))