You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用GREL在OpenRefine中提取关键词前后5句的非重复子串

用OpenRefine的GREL函数提取关键词前后句子并去重

完全可以通过OpenRefine的GREL函数实现这个需求,核心思路是先拆分文本为句子数组,定位关键词所在句子的索引,扩展前后范围后去重,最后拼接成结果。

具体GREL表达式

替换表达式中的"你的关键词"为你实际要匹配的关键词,根据文本的句子分隔符调整正则:

join(
  unique(
    flatten(
      foreach(
        filter(range(0, length(split(value, /[.!?]\s+/))), i, split(value, /[.!?]\s+/)[i].contains("你的关键词")),
        idx,
        range(max(0, idx - 5), min(length(split(value, /[.!?]\s+/)), idx + 6))
      )
    ).map(i, split(value, /[.!?]\s+/)[i])
  ),
  ". "
) + "."

表达式拆解

  1. 拆分句子:split(value, /[.!?]\s+/) 将单元格文本按「句号/感叹号/问号+空格」分割为句子数组,若处理中文文本,可改成/[。!?]\s+/适配中文标点,也可根据实际标点调整正则。
  2. 定位关键词索引:filter(...) 遍历所有句子的索引,筛选出包含关键词的句子位置。
  3. 扩展索引范围:foreach(...) 对每个关键词所在句子的索引,生成前后5个句子的索引区间(用max(0, ...)和min(...)避免索引越界,range是左闭右开规则,所以用idx+6才能包含第idx+5个句子)。
  4. 合并与去重:flatten() 把多个索引区间合并为一维数组,unique() 去除重复的句子索引,避免重复提取同一句子。
  5. 拼接结果:map() 根据去重后的索引取出对应句子,join() 用. 拼接句子,最后补全结尾句号。

额外调整建议

  • 若需忽略大小写匹配,将contains("你的关键词")改为toLowerCase(split(value, /[.!?]\s+/)[i]).contains(toLowerCase("你的关键词"))。
  • 若文本含换行符,可先在拆分前处理:split(replace(value, /\n+/, " "), /[.!?]\s+/)。
  • 若句子分隔符有其他形式(比如括号、引号结尾),需修改拆分用的正则表达式。

内容的提问来源于stack exchange,提问作者py_newie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 19:52:15