0%

ElasticSearch + Kibana 环境下法律数据分析概述

摘要:简要介绍在 ElasticSearch + Kibana 场景下,法律数据分析工作的内容和主要目标,系经验之谈。

一、背景概述

ElasticSearch,即经常被提及的 ES 库,是一款流行的大数据检索引擎,一些法律检索引擎亦使用 ES 库来存储文书和标签数据。

我们可以把 ES 库简单理解为一款数据库,即存放海量文书数据的仓库,利用 ES 查询语句,可以方便地查询和统计文书数据。

Kibana 是 ES 数据库的一款配套软件,具有数据可视化管理等众多功能,另外 Kibana 提供了比较智能的交互界面,方便我们编写查询语句、浏览查询结果。

二、前置条件

  • 法律数据分析人员应具有 ES 库原理、Kibana 基本操作、ES 查询语法、json 文件格式规范等基础知识;
  • 现场配备法律数据分析工具:RegexBuddy(猫头鹰)、Excel、notepad++或 vscode 等便捷文本编辑工具。
  • 由技术研发或运维人员完成 ElasticSearch + Kibana 环境搭建,进行数据入库和基础验证。

三、EK 场景下法律数据分析流程

(一)查询数据库前的业务准备工作

  • 了解业务背景:明确业务流程内容、官方历史数据、相似或容易混淆的概念等。
  • 明确研发摘要:明确本次研发涉及要素含义、要素之间关系、最终实现结果。
  • 梳理要素特征:包含内涵特征词、对应法律法规和其他规范性文件、国家标准、相关名录、其他相关知识等。
  • 梳理检索逻辑:常见逻辑如:包含、排除、同时出现、不得同时出现等。
  • 设计验证方案:常见如:与官方数据比较、比例分析、法律逻辑分析、经验等。

(二)查询数据库并记录过程数据

通过编写查询语句,形成: 查询 –> 验证结果 –> 修正查询条件 –>重新验证 的研发流,期间主要关注内容包含以下方面:

  • 特征词:验证前期梳理的特征词效果;并通过观察新文书,选取体现要素特点、不易混淆的关键词,灵活使用包含、排除逻辑,兼顾正确率与覆盖率。
  • 法律法规引用:验证与要素对应的法律法规及其简称,整理新出现的地方性法律文件、国家标准、通用名录等。
  • 文书文号:可以借助文书文号,排除无关文书。
  • 检索结果:记录不同特征词、法律法规在查询过程中命中文书数量,方便后续比较和分析。
  • 查询逻辑:考虑不同精度检索方案的组合,一般而言,特征词的覆盖较全但易产生混淆,建议组合使用;法律法规的引用准确度较高、覆盖度不足,可以作为关键词组合的补充或者成为其他要素的排除项;
  • 查询语句保存:可以将每个法律要素保存为单个 json 格式文件,方便成果复用。

(三)对查询结果进行二次分析

  • 可以将 ES 查询结果另存为文本,可以使用猫头鹰进行二次分析。例如,提取文本之中的法律法规引用内容,再使用 Excel 透视表对结果进行聚合和排序,选取代表性较高的条目归化为法律法规或者关键词。

  • 对 ES 聚合结果导出到 Excel,避免手动复制粘贴的方法,可以采用正则方式实现:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    // 示例结果片段
    {
    "key": "IT",
    "doc_count": 2371,
    "按照性别": {
    "doc_count_error_upper_bound": 0,
    "sum_other_doc_count": 0,
    "buckets": [
    {
    "key": 0,
    "key_as_string": "false",
    "doc_count": 2075
    },
    {
    "key": 1,
    "key_as_string": "true",
    "doc_count": 296
    }
    ]
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    //正则写法:
    \{
    "key" : "([^\n]+)",
    "doc_count" : (\d+),
    "按照性别" : \{
    "doc_count_error_upper_bound" : 0,
    "sum_other_doc_count" : 0,
    "buckets" : \[
    \{
    "key" : 0,
    "key_as_string" : "([^\n]+)",
    "doc_count" : (\d+)
    \},
    \{
    "key" : 1,
    "key_as_string" : "([^\n]+)",
    "doc_count" : (\d+)
    \}
    \]
    \}
    \}
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // 换行模式  CRLF pairs
    // 使用 $1 - $6 进行匹配
    // 结果输出为:

    IT -- 2371 -- false -- 2075 -- true -- 296
    US -- 1987 -- false -- 1738 -- true -- 249
    CN -- 1096 -- false -- 959 -- true -- 137
    CA -- 944 -- false -- 817 -- true -- 127
    JP -- 774 -- false -- 682 -- true -- 92

(四)结果输出

  • 报表制作:使用数据报表的形式,一般需要对查询结果进行聚合(aggregation),常见类别包含:文书类型、结案年度、地区等,尽可能在一次查询当中记录所有有用信息,减少重复劳动。
  • 数据验证:一般包含与官方历史数据验证、比例验证、逻辑分析,主要目的是确认是否存在与常理或业务不符情况,以及数据的可解释性。
  • 记录典型情形:总结不同要素典型情况,方便与客户汇报使用。

四、其他建议

  • 数据库的分库标准梳理:利用拆分子库,可以限定查询范围,减小查询语句编写难度。

  • 尽量避免因客户变更需求带来的重复性工作:

    • 将每个要素保存为一个单独的json查询语句方便复用;

    • 针对大类概念,导出成不同的index库进行数据固定;

    • 常见统计维度的一次性导出,大约需要 3 张表,例如:时间 + 地域 + 业务要素(组合切片)

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      ## 时间维度

      年度-1 -- 本年度总数 -- 文书类型 1 总数 -- 文书类型 2 总数 -- 各要素数量聚类 -- 各省份数量聚类

      ## 地域维度

      省份-1 -- 本省份总数 -- 文书类型 1 总数 -- 文书类型 2 总数 -- 各要素数量聚类 -- 各年度数量聚类

      ## 要素维度

      要素-1 -- 本要素总数 -- 文书类型 1 总数 -- 文书类型 2 总数 -- 各年度数量聚类 -- 各省份数量聚类

五、样例查询语句

一个典型的关键词查询语句:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
GET /kibana_sample_data/_search?size=10
{
"query": {
"bool": {
"must": [
{
"query_string": {
"default_field": "FIELD",
"query": "this AND that OR thus"
}
}
]
}
}
}


一个典型的聚合查询语句:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

GET /kibana_sample_data_flights/_search?size=0
{
"query": {
"match_all": {}
},
"aggs": { // 与querry块并列
"按条件聚合": {
"terms": {
"field": "FIELD", //会按照FIELD字段的值进行聚合并由高到低排序
"size": 10
}
}
}
}

一个典型组合查询语句逻辑结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
GET /kibana_sample_data/_search?size=10
{
"query": {//查询块
"bool": {
"should": [//列表当中满足任意一个即可匹配

{
"bool": {
"must": [
{}//包含的关键词部分
],"must_not": [
{}//排除的关键词部分
]
}
},

{
"bool": {
"must": [
{}//包含的法条部分
],"must_not": [
{}//排除的法条部分
]
}
}
],"minimum_should_match": 1
}
}

}