Jerdella算法:解决银行IT系统中的语义疯狂问题

IT系统中的语义问题。当许多不同的人开始创作时会发生什么

《旧约》有一个传说,传说古城巴比伦的人们如何开始建造塔楼,但是全能者混合了他们的语言,塔楼还没有建成。不过,由于该塔楼是由数百个小团体共同建造的,这些小团体在一起互不了解。没有彼此的了解,就不可能进行互动。确实,用不同的话语称相同的事物,暗示相同的事物只是疯狂。这里没有什么奇怪的。

旧约的传说可以很容易地转移到实施现代IT解决方案的现代大型公司中。毫无疑问,这类公司的一个例子可以归结为现代俄罗斯银行,这些银行拥有数十个甚至数百个业务部门,这些业务部门具有自己的沟通亚文化,建立在自己的规则和独特的营业额风格基础上。自然,在形成IT基础结构时,会考虑团队中已建立的业务实体的命名方式。在过去的十年中,出现了许多有关此主题的作品,例如,这一部[1]。那些在银行中进行过信息系统分析的人都知道进行所谓的“数据映射”是什么意思,特别是如果最终系统是由分析师,开发人员,客户或供应商的不同团队组成的。通常,映射的60%编制是对传输数据的本质和语义的理解。

当前的趋势是使用一组敏捷方法。每个人都在谈论有关敏捷。您可以争论到声音嘶哑,这是对企业还是有害。但是一件事不会使任何人拒绝。在敏捷过程中银行内和来自不同供应商的许多不同的团队创建了各种业务的IT解决方案,并且通常在彼此不交互的情况下,团队创建了自己完善的术语。并且当融合确实发生时,旧约中描述的情况也发生了。它与成千上万的商人,商店,商品,愚人节,骗子和吞食者的巴比伦集市有何不同?因此,所有这些拥有不同思想和想法的人开始建造塔楼。

在sprint的最后,我们总是有一组XSD模式(或JSON消息示例),其中的字段需要以某种方式明确地相互关联。争论的去向无关紧要,也许是一组带有映射的“ excel”表,也许是Confluence中的数百条评论,或者是ZoomWebex中的会议时间,但是花一些时间来整理这种“语义疯狂”的东西神经,最重要的是-金钱。

当然,使用ESB的概念(银行的单一服务集成总线)和全球业务对象模型(例如,在某些欧洲银行中使用的模型),这是信息系统之间的一种“通用语言”,应该使我们摆脱这种情况。但是...说实话,并非所有公司都能负担得起,也不是每个人都需要它。银行业瞬息万变,以至于许多客户都接受了可互操作的微服务平台的概念,该平台在像Kafka这样的消息代理上运行。结果,我们没有一个数据模型,而是通常由一个单独的团队为每种服务创建的一组数据模型。该平台内的交互是由银行分析师不太熟悉的XML进行的消息是基于由一组分析人员,律师,业务代表在设计期间开发的刚性XSD方案的使用,这些方案由几个世纪以来使用,以及更简单和更具描述性的JSON,这些消息已从前端开发人员和决定将“前端”更改为“后端”的开发人员一起推向了银行。 ”。不用说,JSON无法承载严格的架构。对于敏捷方法论来说,这只是更加方便。可以通过添加或删除几个属性来更正它。而且,它与使用特定编写规则所涉及的钢筋混凝土XSD模式没有任何绑定JSON更易于编辑和修改。更改它更容易访问。

? , - . , ?



.

- . , . MS Excel, , , «» . ( JSON path), — . «». . , :

« »



« »



«20- »



«12- »



« , »



, , , , -. , : , . – “ ”. , , , , , , .

, , , PIP! xslx , . , , Python, .

, – Python. , Python. , , - . , , . – , , . : « , ». — - PyQt Tkinter. , . .

, JSONpath , . , , , Python. , .



. JSON.



. “” 33- . 33 ? – “33” . «». . , , , [2]. . «» . : , , 33- . . . , ABC :

ABC=(x,x,.....,x),(1)



