Разделение текстового файла на части, а затем поиск ключевых фраз в этих разделах

Я новичок в Python и уже являюсь поклонником этого языка. У меня есть программа, которая делает следующее:

  1. Открывает текстовый файл, содержащий разделы текста, разделенные звездочками (***).

  2. Использует функцию split() для разделения этого текстового файла на разделы, разделенные этими звездочками. Линия звездочек одинаковая по всему текстовому файлу.

  3. Я хочу, чтобы мой код перебирал каждый из этих разделов и делал следующее:

    • У меня есть словарь с «ключевыми фразами», присвоенными значениям. Значение каждого ключа в словаре равно 0.

    • Код должен перебирать каждый раздел, созданный из разделения, и проверять, найдены ли ключи в словаре в каждом разделе. Если ключевой термин найден, значение для этого ключа увеличивается на 1.

    • После того, как код проходит через один раздел и подсчитывает, сколько ключей находится в разделе и соответственно добавляет значения, он должен распечатать словарные ключи и счетчики (значения) для этого параметра, установить значения на 0 и перейти к следующий раздел текста снова начинается с #3.

Мой код:

    from bs4 import BeautifulSoup
   import re
   import time
   import random
   import glob, os
   import string


termz = {'does not exceed' : 0, 'shall not exceed' : 0, 'not exceeding' : 0,
  'do not exceed' : 0, 'not to exceed' : 0, 'shall at no time exceed' : 0,
  'shall not be less than' : 0, 'not less than' : 0}
with open('Q:/hello/place/textfile.txt', 'r') as f:
  sections = f.read().split('**************************************************')
  for p in sections[1:]:
      for eachKey in termz.keys():
        if eachKey in p:
          termz[eachKey] = termz.get(eachKey) + 1
          print(termz)  


#print(len(sections))  #there are thirty sections      

        #should be if code encounters ***** then it resets the counters and just moves on....
        #so far only can count the phrases over the entire text file....

#GO BACK TO .SPLIT()
# termz = dict.fromkeys(termz,0) #resets the counter

Он выдает то, что считает, но это не первый, не последний и даже не весь отслеживаемый файл — я не знаю, что он делает.

Оператор печати в конце неуместен. Строка termz = dict.fromkeys(termz,0) — это метод, который я нашел для сброса значений словаря в 0, но он закомментирован, потому что я не уверен, как к этому подойти. По сути, борьба со структурами управления Python. Если бы кто-то мог указать мне правильное направление, это было бы потрясающе.


person Th3SniperSpirit    schedule 06.07.2017    source источник


Ответы (2)


Ваш код довольно близок. Смотрите комментарии ниже:

termz = {
    'does not exceed': 0,
    'shall not exceed': 0,
    'not exceeding': 0,
    'do not exceed': 0,
    'not to exceed': 0,
    'shall at no time exceed': 0,
    'shall not be less than': 0,
    'not less than': 0
}

with open('Q:/hello/place/textfile.txt', 'r') as f:
    sections = f.read().split('**************************************************')

    # Skip the first section. (I assume this is on purpose?)
    for p in sections[1:]:
        for eachKey in termz:
            if eachKey in p:
                # This is simpler than termz[eachKey] = termz.get(eachKey) + 1
                termz[eachKey] += 1

        # Move this outside of the inner loop
        print(termz)

        # After printing the results for that section, reset the counts
        termz = dict.fromkeys(termz, 0)

ИЗМЕНИТЬ

Пример ввода и вывода:

input = '''
Section 1:

This section is ignored.
does not exceed
**************************************************
Section 2:

shall not exceed
not to exceed
**************************************************
Section 3:

not less than'''

termz = {
    'does not exceed': 0,
    'shall not exceed': 0,
    'not exceeding': 0,
    'do not exceed': 0,
    'not to exceed': 0,
    'shall at no time exceed': 0,
    'shall not be less than': 0,
    'not less than': 0
}

sections = input.split('**************************************************')

# Skip the first section. (I assume this is on purpose?)
for p in sections[1:]:
    for eachKey in termz:
        if eachKey in p:
            # This is simpler than termz[eachKey] = termz.get(eachKey) + 1
            termz[eachKey] += 1

    # Move this outside of the inner loop
    print(termz)

    # After printing the results for that section, reset the counts
    termz = dict.fromkeys(termz, 0)

# OUTPUT:
# {'not exceeding': 0, 'shall not exceed': 1, 'not less than': 0, 'shall not be less than': 0, 'shall at no time exceed': 0, 'not to exceed': 1, 'do not exceed': 0, 'does not exceed': 0}
# {'not exceeding': 0, 'shall not exceed': 0, 'not less than': 1, 'shall not be less than': 0, 'shall at no time exceed': 0, 'not to exceed': 0, 'do not exceed': 0, 'does not exceed': 0}
person user94559    schedule 06.07.2017
comment
Спасибо @smarx. На самом деле он выводит то же самое, что и до этих изменений... Он распечатывает словарь только один раз (это меня уже некоторое время сбивает с толку), и, кроме того, этот вывод кажется довольно случайным... он не учитывает первый раздел, последний, или что-нибудь упорядоченное. - person Th3SniperSpirit; 06.07.2017
comment
Возможно, вам придется поделиться своим вкладом. (Может быть, сделать фиктивную, короткую версию файла.) Я действительно не понимаю, как вывод может быть таким же... мы переместили оператор print за пределы цикла. - person user94559; 06.07.2017
comment
Смотрите мое редактирование... Я включил пример ввода и вывода программы. Кажется, он работает нормально, поэтому я предполагаю, что что-то в вашем вводе отличается. - person user94559; 06.07.2017
comment
Приношу свои извинения, сделанное мной редактирование было выполнено в неправильном цикле for. Теперь это выглядит намного лучше. - person Th3SniperSpirit; 06.07.2017
comment
нет необходимости делать eachKey in termz.keys(), достаточно eachKey in termz - person Maarten Fabré; 07.07.2017

person    schedule
comment
определенно более простая версия этой строки - person Th3SniperSpirit; 06.07.2017