У меня есть проблема, которую я решил, но не эффективно. У меня есть список строк, которые являются заголовками для изображений. Мне нужно получить любое слово из этого списка строк и создать словарь, содержащий следующую информацию
- Слово, если это слово появляется 5 или более раз в этом списке
- Простой идентификатор для этого слова
Поэтому мой словарь в словаре python будет содержать слово: id записей
Во-первых, у меня есть вспомогательная функция для деления строка в токены, или слова
def split_sentence(sentence):
return list(filter(lambda x: len(x) > 0, re.split('\W+', sentence.lower())))
Затем я сгенерирую словарь, который работает следующим образом:
def generate_vocabulary(train_captions):
"""
Return {token: index} for all train tokens (words) that occur 5 times or more,
`index` should be from 0 to N, where N is a number of unique tokens in the resulting dictionary.
"""
#convert the list of whole captions to one string
string=listToStr = ' '.join([str(elem) for elem in train_captions])
#divide the string tokens (individual words), by calling the previous function
individual_words=split_sentence(string)
#create a list of words that happen 5 times or more in that string
more_than_5=list(set([x for x in individual_words if individual_words.count(x) >= 5]))
#generate ids
ids=[i for i in range(0,len(more_than_5))]
#generate the vocabulary(dictionary)
vocab = dict(zip(more_than_5,ids))
return {token: index for index, token in enumerate(sorted(vocab))}
Код работает как шарм для относительно небольших списков подписей. Однако со списками с тысячами длин (например, 80000) это длится вечно. Я запускаю этот код в течение часа.
Есть ли способ ускорить мой код? Как я могу вычислить мою переменную more_than_5 быстрее?
РЕДАКТИРОВАТЬ: я забыл упомянуть, что в очень немногих указанных c членах этого списка строк есть символы \ n только в некоторых элементах в начале предложения. Можно ли удалить только этот символ из моего списка, а затем снова применить алгоритм?