Постоянная часть строки - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть проблема, и я не знаю, как ее решить.

Например, у меня есть динамически расширяемый файл, который содержит строки, разделенные '\ n'

Каждая строка -сообщение (строка), построенное из некоторой части шаблона и значения, характерной только для этой строки.

Пример:

line 1: The temperature is 10 above zero
line 2: The temperature is 16 above zero
line 3: The temperature is 5 degree zero

Итак, как вы видите, постоянная часть (шаблон) - это

The temperature is zero

Значение часть:

For line 1 will be: 10 above
For line 2 will be: 16 above
For line 3 will be: 5 degree

Конечно, это очень простой пример.На самом деле в одном файле слишком много строк и около 50 шаблонов.Часть значения может быть чем угодно - это может быть число, слово, пунктуация и т. Д.

Ответы [ 3 ]

0 голосов
/ 07 декабря 2018

Сначала мы будем читать файл построчно и добавлять все предложения в список.

В приведенном ниже примере я добавляю несколько строк в список.

Этот список содержитвсе предложения ..

lstSentences = ['Температура на 10 градусов выше нуля', 'Температура на 16 градусов выше нуля', 'Температура на 5 градусов выше нуля', 'Погода на десять градусов ниже нормы',«Погода на пять градусов ниже нормы», «Погода на два градуса ниже нормы»]

Создать список для хранения всех шаблонов

lstPatterns = []

Initialize

intJ = len (lstSentences) -1

Сравните одно предложение с тем, которое следует за ним.Если между двумя вариантами имеется более двух совпадающих слов, возможно, это шаблон.

for inti, sentence in enumerate(lstSentences):    
    if intJ!=inti:
        lstMatch = [ matching for matching in sentence.split() if matching in 
lstSentences[inti+1].split()]
        if len(lstMatch)>2:  #We need min 2 words matching between sentences
            if not ' '.join(lstMatch) in lstPatterns: #if not in list, add
                lstPatterns.append(' '.join(lstMatch))

        lstMatch=[]

print(lstPatterns)

Я предполагаю, что шаблоны идут один за другим (т. Е. 10 строк с одним шаблоном, а затем 10 строк сдругая картина).Если нет, приведенный выше код необходимо изменить

0 голосов
/ 10 декабря 2018

Это похоже на проблему кластеризации сообщений журнала.

Тривиальное решение: замените все числа на строку NUMBER с помощью регулярного выражения.Возможно, вам придется исключить даты или IP-адреса или что-то.Этого может быть достаточно, чтобы предоставить вам список всех шаблонов в ваших журналах.

В качестве альтернативы, вы можете подсчитать количество слов (разделенных пробелами полей) в каждом сообщении и таким образом сгруппировать сообщения.Например, может быть, все сообщения с 7 словами в одном формате.Если два разных сообщения имеют одинаковый формат, вы также можете сопоставить первое слово или что-то еще.

Если ни один из вышеперечисленных способов не работает, все становится намного сложнее;кластеризация произвольных сообщений журнала является проблемой исследования.Если вы ищете «кластеризацию журналов событий» в Google Scholar, вы должны увидеть множество подходов, которые вы можете изучить.

0 голосов
/ 07 декабря 2018

Если количество слов в строке фиксировано, как, например, в вашем, например, str, то вы можете использовать str.split()

str='''
The temperature is 10 above zero
The temperature is 16 above zero
The temperature is 5 degree zero
'''

for line in str.split('\n'):
   if len(line.split()) >= 5:
       a,b = line.split()[3], line.split()[4]
       print(a,b)

Вывод:

10 above
16 above
5 degree
...