其中在相应位置的每个x坐标是excel文件中字段注释的相应字母的编号。例如,我们有注释“个人帐号”。让我们为它比较一个从笛卡尔系统的坐标原点出现在一个33字母字母空间中的向量,它看起来像这样:坐标X A-对应于字母“ a”的数量。它等于二。X B-在这种情况下,它将等于零,因为该语句中没有字母“ b”。x B同样适用-字母“ B ”丢失。但是x AND-等于3,因为注释中的字母“ and”出现3次。







图1 , « » . «»= 2, «» =3. – xA=2, x=3.



, , ( ) , 33- S1 « », :

S1=(2;0;0;1;0;3;0;0;1;3;0;1;1;1;1;3;0;1;2;1;0;1;0;1;2;0;0;0;0;0;0;0;0)



, , « «»» ( , , «» «») « ». S2 S3 :

S2=2;0;0;0;0;2;0;0;1;2;0;1;0;1;1;1;0;1;1;1;0;1;0;0;1;0;0;0;0;0;0;0;0),



S3=2;0;0;0;0;3;0;0;0;1;0;1;1;1;2;1;0;1;1;2;0;0;0;0;1;0;0;0;0;0;0;0;0)



现在我们找到字母空间的笛卡尔坐标系中向量之间的差异,分别根据解析几何中众所周知的公式找到:

S1,2=(x,1x,2;x,1x,2;.....;x,1x,2),(2)



哪里 xn,1xn,2对应于字母的轴的相应矢量坐标。



图2. 蓝色显示向量之间的差异S1,2在字母空间的字母-的平面上。



因此,对应于语句“个人的帐号”和“物理学家的帐号”之间的差异的向量将如下所示:

S1,2=(0;0;0;1;0;1;0;0;0;1;0;0;1;0;0;2;0;0;1;0;0;0;0;1;1;0;0;0;0;0;0;0;0)

对应于语句“个人帐号”和“客户帐号”之间差异向量将如下所示:

S1,3¯=(0;0;0;1;0;0;0;0;1;2;0;0;0;0;1;2;0;0;1;1;0;1;0;1;1;0;0;0;0;0;0;0;0)



此外,通过公式获得的计算出的差矢量的长度为:

|S1,2¯|=(x12+x22+...+x332),(3)



如果进行算术计算,则会得到:

S1,2=3.32



S1,3=4.00



这在数学上假设短语“个人帐号”在含义上与“物理学家帐号”比“法人实体帐号”更接近。这由差矢量的长度表示。长度越短,语句之间的含义就越接近。例如,如果我们比较“个人帐户号”和“开设个人帐户的分支机构号”这两个语句,则会得到图6.63。这将表明,如果前两个语句的含义与原始含义相近(分别为向量3.32和4.00的差异),那么尽管词组看似相同,但显然第三个语句甚至具有不同的业务本质。 ...

您可以走得更远,并尝试通过向量化来量化含义上的评论的接近度。为此,我建议使用向量彼此之间的投影。然后找到比较风的长投影与与之比较的风的长度之间的比率。该比率将始终小于或等于1。因此,如果语句彼此相同,则投影将与进行投影的向量合并。被比较的陈述含义越深,则预测将越少。如果将其乘以100%,则可以百分比得出向量化语句的对应程度。因此,向量的投影S2 比较陈述 S2 在原始陈述的向量上 S1 将通过以下公式找到:

S2=(S1,S2)|S1|=x1x1+x1x2+...+x1x2x12+x12+....+x12,(5)



因此,遵守程度 δ 将使用以下公式计算:

δ=|S2¯||S1¯|100$$=x11x21+x21x22+...+xn1xn2x12+x12+....+x12100,(6)





图3. 投影图S2 向量 S2 每个向量 S1...

提议将这个参数用作确定语义对应的基础。


该算法在Python中的实现关于杏子的一些知识。如何设置和处理向量



我将算法命名为Jerdella没什么奇怪的,我来自顿河畔罗斯托夫。

. , --, , , . , , -, -, -, “”. , .

