安装 和 启动

win10

  • 下载包

  • 安装

    • 解压即可
  • 启动

    • 鼠标启动

      • 双击 openrefine.exe
      • 双击 refine.bat
    • 命令行

      1
      2
      3
      4
      5
      6
      
      # 方法一
      ./openrefine.exe                # 直接运行启动
      
      # 方法二
      # 打开cmd 命令,注意不能是powershell 内部启动cmd.exe
      .\refine.bat
        • 注意启动失败,打印结果
  • 注意

    • 退出步骤

      1. 关闭所有打开的浏览器标签
      2. 关闭命令行

启动配置

  • 参考:modifications-set-within-files
  • openrefine.exe

    • 使用 openrefine.ini 文件

       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      
      # initial memory heap size
      -Xms256M
      
      # max memory memory heap size
      -Xmx1024M
      
      # Use system defined HTTP proxies
      -Djava.net.useSystemProxies=true
      
      #-XX:+UseLargePages
      #-Dsomevar="%SOMEVAR%"
      
      # 文件存放目录
      # -Drefine.data_dir=
      
      # ip 绑定设置
      -Drefine.host=0.0.0.0
      
      # 端口设置
      # -Drefine.port=3333
  • refine.bat

    • 使用 refine.ini 文件

      1
      2
      3
      
      #REFINE_PORT=3333
      #REFINE_HOST=127.0.0.1
      REFINE_HOST=0.0.0.0

启动失败案例

  • 特征

    • 闪退
    • 任务管理器看不到没有退出进程(refine 和 openrefine)
  • 原因

    • 端口占用(3333 端口),无法启动
    • 上一次启动失败,没有完全退出
  • 解决方法

    • 打开 Resource Monitor -> Network -> Listening Ports
    • 查看占用程序 PID
    • 杀进程

      • taskkill /pid <find-pid> /f

术语

  • facet

    • 翻译:N.方面 Vt.在……上琢一个面
    • 实际意义(在 refine 中)

      • 聚类工具
      • 单一聚类方法

功能

  • 聚类
  • 数据探索
  • 数据变形和转换

Facet

Text Facet

  • 频率计数
  • 按 text 枚举值分组计数
  • 按枚举值筛选

numbercal facet

  • 按 [a, b], 值域筛选

Timeline facet

  • 日期范围 筛选

Scatterplot facet

  • 散点图绘制
  • 注意

    • 前提条件

      • 在没有做 filter/facet 筛选前,完成多列的 数字类型 转换
      • 要有多列数值类型
  • 作用

    • 绘制 X-Y 二维图像
    • 在图像上选择区域,实现筛选

Expression

Python/Jython 语法

  • 例子

    1
    2
    
    import re                                       # 直接导入
    return [i for i in eval(value) if 'noise' in i] # 最终值
    • 强制格式

      • 最后一个语句必须带 return
    • 特殊标识符

      value
      当前单元格
      cells['column_name'].value
      任意单元格
      row.columnNames[5]
      第五列列名

grel, General Refine Expression Language

Reconciling

  • 与外部资源(数据)协调操作

    • 纠错
    • 改成官方写法
    • 链接到外部数据
    • 上传到类似 wikidata 的可编辑数据平台
  • 外部资源类型

    • 个人处理好的数据集
    • wikidata 数据 (来源于 wikibase 项目)
    • 权威机构编纂的数据(图书馆、学术机构、科学机构、……)
  • 外部资源要求

  • 参考

启动

添加 python path

方法一: 手动法

  1. 使用 refine.bat, 获取 java … refine 启动命令
  2. 添加 -Dpython.path

    • 多个路径分隔符,windows (";"), linux (":")
  3. windows 下举例:

    1
    
    "D:\soft\java\jdk-11.0.7\bin\java.exe" -cp "server\classes;server\target\lib\*" -Dpython.path="main/webapp/WEB-INF/lib/jython;d:/soft/miniconda3/envs/py27/Lib/site-packages"  -Xms1400M -Xmx1400M -Drefine.memory=1400M -Drefine.max_form_content_size=1048576 -Drefine.port=3334 -Drefine.host=0.0.0.0 -Drefine.webapp=main\webapp -Djava.library.path=server\target\lib/native/windows com.google.refine.Refine

方法二: 修改环境变量法

配置环境变量 JYTHONPATH

  • 类似 PATH 变量格式

linux 启动

1
JYTHONPATH="main/webapp/WEB-INF/lib/jython:/home/sawyer//miniconda3/envs/py27/lib/python2.7/site-packages"  PYTHONIOENCODING='utf-8' /opt/openrefine/refine run

实用代码

repr 对象处理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
def object_decoder(obj):
    if not isinstance(obj, (set, dict, list, tuple, str)):
        return obj

    if isinstance(obj, str):
        return str.decode('utf-8')

    if isinstance(obj, (set, tuple, list)):
        return type(obj)(object_decoder(i) for i in obj)

    if isinstance(obj, dict):
        return {object_decoder(k): object_decoder(v) for k, v in obj.iteritems()}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
def object_decoder(obj):
    if isinstance(obj, str):
        return obj.decode('utf-8')

    if isinstance(obj, (set, tuple, list)):
        return type(obj)(object_decoder(i) for i in obj)

    if isinstance(obj, dict):
        return {object_decoder(k): object_decoder(v) for k, v in obj.iteritems()}
    return obj


def ueval(obj):
    return object_decoder(eval(obj))

urepr

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
def object_encoder(obj):
    if isinstance(obj, unicode):
        return obj.encode('utf-8')

    if isinstance(obj, (set, tuple, list)):
        return type(obj)(object_encoder(i) for i in obj)

    if isinstance(obj, dict):
        return {object_encoder(k): object_encoder(v) for k, v in obj.iteritems()}

    return obj


def urepr(obj):
    # return repr(object_encoder(obj)).decode('utf-8')
    return repr(object_encoder(obj)).decode('string-escape')
 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
32
33
34
35
36
37
def object_decoder(obj):
    if isinstance(obj, str):
        return obj.decode('utf-8')

    if isinstance(obj, (set, tuple, list)):
        return type(obj)(object_decoder(i) for i in obj)

    if isinstance(obj, dict):
        return {object_decoder(k): object_decoder(v) for k, v in obj.iteritems()}
    return obj

def object_encoder(obj):
    if isinstance(obj, unicode):
        return obj.encode('utf-8')

    if isinstance(obj, (set, tuple, list)):
        return type(obj)(object_encoder(i) for i in obj)

    if isinstance(obj, dict):
        return {object_encoder(k): object_encoder(v) for k, v in obj.iteritems()}

    return obj

def ujdumps(obj):
    import json
    return json.dumps(object_decoder(obj), ensure_ascii=False)

def ujloads(obj):
    import json
    return json.loads(obj)

def ueval(obj):
    return object_decoder(eval(obj))

def urepr(obj):
    # return repr(object_encoder(obj)).decode('utf-8')
    return repr(object_encoder(obj)).decode('string-escape')
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
class MyStr(str):
    def __repr__(self, *args, **kwargs):
        return super(MyStr, self).__str__(*args, **kwargs)


def str_converter(obj):
    if isinstance(obj, str):
        return MyStr(obj)

    if isinstance(obj, (set, tuple, list)):
        return type(obj)(str_converter(i) for i in obj)

    if isinstance(obj, dict):
        return {str_converter(k): str_converter(v) for k, v in obj.iteritems()}
    return obj

自动化

作用: 外部 client 参考: Running OpenRefine | OpenRefine