Обнаружение семантически блока текста с помощью Python - PullRequest
0 голосов
/ 24 января 2019

У меня есть этот блок образца журнала:

20190122 09:00,000 ###PERFORMANCE string1 string2 string3
20190122 09:10,500 number1 string1 string2 string3
20190122 09:24,670 number2 string1 string2 string3
20190122 10:05,000 number3 string1 string2 string3
20190122 10:33,960 number4 string1 string2 string3
20190122 11:00,321 number5 string1 string2 string3
20190122 11:40,256 ###PERFORMANCE string1 string2 string3
20190123 10:24,670 number1 string1 string2 string3 string4 date1 number2
20190123 10:32,130 number1 string1 string2 string3 string4 date1 number2
20190123 08:00,000 ###PERFORMANCE string1 string2 string3
20190123 08:10,500 number1 string1 string2 string3
20190123 08:24,670 number2 string1 string2 string3
20190123 09:05,000 number3 string1 string2 string3
20190123 10:33,960 number4 string1 string2 string3
20190123 10:00,321 number5 string1 string2 string3
20190123 13:40,256 ###PERFORMANCE string1 string2 string3
20190124 10:00,000 ###PERFORMANCE string1 string2 string3
20190124 10:10,500 number1 string1 string2 string3
20190124 10:24,670 number2 string1 string2 string3
20190124 11:05,000 number3 string1 string2 string3
20190124 12:33,960 number4 string1 string2 string3
20190124 13:00,321 number5 string1 string2 string3
20190124 13:40,256 ###PERFORMANCE string1 string2 string3

Что я хотел бы сделать с Python - это обнаружить каждый ###PERFORMANCE блок текста, как в этом примере:

example

Как видите, есть 3 представляющих интерес блока, каждый из которых ограничен текстом ###PERFORMANCE в строке. Первый начинается в строке 1 и заканчивается строкой 7. То, что находится между строкой 7 и 10 , не должно рассматриваться как интересующий блок. Строки строк для каждого блока также могут различаться (поэтому не следует выбирать номер строки).

Что я делал до сих пор, так это просто читал текстовый файл построчно:

logFile = "testLog.txt"

with open(logFile) as f:
    content = f.readlines()
# you may also want to remove whitespace characters like `\n` at the end of each line
content = [x.strip() for x in content]

for line in content:
    print(line)

Каким образом я мог бы подойти для достижения этой задачи? Будет ли использование NLTK хорошей идеей? Будет ли это работать для этой задачи? Любое общее предложение?

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Я думаю, что вам нужно сделать с помощью простой проверки. Позвольте мне объяснить, правильно ли я понял. Вы можете иметь флаг (True / False value), чтобы определить, находитесь ли вы в интересном блоке или нет. Всякий раз, когда вы найдете «### PERFORMANCE», вы можете изменить этот флаг. Затем вы можете просто сохранить два блока в двух списках или в любой структуре, которую вы предпочитаете.

Ниже приведен фрагмент кода

logFile = "logfile.txt"

with open(logFile) as f:
    content = f.readlines()
# you may also want to remove whitespace characters like `\n` at the end of each line
content = [x.strip() for x in content]

# flag
are_we_in_the_interesting_block = False;

# two lists to save the liens
interesting_block = [];
non_interesting_block = [];

for line in content:
    # check if there is the text ###PERFORMANCE
    is_there_performance = line.find('###PERFORMANCE');

    # if it's not there, it returns -1
    if is_there_performance > 0:
        are_we_in_the_interesting_block = not are_we_in_the_interesting_block;
    else:    
        if are_we_in_the_interesting_block:
            # here I append to a list, but you can do your processing
            interesting_block.append(line);
        else:
            # here processing of the non interesting parts
            non_interesting_block.append(line);

print('Interesting blocks')
print(interesting_block)

print('\n')
print('Non interesting blocks')
print(non_interesting_block)

И произведенная продукция будет

Interesting blocks
['20190122 09:10,500 number1 string1 string2 string3', '20190122 09:24,670 number2 string1 string2 string3', '20190122 10:05,000 number3 string1 string2 string3', '20190122 10:33,960 number4 string1 string2 string3', '20190122 11:00,321 number5 string1 string2 string3', '20190123 08:10,500 number1 string1 string2 string3', '20190123 08:24,670 number2 string1 string2 string3', '20190123 09:05,000 number3 string1 string2 string3', '20190123 10:33,960 number4 string1 string2 string3', '20190123 10:00,321 number5 string1 string2 string3', '20190124 10:10,500 number1 string1 string2 string3', '20190124 10:24,670 number2 string1 string2 string3', '20190124 11:05,000 number3 string1 string2 string3', '20190124 12:33,960 number4 string1 string2 string3', '20190124 13:00,321 number5 string1 string2 string3']


Non interesting blocks
['20190123 10:24,670 number1 string1 string2 string3 string4 date1 number2', '20190123 10:32,130 number1 string1 string2 string3 string4 date1 number2']

Тогда вы можете получить доступ к interesting_block[n], чтобы получить n-ые строки, если это необходимо ..

0 голосов
/ 24 января 2019

Поскольку вы просто сопоставляете разделитель PERFORMANCE, использование NLTK кажется излишним. Простой подход к этому - использовать простое совпадение (это ожидаемая строка в строке), а затем переключать режим захвата на основе этого. Например:

in_block = False
IDENTIFIER = 'PERFORMANCE'
with open(logfile) as f:
    for line in f.readlines():
        if IDENTIFIER in line:
            # Toggle the boolean
            in_block = not in_block
        if in_block:
            print(line)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...