Задать вопрос
@ichernob

Более удобная обработка слов в генераторе списков?

Считываю файл. Считывание происходит в генераторе списков. Там считывается строка, разбивается на слова и дальше идет удаление пунктуации и "мусорных слов". Выбрал генераторы списков, поскольку они наиболее производительны (на stackoverflow) об том все пишут. Не нравится, что в коде дважды приходится вызывать метод preprocessing. Быть может, можно как-то вызывать его только один раз?
Вот отрывок кода:
mypath = r"E:\LDA with python\DSFS_explore\corpus"
files = [ f for f in listdir(mypath) if isfile(join(mypath,f)) ]

def preprocessing(word, stop_words_list):
    if word == '\n':
        return ''
    else:
        w = re.search(pattern, word).group(0)
        print w
        return w if w not in stop_words_list else ''

pattern = r"\b\W?(\w*)\b"
docs = [[] for i in range(1)]

stop_words_list = ['a', 'the', 'is', 'in', 'at', 'an', 'of', 'as', 'and', 'to', 'it']

document = [preprocessing(word.lower().rstrip(), stop_words_list) for line in open(mypath + '\\' + files[0])
                     for word in line.split(' ') if preprocessing(word, stop_words_list) != '']
print document
  • Вопрос задан
  • 260 просмотров
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 3
@deliro
docs = [[] for i in range(1)]
Серьёзно?

Из-за ваших "генераторов списков" страдает ваша же производительность и читабельность. Да, они быстрее, но что, если ваша функция preprocessing, вызываемая в некоторых случаях дважды, только усугубляет скорость выполнения?

document = []
for line in open(mypath + '\\' + files[0]).readlines():
    for word in line.split():
        w = preprocessing(word, stop_words_list)
        if w:
            document.append(w)


Не используйте такие громоздкие конструкции, вроде if w != ''. Во-первых, в булевом виде ноль, пустая строка, None, пустой список, пустое множество и словарь (и много ещё чего, что логично) дают False. Обычно так конкретно сравнивают, если переменная может быть другого типа и в булевом виде давать False (например, None) и это нужно учесть.
Ответ написан
dizballanze
@dizballanze
Software developer at Yandex
Генераторы списков здесь не нужно использовать. Они подходят для простых операций с последовательностями, в вашем случае явно код будет более правильный и читабельный, если использовать обычный цикл. И вам точно не стоит заморачиваться с преждевременной оптимизацией.
Ответ написан
Комментировать
@766dt
Когда генератор настолько усложняется, он прямой кандидат на разворачивание в полноценный цикл. По крайней мере именно в таком случае, когда стоит вопрос, либо генератор и два вызова функции, либо один вызов и цикл, я разворачиваю его не задумываясь.

Генераторы это конечно хорошо и красиво, но не панацея же.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы