Openrefine:按 token/word 计数拆分多值单元格?

Openrefine: Split multi-valued cells by token/word count?

我正在为 document classification with MALLET using openrefine.

预处理大量文本数据

一些单元格很长(>150,000 个字符),我试图将它们分成 <1,000 word/token 个片段。

我可以使用 "Split multi-valued cells" 按字段长度将长单元格拆分为 6,000 个字符块,这大致可以转换为 1,000 word/token 个字符块,但它会跨行拆分单词,所以我'我丢失了一些数据。

有没有一个函数可以让我用每 6,000 个字符后的第一个空格 (" ") 拆分长单元格,或者更好的是,每 1,000 个单词拆分一次?

最简单的方法可能是按空格拆分文本,在每组 1000 个元素后插入一个非常罕见的字符(或一组字符),重新连接,然后使用 "Split multivalued cells"字符。

您可以在 GREL 中执行此操作,但选择 "Python/Jython" 作为脚本语言会更加清晰。

所以:编辑单元格 -> 变换 -> Python/Jython:

my_list = value.split(' ')

n = 1000
i = n
while i < len(my_list):
    my_list.insert(i, '|||')
    i+= (n+1)

return " ".join(my_list)

(有关此脚本的说明,请参阅

这是一个更紧凑的版本:

text = value.split(' ')
n = 1000
return "|||".join([' '.join(text[i:i+n]) for i in range(0,len(text),n)])

然后您可以使用 ||| 拆分作为分隔符。


如果您更喜欢按字符而不是单词来拆分,看起来您可以使用 textwrap 分两行进行拆分:

import textwrap

return "|||".join(textwrap.wrap(value, 6000))

这是我的简单解决方案:

转到编辑单元格 -> 转换并输入

value.replace(/((\s+\S+?){999})\s+/,"@@@")

这将用@@@替换每第1000个空格(连续的空格被计为一个,如果它们出现在分割边界则被替换)(你可以选择任何你喜欢的标记,只要它不出现在原文)。

转到编辑单元格 -> 拆分multi-valued 单元格 并使用标记@@@ 作为分隔符进行拆分。