字符串的恒定部分

时间:2018-12-07 15:48:12

标签: python nlp analytics

我遇到了一个问题,不知道如何解决。

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个模式。 价值部分可以是任何东西-它可以是数字,单词,标点符号等!

我的问题是-如何从数据中找到所有可能的模式?

3 个答案:

答案 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

将一句话与其后的一句话进行比较。如果两个设置之间的匹配词多于2个,则可能是一种模式。

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行)。如果没有,则上述代码需要更改