Openrefine:通过令牌/字数分割多值单元格?

时间:2018-04-05 02:56:52

标签: nlp openrefine

我有一大堆文本数据,我正在使用document classification with MALLETopenrefine进行预处理。

有些单元格很长(> 150,000个字符),我正在尝试将它们拆分为< 1,000个字/令牌段。

我可以使用字段长度的“拆分多值单元格”将长单元格拆分为6,000个字符块,这大致可以转换为1,000个单词/标记块,但是它会跨行分割单词,所以我输了我的一些数据。

是否有一个函数可以用来在每第6,000个字符后用第一个空格(“”)分割长单元格,甚至更好,每1,000个单词分割一次?

2 个答案:

答案 0 :(得分:2)

这是我的简单解决方案:

转到修改单元格 - > 转换并输入

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

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

转到修改单元格 - > 拆分多值单元格并使用令牌@@@作为分隔符进行拆分。

答案 1 :(得分:1)

最简单的方法可能是用空格分割你的文字,在每组1000个元素之后插入一个非常罕见的字符(或一组字符),以便进行协调,然后用你的怪异角色使用“拆分多值单元格”(或多个)。

你可以在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)

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

这是一个更紧凑的版本:

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))