我遇到了一个问题,不知道如何解决。
E.x。我有一个动态扩展的文件,其中包含用'\ n'分隔的行
每行-一条消息(字符串),它是由某些模式和值部分(仅特定于此行)构建的。
E.x。
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个模式。 价值部分可以是任何东西-它可以是数字,单词,标点符号等!
我的问题是-如何从数据中找到所有可能的模式?
答案 0 :(得分:1)
这听起来像是日志消息群集问题。
临时解决方案:使用正则表达式将所有数字替换为字符串NUMBER
。您可能需要排除日期或IP地址或其他内容。这可能足以为您提供日志中所有模式的列表。
或者,您可以计算每条消息中的单词数(用空格分隔的字段),并以此方式对消息进行分组。例如,也许所有7个单词的消息都采用相同的格式。如果两个不同的消息具有相同的格式,则您也可以在第一个单词或其他单词上进行匹配。
如果以上两种方法均无效,那么事情就变得复杂得多;对任意日志消息进行聚类是一个研究问题。如果您在Google学术搜索中搜索“事件日志群集”,则应该会看到很多可以借鉴的方法。
答案 1 :(得分:0)
如果一行中的单词数是固定的,例如您的eg 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
答案 2 :(得分:0)
首先,我们将逐行读取文件并将所有句子添加到列表中。
在下面的示例中,我将几行添加到列表中。
lstSentences = [“温度比零高10度”,“温度比零高16度”,“温度比零高5度”,“天气比正常低10度”,“天气比正常低5度” ,“天气比正常低2度”]
lstPatterns = []
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行)。如果没有,则上述代码需要更改