Python: самый быстрый способ подсчета слов и фильтрации слов с низкой частотой встречаемости - PullRequest
0 голосов
/ 10 апреля 2020

Я пытаюсь найти очень эффективный способ фильтрации редких слов. Этот код в настоящее время занимает 11 секунд с 2D-списком измерения 10000 x 28.

Есть идеи, как мне улучшить производительность этой задачи?

def remove_rare_terms(cluster_word_list):
   flatten_list = list(itertools.chain.from_iterable(cluster_word_list))
   filter_terms = [key for key, val in Counter(flatten_list).items() if val == 1]
   filter_terms_set = set(filter_terms)
   return [[k for k in cluster_word if k not in filter_terms_set] for cluster_word in cluster_word_list]
len(cluster_word_list)
> 10000
cluster_word_list[0:2]
> [['buzz', 'woody', 'andy', 'toy', 'lightyear', 'aside', 'afraid', 'onto', 'duo', 'happily', 'difference', 'circumstance', 'birthday', 'separate', 'room', 'brings', 'scene', 'learns', 'owner', 'eventually', 'plot', 'heart', 'put', 'place', 'lose', 'live', 'lead', 'story'], 
   ['game', 'alan', 'jumanji', 'rhinoceros', 'risky', 'enchant', 'monkey', 'judy', 'unwittingly', 'sibling', 'finish', 'magical', 'prof', 'terrify', 'door', 'board', 'freedom', 'adult', 'invite', 'giant', 'inside', 'peter', 'room', 'creature', 'trap', 'open', 'hope', 'evil', 'discover', 'living']]

1 Ответ

1 голос
/ 19 апреля 2020

Вы сгладили длину списка 280 000. Вы хотите свести к минимуму количество итераций по нему.

В вашем коде итерация повторяется около 5 раз. 1) построить список сглаживания 2) построить счетчик (flatten_list) 3) построить filter_terms 4) построить filter_terms_set 5) оператор возврата

Технически, 3 и 4 короче, так как содержат только редкие термины. Для вашей цели вам нужно только повторить дважды. Один на счетчике зданий и один на фильтрации редких терминов.

Счетчик принимает итераторы в качестве входных данных, вам не нужно создавать список. Скорость проверки членства для типа Counter (dict) близка к заданной, также нет необходимости создавать установленные условия фильтра.

def remove_rare_terms(cluster_word_list):

    counter = Counter(itertools.chain.from_iterable(cluster_word_list))
    return [[k for k in cluster_word if counter[k] ==1] for cluster_word in cluster_word_list]
...