zoukankan      html  css  js  c++  java
  • 对step文件进行信息抽取算法

    任务描述:给定一个step文件,对该文件的字符串进行信息抽取,结构化的组织文件描述模型的数据。形成抽象化数据结构,存入计算机数据库。并能按照有条理结构把这些数据展示出来。

    信息抽取的结果描述:

      1 数据结构:

        以key-value键值对形式将step文件描述的信息抽取并组织起来。

        具体的,在java当中使用javabean技术,以类的嵌套的方式实现这种数据结构。

      2 结果展示:

        将javabean转换成json并格式化打印出来,查看转化结果是否正确。

      3 存储:

        将javabean的实例化对象映射为mysql中的数据库表。

     

    信息抽取的方法描述: 团队商讨,编写一套算法来实现对step文件的抽取。

      step文件信息抽取算法(伪代码流程):

      输入: step文件

      输出: 键值对数据结构(字典、或hashtable、或hashmap、或javabean对象) 和 json格式打印输出

      1   读取step文件,整个文件存为字符串s

      2   删除s的开头的 "ISO-10303-21 " 和最后的 "END-ISO-10303-21 "

      3   搜索s,将 “HEADER “ 和在此之后第一个“ENDSEC “ 中间的部分,存为字符串header 

      4   搜索s,将 "DATA " 和在此之后第一个"ENDSEC "中间的部分,存为字符串data

           5   声明一个key-value类型变量step_root,用于存储整个模型信息

        (下面开始处理header部分)

      6   声明一个key-value类型变量header_root,用于存储header部分的结构化信息

      7   将header字符串按照 行 进行切分 header.split(" ") , 将所有行存为一个数组(ArrayList) header_list, 每个元素是一行

      8   for line in header_list:    (对header中的每一行字符串line, 做如下操作)

      9     对字符串line,搜索第一个左括号(, 将第一个左括号( 左侧的英文串作为key, 

      10     包含该左括号一直到最右侧分号之前的右括号)为止的字符串作为value

      11   将key value 添加到header_root中

      12   将"header"作为key, header_root作为value, 添加到step_root中

        (下面是对data部分处理)

      13  声明一个key-value类型变量data_root 用于存储data部分的结构化数据

      14  将data按照一行 进行切分 data.split(" "), 并存入一个数组(ArrayList) data_list, 每个元素是一行

      15  声明一个key-value类型变量 data_lines 用于映射实体 每一行的编号(实体表示) 和 对应属性

      16  for line in data_list:   (对于data中的每一行做如下操作:) 

      17    对line按照 = 进行切分, 左侧 #数字 作为key, 右侧去掉; 作为value

      18    将key value 添加到data_lines 当中

      19   while data_lines 不为空:  

      20    从data_lines中取出最先添加进来的键值对num-line,并在data_lines中删除这个键值对

      21    对line部分搜索第一个左括号(,第一个左括号左侧部分的英文串作为key

      22       第一个左括号和最后一个右括号之间的字符串存为临时字符串tmp

      23          声明一个可变类型数组list作为value, 稍后将值加入list

      24     对tmp按照逗号,进行切分 tmp.split(",") 并把每一项存入list中

      25     for cur in list:  (拿出list的每一项cur进行检查:)

      26     如果cur是能匹配成 #数字 的规则:

      27       调用子算法  构造子实体 算法, 将cur和data_lines传入,拿到返回值res,

      28       将list中的cur位置替换为res

      29     将key,value加入到data_root中

      30   将"data"作为key, data_root作为value,添加到step_root中

      31   将step_root转换json字符串step_json

      32   返回step_root 并 打印输出step_json

     

    子算法: 构造子实体 算法(伪代码流程):

    输入: 字符串cur, key-value类型 data_lines

    输出: key-value类型 res

      1   声明一个key-value类型变量res

      2   在data_lines中用cur当作键来查找得到值tmp

      3   从data_lines中删除这对键值对cur-tmp

      4   对tmp搜索第一个出现左括号的位置,将第一个左括号左侧的英文串当做key

      5   对tmp第一个左括号和最后一个右括号之间的字符串存为line

      6   声明一个可变类型列表ArrayList变量list作为value,稍后加入元素

      7   对line按照逗号,切分  line.split(",") 并把每一项加入list中

      8   for s in list:  对list中的每一项做检查:

      9     如果 s 能匹配 #数字 这种规则:

      10      调用 构造子实体算法,传入s和data_lines, 拿到返回值res_tmp

      11      将list中s对应的位置替换成res_tmp

      12  将key,value添加到res当中

      13  返回res

     

    附上一段python实现的demo

     1 def get_info(start, lines):
     2     res = {}
     3     tmp = lines[start]
     4     lines.pop(start)
     5     cut_position = tmp.find("(")
     6     k, v = tmp[:cut_position], tmp[cut_position+1:-2].split(",")
     7     for i, vv in enumerate(v):
     8         v[i] = vv.strip()
     9         if v[i].startswith("#"):
    10             v[i] = get_info(v[i], lines)
    11     res[k] = v
    12     return res
    13 
    14 if __name__ == '__main__':
    15     s = """
    16 #1 = aa('',12,45,#2);
    17 #2 = bb('',55, #3,33);
    18 #3 = cc('', 234,jjj);
    19 """
    20     lines = {}  # 存放 #num 和右侧的映射关系
    21     s = s.strip().split("
    ")
    22     for tmp in s:
    23         tmp = tmp.split("=")
    24         k = tmp[0].strip()
    25         v = tmp[1].strip()
    26         lines[k] = v
    27     res = get_info("#1", lines)
    28     print(res)

    运行结果:

    {'aa': ["''", '12', '45', {'bb': ["''", '55', {'cc': ["''", '234', 'jjj']}, '33']}]}

  • 相关阅读:
    C# 实现将 PDF 转文本的功能
    推荐大家使用的CSS书写规范、顺序
    Android 应用开发者必看的 9 个 Tips
    网站统计中的数据收集原理及实现
    JSON劫持漏洞攻防原理及演练
    巧妙使用 CSS3 的褪色和动画效果制作消息提醒框
    20条常见的编码陷阱
    11 个最佳 jQuery 滚动条插件
    JavaScript客户端MVC 框架综述
    20个初学者实用的CSS技巧
  • 原文地址:https://www.cnblogs.com/Lin-Yi/p/11286566.html
Copyright © 2011-2022 走看看