, , Python , . , . , NumPy. , , NumPy? , – , , - « », . , NumPy. — . , , PIP... 因此,我们的Jerdella将使用PyCharm Community Edition中包含的用于Python 3解释器的标准软件包

因此,关于Python的好处是它具有实现多种数据结构的能力。为什么我们对记录矢量的列表不满意?您需要在int类型的元素列表中定义字母空间中的向量,并对其进行进一步的操作。

我们已经编写了一些基本程序,下面将简要介绍它们。

如何设置向量?



我使用以下向量过程设置向量:

def vector(self,a):
    vector=[]
    abc = ["", '', "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
                "", "", "", "", "", "", "", "", "", "", "", "", ""]
    for char in abc:
        count=a.count(char)
        vector.append(count)
    return(vector)




也就是说,在先前准备好的列表abc的元素for循环中,我使用了标准操作来查找计数字符串的附件之后,使用append方法,我填写了一个新的向量列表,它将用作进一步计算的向量。

如何计算向量差?



为此,我创建了一个增量过程,该过程将两个列表作为输入ab

def delta(self, a, b):
    delta = []
    for char1, char2 in zip(a, b):
        d = char1 - char2
        delta.append(d)
    return (delta)


for循环中,通过遍历两个列表,对差异进行计数,并在每个迭代步骤中将其添加到增量列表的末尾,该过程最终以向量的形式返回。

您如何计算向量的长度,从而估算出差异?



为此,我创建了一个过程len_delta,该过程将一个列表作为输入,并根据查找向量模块的规则遍历该列表的每个元素(它也是字母空间中的坐标),从而计算向量的长度。

def len_delta(self, a):
    len = 0
    for d in a:
        len += d * d
    return round(math.sqrt(len), 2)


如何计算投影到矢量上的比率,从而估计重合百分比?



为此,创建了一个简化过程,该过程将两个列表作为输入。在其中,我实现了公式(6)。在这里重要的一点是确定哪个向量的长度最大。为了使一致性评估更加清晰,将较小的向量投影到较大的向量上更为方便。

def simplify(self, a, b):
    len1 = 0
    len2 = 0
    scalar = 0
    for x in a: len1 += x * x
    for y in b: len2 += y * y
    for x, y in zip(a, b): scalar += x * y
    if len1 > len2:
        return (scalar / len1) * 100
    else:
        return (scalar / len2) * 100




讨论获得的结果。我们通过构造语义空间来征服它



, , Jerdella . : 1) , , . 2) -. , CRM Siebel ESB, -. , , , -. , , . … . , , , …

… 2 , Agile, , point-to-point, , .

. , , . 2-3 , , . , , , : « » « », « », « », « », , . , 3000 , 500 ? – ? . , - 3000 ?

. «» , . . Python . «». “” , . « ». , , , – .

, :



{“个人帐号”:[{4.69:“客户的银行帐户””,{6.0:“姓氏”},{4.8:“金属帐号”},{4.8:“客户号码”}]}。



该图也可以图形形式显示。您可以在Python中使用字典做很多事情。为了使结果可视化和演示,我们使用了开放的Internet项目www.graphonline.ru该平台使您可以快速构建使用GraphML编写的图形



图4. 实体“个人编号”关系实体中“语义对应轨道”的存在的说明。

«» , (3) , , «» , . « » « ». , . , , , . .

? , « » «-». ( S1 ( 3) δ (5)), . , « » . , « ».

, , , . . .



5. , .

, . … , , . , – ? ? ? — . 80%, , . , . , … - – . , .

, , , , . , , «» ( 6), . «», «», «», - -. , 30% . . , . , , , .





6. «» . , .



. .



«-» . , , - . ? , -.

. - . , . : « - ». , , . « » . , , , . – « ! - »…

, , - , , « », « » « », « », « ». , « ». , . ? ? « »?

, , , , , . – .

, :

[1] . . : . . 2010.

[2]. , . , . . Python. . – . , 2019, — 368 .



P.S. Accenture — ,




All Articles