gpt4 book ai didi

python - 如何解析一个 STIX 模式以生成 OR 逻辑的多模式?

转载 作者:太空宇宙 更新时间:2023-11-04 04:08:14 38 4
gpt4 key购买 nike

我有一个 STIX 模式如下:

stix_ptn_and_or_case2 = '''[(x:x.x = 'A' OR x:x.x = 'B' ) AND ( x:x.x = 'C' OR x:x.x = 'D' )]'''

模式的逻辑是(A OR B) AND (C OR D)

该模式可以通过 dendrol(python 库)解析为表达式树,如下所示

enter image description here

(A OR B) AND (C OR D)的逻辑可以拆分成下面4个小的AND only logic

  • A AND C
  • A AND D
  • B AND C
  • B AND D

我想解析表达式树以获得4个AND only逻辑

enter image description here

所以我写了如下的python代码。 python 库 dendrol 可以将 STIX 模式转换为表达式树。

import os, sys, datetime, copy
from dendrol import Pattern

stix_ptn_and_or_case2 = '''[(x:x.x = 'A' OR x:x.x = 'B' ) AND ( x:x.x = 'C' OR x:x.x = 'D' )]'''

ptn = Pattern(stix_ptn_and_or_case2)
pdt = ptn.to_dict_tree()
obj = pdt['pattern']
all_ptn_element_list = []

# the recursion function for expression tree to and-only logic
def ptnct(obj, ptn_element_list):
if('observation' in obj or 'expression' in obj):
if('observation' in obj):
join = obj['observation']['join']
expressions = obj['observation']['expressions']
else:
join = obj['expression']['join']
expressions = obj['expression']['expressions']
if(join=='AND' or join==None):
for exp in expressions:
p = ptnct(exp, ptn_element_list)
if(p!=None):
ptn_element_list.append(p)
if(len(ptn_element_list)==len(expressions)):# all and
all_ptn_element_list.append(ptn_element_list)
elif(join=='OR'):
for exp in expressions:
p = ptnct(exp, ptn_element_list)
tmp = copy.deepcopy( ptn_element_list )
tmp.append(p)
all_ptn_element_list.append(tmp)

elif('comparison' in obj):
exp = obj
tag = '{0}:{1}.{2}'.format(exp['comparison']['object'], exp['comparison']['path'][0], exp['comparison']['path'][1])
value = exp['comparison']['value']
return value

x=ptnct(obj, [])
print(all_ptn_element_list)

代码的输出是

[[u'A'], [u'B'], [u'C'], [u'D']]

但是想要的输出是

[[u'A', u'C'], [u'A', u'D'], [u'B', u'C'], [u'B', u'D']]

实际上代码适用于大多数情况,但不适用于此。

对于将 AND-OR 逻辑表达式树解析为 AND-only 表达式(模式)有什么建议吗?

最佳答案

使用方便的 itertools.productitertools.chain,我们可以将分离表达式树转换为所有可能的连接表达式列表

from itertools import product, chain

from dendrol import Pattern


def extract_atomic_chunks(root):
container = root.get('observation') or root.get('expression')
comparison = root.get('comparison')

if container:
join = container['join']
expressions = container['expressions']

if join == 'OR':
# Return all possibilities under this node
return chain(
extract_atomic_chunks(expression)
for expression in expressions
)

elif join == 'AND':
# Generate all possible N-tuples, where N=len(expressions)
groups = [
extract_atomic_chunks(expression)
for expression in expressions
]
return product(*groups)

elif comparison:
return comparison['value']


if __name__ == '__main__':
stix_expr = "[(x:x.x = 'A' OR x:x.x = 'B') AND (x:x.x = 'C' OR x:x.x = 'D')]"

pattern = Pattern(stix_expr)
tree = pattern.to_dict_tree()
root = tree['pattern']

print(list(extract_atomic_chunks(root)))

我想这会让你到达你想要的地方

[('A', 'C'), ('A', 'D'), ('B', 'C'), ('B', 'D')]

关于python - 如何解析一个 STIX 模式以生成 OR 逻辑的多模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56849478/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com