如何用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]) ), ". " ) + "."
表达式拆解
- 拆分句子:
split(value, /[.!?]\s+/)将单元格文本按「句号/感叹号/问号+空格」分割为句子数组,若处理中文文本,可改成/[。!?]\s+/适配中文标点,也可根据实际标点调整正则。 - 定位关键词索引:
filter(...)遍历所有句子的索引,筛选出包含关键词的句子位置。 - 扩展索引范围:
foreach(...)对每个关键词所在句子的索引,生成前后5个句子的索引区间(用max(0, ...)和min(...)避免索引越界,range是左闭右开规则,所以用idx+6才能包含第idx+5个句子)。 - 合并与去重:
flatten()把多个索引区间合并为一维数组,unique()去除重复的句子索引,避免重复提取同一句子。 - 拼接结果:
map()根据去重后的索引取出对应句子,join()用.拼接句子,最后补全结尾句号。
额外调整建议
- 若需忽略大小写匹配,将
contains("你的关键词")改为toLowerCase(split(value, /[.!?]\s+/)[i]).contains(toLowerCase("你的关键词"))。 - 若文本含换行符,可先在拆分前处理:
split(replace(value, /\n+/, " "), /[.!?]\s+/)。 - 若句子分隔符有其他形式(比如括号、引号结尾),需修改拆分用的正则表达式。
内容的提问来源于stack exchange,提问作者py_newie
相关产品推荐
相关产品推荐

