Есть ли лучший способ перебрать несколько списков и добавить результаты? - PullRequest
0 голосов
/ 04 апреля 2019

Я вычисляю количество вхождений определенных слов (в «словарях») в данный файл.

Хотя мой код, приведенный ниже, работает совершенно нормально, он болезнен для глаз и почти наверняка смущает дзен Python.

Буду очень признателен за советы, как сделать «петлю Голиафа» чище и эффективнее.

Каждый счет должен иметь свой собственный уникальный счетчик, и каждый словарь должен иметь свое собственное уникальное имя. Это заставило меня исключить зацикливание на некотором диапазоне. Полный фон У меня около 140 000 текстовых плиток и 9 «словарей», в каждом из которых общее количество слов варьируется. Для каждого файла я очищаю текст, а затем подсчитываю количество слов в данном текстовом файле, которое соответствует слову в каждом из 9 словарей.

for file in all_files:
    # Extract firm and year identifiers from file names
    cik_identifier = file[70:-4].split('_')[0]
    financial_year = file[70:-4].split('_')[1]
    filing_year = file[70:-4].split('_')[2]
    filing_type = '10K'

    # Conduct final cleaning of text file
    with open(file) as my_file:
        text = my_file.read()
        words = text.split()
        lower_case_words = [word.lower() for word in words]
        alphabetic_only = [word for word in lower_case_words if word.isalpha()]
        cleaned_words = \
            [word for word in alphabetic_only if word not in stop_words]

    # Log length of text doc pre and post clean
    num_words_pre_clean = len(lower_case_words)
    num_words_post_clean = len(cleaned_words)

    # Calculate Sentiment Scores
    first_sentiment_score = 0
    second_sentiment_score = 0
    third_sentiment_score = 0
    fourth_sentiment_score = 0
    fifth_sentiment_score = 0
    sixth_sentiment_score = 0
    seventh_sentiment_score = 0
    eighth_sentiment_score = 0
    ninth_sentiment_score = 0

    # Goliath loop begins
    for word in cleaned_words:
        for first_sentiment_word, second_sentiment_word, third_sentiment_word, \
            fourth_sentiment_word, fifth_sentiment_word, sixth_sentiment_word, \
            seventh_sentiment_word, eighth_sentiment_word, ninth_sentiment_word in itertools.zip_longest(dict_first, dict_second,
                                                   dict_third, dict_fourth,
                                                   dict_fifth, dict_sixth,
                                                   dict_seventh, dict_eighth, dict_ninth):
                if first_sentiment_word == word:
                    first_sentiment_score += 1
                elif second_sentiment_word == word:
                    second_sentiment_score += 1
                elif third_sentiment_word == word:
                    third_sentiment_score += 1
                elif fourth_sentiment_word == word:
                    fourth_sentiment_score += 1
                elif fifth_sentiment_word == word:
                    fifth_sentiment_score += 1
                elif sixth_sentiment_word == word:
                    sixth_sentiment_score += 1
                elif seventh_sentiment_word == word:
                    seventh_sentiment_score += 1
                elif eighth_sentiment_word == word:
                    eighth_sentiment_score += 1
                elif ninth_sentiment_word == word:
                    ninth_sentiment_score += 1


    # Append identifier, num words, and trust score to df
    sentiment_analysis_data = {'cik' : cik_identifier,
                           'financial_year_end' : financial_year,
                           'filing_year_end' : filing_year,
                           'filing_type' : filing_type,
                           'num_words_pre_clean' : num_words_pre_clean,
                           'num_words_post_clean' : num_words_post_cean,
                           'first_sentiment_score' : first_sentiment_score,
                           'second_sentiment_score' : second_sentiment_score,
                           'third_sentiment_score' : third_sentiment_score,
                           'fourth_sentiment_score' : fourth_sentiment_score,
                           'fifth_sentiment_score' : fifth_sentiment_score,
                           'sixth_sentiment_score' : sixth_sentiment_score,
                           'seventh_sentiment_score' : seventh_sentiment_score,
                           'eighth_sentiment_score' : eighth_sentiment_score,
                           'ninth_sentiment_score' : ninth_sentiment_score}

    all_scores.append(sentiment_analysis_data)

1 Ответ

1 голос
/ 04 апреля 2019

Список счетчиков - это набор уникальных счетчиков.

sentiment_scores = [0] * 9

А список диктов по-прежнему представляет собой набор уникальных диктов.

dicts = [dict_one, dict_two, ...]  # etc

Теперь вы можете написать свой цикл так, чтобы не ослеплять вас.

# Goliath loop begins
for word in cleaned_words:
    for sentiment_words in itertools.zip_longest(*dicts):
        for i, sentiment_word in enumerate(sentinment_words):
            if sentiment_word == word:
                sentiment_score[i] += 1


# Append identifier, num words, and trust score to df
sentiment_analysis_data = {'cik' : cik_identifier,
                   'financial_year_end' : financial_year,
                   'filing_year_end' : filing_year,
                   'filing_type' : filing_type,
                   'num_words_pre_clean' : num_words_pre_clean,
                   'num_words_post_clean' : num_words_post_cean,
                   'first_sentiment_score' : sentiment_score[0],
                   'second_sentiment_score' : sentiment_score[1],
                   'third_sentiment_score' : sentiment_score[2],
                   'fourth_sentiment_score' : sentiment_score[3],
                   'fifth_sentiment_score' : sentiment_score[4],
                   'sixth_sentiment_score' : sentiment_score[5],
                   'seventh_sentiment_score' : sentiment_score[6],
                   'eighth_sentiment_score' : sentiment_score[7],
                   'ninth_sentiment_score' : sentiment_score[8]}

В идеале sentimenat_analysis_data может занять одну клавишу 'sentiment_scores', которая сопоставляется со списком баллов, но не ясно из вопроса, где, если есть, где вы можете сделать это изменение.

...